From 250867ddb37847b34295f77f25664ac8c5aa3685 Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Sun, 18 Apr 2010 18:20:33 +0000 Subject: [PATCH 001/131] Samuel Serapion - Assorted rbuild syntax fixes. svn path=/trunk/; revision=46927 --- .../base/applications/cmdutils/reg/reg.rbuild | 2 + .../applications/downloader/downloader.rbuild | 43 ++++++++++--------- .../applications/fontview/fontview.rbuild | 2 + .../applications/kbswitch/kbswitch.rbuild | 1 + .../base/applications/magnify/magnify.rbuild | 2 +- .../base/applications/mplay32/mplay32.rbuild | 2 + .../mscutils/eventvwr/eventvwr.rbuild | 3 +- reactos/base/applications/rapps/rapps.rbuild | 2 + .../base/applications/winver/winver.rbuild | 2 + reactos/base/services/rpcss/rpcss.rbuild | 2 +- reactos/base/services/telnetd/telnetd.rbuild | 2 + reactos/base/services/tftpd/tftpd.rbuild | 4 +- reactos/base/system/runonce/runonce.rbuild | 2 + reactos/boot/bootdata/bootcd/bootcd.rbuild | 6 ++- reactos/boot/bootdata/livecd/livecd.rbuild | 6 ++- .../boot/freeldr/freeldr/freeldr_arch.rbuild | 2 +- reactos/dll/win32/actxprxy/actxprxy.rbuild | 3 +- reactos/dll/win32/msacm32/msacm32.rbuild | 2 +- reactos/drivers/bus/acpi/acpi.rbuild | 3 +- 19 files changed, 55 insertions(+), 36 deletions(-) diff --git a/reactos/base/applications/cmdutils/reg/reg.rbuild b/reactos/base/applications/cmdutils/reg/reg.rbuild index ce9a744808d..ac33ef4fd0b 100644 --- a/reactos/base/applications/cmdutils/reg/reg.rbuild +++ b/reactos/base/applications/cmdutils/reg/reg.rbuild @@ -1,3 +1,5 @@ + + . 0x600 diff --git a/reactos/base/applications/downloader/downloader.rbuild b/reactos/base/applications/downloader/downloader.rbuild index 9ea43dc81f4..b45df064ce0 100644 --- a/reactos/base/applications/downloader/downloader.rbuild +++ b/reactos/base/applications/downloader/downloader.rbuild @@ -1,25 +1,26 @@ - - downloader.xml - - . - . + + +downloader.xml + + . + . - advapi32 - ntdll - user32 - gdi32 - shell32 - comctl32 - msimg32 - shlwapi - urlmon - uuid - expat + advapi32 + ntdll + user32 + gdi32 + shell32 + comctl32 + msimg32 + shlwapi + urlmon + uuid + expat - main.c - xml.c - download.c - downloader.rc - + main.c + xml.c + download.c + downloader.rc + diff --git a/reactos/base/applications/fontview/fontview.rbuild b/reactos/base/applications/fontview/fontview.rbuild index 8ceda786c4b..f5cad36f1a9 100644 --- a/reactos/base/applications/fontview/fontview.rbuild +++ b/reactos/base/applications/fontview/fontview.rbuild @@ -1,3 +1,5 @@ + + . gdi32 diff --git a/reactos/base/applications/kbswitch/kbswitch.rbuild b/reactos/base/applications/kbswitch/kbswitch.rbuild index 2eed0b22bb0..11ea960adae 100644 --- a/reactos/base/applications/kbswitch/kbswitch.rbuild +++ b/reactos/base/applications/kbswitch/kbswitch.rbuild @@ -1,4 +1,5 @@ + . diff --git a/reactos/base/applications/magnify/magnify.rbuild b/reactos/base/applications/magnify/magnify.rbuild index 995437d3826..8c06ce8e5bf 100644 --- a/reactos/base/applications/magnify/magnify.rbuild +++ b/reactos/base/applications/magnify/magnify.rbuild @@ -1,5 +1,5 @@ - + . user32 diff --git a/reactos/base/applications/mplay32/mplay32.rbuild b/reactos/base/applications/mplay32/mplay32.rbuild index c472e6f0207..77003d90898 100644 --- a/reactos/base/applications/mplay32/mplay32.rbuild +++ b/reactos/base/applications/mplay32/mplay32.rbuild @@ -1,3 +1,5 @@ + + . advapi32 diff --git a/reactos/base/applications/mscutils/eventvwr/eventvwr.rbuild b/reactos/base/applications/mscutils/eventvwr/eventvwr.rbuild index 367c19e5bb4..cb23e1f3eef 100644 --- a/reactos/base/applications/mscutils/eventvwr/eventvwr.rbuild +++ b/reactos/base/applications/mscutils/eventvwr/eventvwr.rbuild @@ -1,5 +1,5 @@ - + . user32 @@ -8,4 +8,3 @@ eventvwr.c eventvwr.rc - diff --git a/reactos/base/applications/rapps/rapps.rbuild b/reactos/base/applications/rapps/rapps.rbuild index 066b3ba7a9b..bc83f3aade9 100644 --- a/reactos/base/applications/rapps/rapps.rbuild +++ b/reactos/base/applications/rapps/rapps.rbuild @@ -1,3 +1,5 @@ + + include/reactos diff --git a/reactos/base/applications/winver/winver.rbuild b/reactos/base/applications/winver/winver.rbuild index 89ff51c8ce4..4f24a7166bd 100644 --- a/reactos/base/applications/winver/winver.rbuild +++ b/reactos/base/applications/winver/winver.rbuild @@ -1,3 +1,5 @@ + + . shell32 diff --git a/reactos/base/services/rpcss/rpcss.rbuild b/reactos/base/services/rpcss/rpcss.rbuild index 04e42f81de9..95b29e83210 100644 --- a/reactos/base/services/rpcss/rpcss.rbuild +++ b/reactos/base/services/rpcss/rpcss.rbuild @@ -1,5 +1,5 @@ - + . diff --git a/reactos/base/services/telnetd/telnetd.rbuild b/reactos/base/services/telnetd/telnetd.rbuild index 8ccb81d2004..1b17bfcb83f 100644 --- a/reactos/base/services/telnetd/telnetd.rbuild +++ b/reactos/base/services/telnetd/telnetd.rbuild @@ -1,3 +1,5 @@ + + .. diff --git a/reactos/base/services/tftpd/tftpd.rbuild b/reactos/base/services/tftpd/tftpd.rbuild index be34bb7f3ab..0008cfb287e 100644 --- a/reactos/base/services/tftpd/tftpd.rbuild +++ b/reactos/base/services/tftpd/tftpd.rbuild @@ -1,11 +1,11 @@ + + .. - ntdll advapi32 ws2_32 wine - tftpd.cpp diff --git a/reactos/base/system/runonce/runonce.rbuild b/reactos/base/system/runonce/runonce.rbuild index 950580d56ad..9dba7660b1c 100644 --- a/reactos/base/system/runonce/runonce.rbuild +++ b/reactos/base/system/runonce/runonce.rbuild @@ -1,3 +1,5 @@ + + . advapi32 diff --git a/reactos/boot/bootdata/bootcd/bootcd.rbuild b/reactos/boot/bootdata/bootcd/bootcd.rbuild index 471a7f4863e..f84fa71372b 100644 --- a/reactos/boot/bootdata/bootcd/bootcd.rbuild +++ b/reactos/boot/bootdata/bootcd/bootcd.rbuild @@ -1,12 +1,14 @@ - + isoboot - isoboot + diff --git a/reactos/boot/bootdata/livecd/livecd.rbuild b/reactos/boot/bootdata/livecd/livecd.rbuild index e92deca42ce..8a04d1289bc 100644 --- a/reactos/boot/bootdata/livecd/livecd.rbuild +++ b/reactos/boot/bootdata/livecd/livecd.rbuild @@ -1,12 +1,14 @@ - + isoboot - isoboot + diff --git a/reactos/boot/freeldr/freeldr/freeldr_arch.rbuild b/reactos/boot/freeldr/freeldr/freeldr_arch.rbuild index 2b8a8b288ab..6aa231c258a 100644 --- a/reactos/boot/freeldr/freeldr/freeldr_arch.rbuild +++ b/reactos/boot/freeldr/freeldr/freeldr_arch.rbuild @@ -1,5 +1,5 @@ - + include cache diff --git a/reactos/dll/win32/actxprxy/actxprxy.rbuild b/reactos/dll/win32/actxprxy/actxprxy.rbuild index f5272b585cf..c8b28ca5891 100644 --- a/reactos/dll/win32/actxprxy/actxprxy.rbuild +++ b/reactos/dll/win32/actxprxy/actxprxy.rbuild @@ -31,7 +31,6 @@ actxprxy_ocmm.idl actxprxy_servprov.idl - actxprxy_urlhist.idl - + actxprxy_urlhist.idl diff --git a/reactos/dll/win32/msacm32/msacm32.rbuild b/reactos/dll/win32/msacm32/msacm32.rbuild index df9cb0340ef..b6f802ee5bb 100644 --- a/reactos/dll/win32/msacm32/msacm32.rbuild +++ b/reactos/dll/win32/msacm32/msacm32.rbuild @@ -1,6 +1,6 @@ - + . diff --git a/reactos/drivers/bus/acpi/acpi.rbuild b/reactos/drivers/bus/acpi/acpi.rbuild index c3e5b7dac90..334cdfc7024 100644 --- a/reactos/drivers/bus/acpi/acpi.rbuild +++ b/reactos/drivers/bus/acpi/acpi.rbuild @@ -10,7 +10,7 @@ - + @@ -36,3 +36,4 @@ buspdo.c main.c + From a3e472b248c3954f41ca136d72ab9972811c2868 Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Sun, 18 Apr 2010 18:22:29 +0000 Subject: [PATCH 002/131] Samuel Serapion - Add IdlInterface module type. svn path=/trunk/; revision=46928 --- reactos/tools/sysgen/RosFramework/RBuildModule.cs | 15 ++++++++++----- .../SysGen.BuildEngine/Tasks/RBuild/ModuleTask.cs | 1 + 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/reactos/tools/sysgen/RosFramework/RBuildModule.cs b/reactos/tools/sysgen/RosFramework/RBuildModule.cs index f7fcb2f504d..df4f0aa0720 100644 --- a/reactos/tools/sysgen/RosFramework/RBuildModule.cs +++ b/reactos/tools/sysgen/RosFramework/RBuildModule.cs @@ -224,6 +224,7 @@ namespace SysGen.RBuild.Framework case ModuleType.Alias: case ModuleType.BootProgram: case ModuleType.IdlHeader: + case ModuleType.IdlInterface: case ModuleType.MessageHeader: case ModuleType.Package: case ModuleType.ModuleGroup: @@ -234,7 +235,7 @@ namespace SysGen.RBuild.Framework case ModuleType.Cabinet: return ".cab"; default: - throw new Exception("Unknown module type"); + throw new Exception("Unknown Module Type: " + Type.ToString()); } } } @@ -431,6 +432,7 @@ namespace SysGen.RBuild.Framework case ModuleType.RpcProxy: case ModuleType.Alias: case ModuleType.IdlHeader: + case ModuleType.IdlInterface: case ModuleType.MessageHeader: case ModuleType.EmbeddedTypeLib: case ModuleType.Cabinet: @@ -439,7 +441,7 @@ namespace SysGen.RBuild.Framework case ModuleType.PlatformProfile: return false; default: - throw new Exception("Unknown Module Type"); + throw new Exception("Unknown Module Type: " + Type.ToString()); } } } @@ -479,6 +481,7 @@ namespace SysGen.RBuild.Framework case ModuleType.RpcProxy: case ModuleType.Alias: case ModuleType.IdlHeader: + case ModuleType.IdlInterface: case ModuleType.MessageHeader: case ModuleType.EmbeddedTypeLib: case ModuleType.Cabinet: @@ -487,7 +490,7 @@ namespace SysGen.RBuild.Framework case ModuleType.PlatformProfile: return false; default: - throw new Exception("Unknown Module Type"); + throw new Exception("Unknown Module Type: " + Type.ToString()); } } } @@ -531,6 +534,7 @@ namespace SysGen.RBuild.Framework case ModuleType.Alias: case ModuleType.BootProgram: case ModuleType.IdlHeader: + case ModuleType.IdlInterface: case ModuleType.MessageHeader: case ModuleType.EmbeddedTypeLib: case ModuleType.Cabinet: @@ -539,7 +543,7 @@ namespace SysGen.RBuild.Framework case ModuleType.PlatformProfile: return string.Empty; default: - throw new Exception("Unknown Module Type"); + throw new Exception("Unknown Module Type: " + Type.ToString()); } } } @@ -593,6 +597,7 @@ namespace SysGen.RBuild.Framework case ModuleType.Alias: case ModuleType.BootProgram: case ModuleType.IdlHeader: + case ModuleType.IdlInterface: case ModuleType.MessageHeader: case ModuleType.EmbeddedTypeLib: case ModuleType.Cabinet: @@ -601,7 +606,7 @@ namespace SysGen.RBuild.Framework case ModuleType.PlatformProfile: return string.Empty; default: - throw new Exception("Unknown Module Type"); + throw new Exception("Unknown Module Type: " + Type.ToString()); } } } diff --git a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/ModuleTask.cs b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/ModuleTask.cs index 1a790f41d11..ba9b2e09d58 100644 --- a/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/ModuleTask.cs +++ b/reactos/tools/sysgen/SysGen.BuildEngine/Tasks/RBuild/ModuleTask.cs @@ -176,6 +176,7 @@ namespace SysGen.BuildEngine.Tasks (Module.Type == ModuleType.BootSector) || (Module.Type == ModuleType.EmbeddedTypeLib) || (Module.Type == ModuleType.IdlHeader) || + (Module.Type == ModuleType.IdlInterface) || (Module.Type == ModuleType.Kernel) || (Module.Type == ModuleType.KernelModeDLL) || (Module.Type == ModuleType.KernelModeDriver) || From 57020ab2e3bc2e81bc0264885d82545ad6b6c85f Mon Sep 17 00:00:00 2001 From: Matthias Kupfer Date: Sun, 18 Apr 2010 23:02:14 +0000 Subject: [PATCH 003/131] - Once again, fix INF files svn path=/trunk/; revision=46929 --- reactos/media/inf/cpu.inf | Bin 18186 -> 18186 bytes reactos/media/inf/hdc.inf | Bin 83158 -> 83156 bytes reactos/media/inf/machine.inf | Bin 45620 -> 45686 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/reactos/media/inf/cpu.inf b/reactos/media/inf/cpu.inf index bc2517dcaa0b033934898b49310ad15b7598b138..087ab209a62bbb576bcdd7d96e6af75c4ca0e27d 100644 GIT binary patch delta 19 acmeC`W9;f<+@PVv$h%ox>AngR7Xtu3odre! delta 19 acmeC`W9;f<+@PVfSxf1j3d{e0Tnqq7GzU2V diff --git a/reactos/media/inf/hdc.inf b/reactos/media/inf/hdc.inf index a3fd5a9b0d2ee4c8bdb10e6ed137c266c3c5638e..78983c57d44b0bd4cbf4e11b538c0d829962a3cb 100644 GIT binary patch delta 14 VcmccC$$F)ewP6e6B^M?x1^_S21s(tZ delta 16 Xcmcc8$$G7mwP6e6B^Q?e|F{?cK<)<} diff --git a/reactos/media/inf/machine.inf b/reactos/media/inf/machine.inf index ecc90375e8d1de8d54b6cc66e14fa58f09e17e72..0ac8b68bef8218df882eccd6a9571bae7e364a57 100644 GIT binary patch delta 66 zcmV-I0KNaT*%VfQST>fCU(nP#y@A)*IH7c$N;5m;|%D Y92^{zyc{T!IU18-D=4x#EO`P7067>J5dZ)H delta 38 scmezNglWqYrVV+ln+sSi#5S*zW@FsENk&Izvw~$vCCC4NAjri407QNfIsgCw From cab24c4645160e28106cad7ed5ed50db290b909a Mon Sep 17 00:00:00 2001 From: Daniel Reimer Date: Sun, 18 Apr 2010 23:16:10 +0000 Subject: [PATCH 004/131] Update winhlp32 to Wine 1.1.43 svn path=/trunk/; revision=46931 --- reactos/base/applications/winhlp32/hlpfile.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/base/applications/winhlp32/hlpfile.c b/reactos/base/applications/winhlp32/hlpfile.c index 2d685ae493a..7031c760670 100644 --- a/reactos/base/applications/winhlp32/hlpfile.c +++ b/reactos/base/applications/winhlp32/hlpfile.c @@ -492,7 +492,7 @@ static int comp_FindSubFile(void *p, const void *key, int leaf, void** next) { *next = (char *)p+strlen(p)+(leaf?5:3); - WINE_TRACE("Comparing '%s' with '%s'\n", (char *)p, (char *)key); + WINE_TRACE("Comparing '%s' with '%s'\n", (char *)p, (const char *)key); return strcmp(p, key); } @@ -1601,7 +1601,7 @@ static BOOL HLPFILE_BrowseParagraph(HLPFILE_PAGE* page, struct RtfData* rd, case 0xEE: case 0xEF: { - char* ptr = (char*) format + 8; + const char* ptr = (const char*) format + 8; BYTE type = format[3]; int wnd = -1; From 9403f80947e721dfb72073f79b8106990ab4920c Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Mon, 19 Apr 2010 14:03:42 +0000 Subject: [PATCH 005/131] - Sync activeds, atl, avifil32, cabinet to Wine-1.1.43. svn path=/trunk/; revision=46938 --- reactos/dll/win32/activeds/activeds.spec | 2 +- reactos/dll/win32/activeds/activeds_main.c | 9 +++++++++ reactos/dll/win32/atl/atl_ax.c | 2 +- reactos/dll/win32/avifil32/rsrc.rc | 6 +----- reactos/dll/win32/cabinet/fdi.c | 4 ++-- reactos/dll/win32/ole32/compobj.c | 2 +- reactos/include/psdk/objbase.h | 10 +++++----- reactos/include/psdk/winnt.h | 8 ++++++++ 8 files changed, 28 insertions(+), 15 deletions(-) diff --git a/reactos/dll/win32/activeds/activeds.spec b/reactos/dll/win32/activeds/activeds.spec index 63625d5d022..2b458342493 100644 --- a/reactos/dll/win32/activeds/activeds.spec +++ b/reactos/dll/win32/activeds/activeds.spec @@ -6,7 +6,7 @@ 8 stub ADsBuildVarArrayInt 9 stdcall ADsOpenObject(wstr wstr wstr long ptr ptr) 12 stub ADsSetLastError -13 stub ADsGetLastError +13 stdcall ADsGetLastError(ptr ptr long ptr long) 14 stub AllocADsMem 15 stdcall FreeADsMem(ptr) 16 stub ReallocADsMem diff --git a/reactos/dll/win32/activeds/activeds_main.c b/reactos/dll/win32/activeds/activeds_main.c index 9c03ac16d68..2fa4ec73d80 100644 --- a/reactos/dll/win32/activeds/activeds_main.c +++ b/reactos/dll/win32/activeds/activeds_main.c @@ -94,6 +94,15 @@ HRESULT WINAPI ADsOpenObject(LPCWSTR lpszPathName, LPCWSTR lpszUserName, LPCWSTR return E_NOTIMPL; } +/***************************************************** + * ADsGetLastError [ACTIVEDS.13] + */ +HRESULT WINAPI ADsGetLastError(LPDWORD perror, LPWSTR errorbuf, DWORD errorbuflen, LPWSTR namebuf, DWORD namebuflen) +{ + FIXME("(%p,%p,%d,%p,%d)!stub\n", perror, errorbuf, errorbuflen, namebuf, namebuflen); + return E_NOTIMPL; +} + /***************************************************** * FreeADsMem [ACTIVEDS.15] */ diff --git a/reactos/dll/win32/atl/atl_ax.c b/reactos/dll/win32/atl/atl_ax.c index 2afc7460328..616713ce62b 100644 --- a/reactos/dll/win32/atl/atl_ax.c +++ b/reactos/dll/win32/atl/atl_ax.c @@ -950,7 +950,7 @@ HRESULT WINAPI AtlAxCreateControlEx(LPCOLESTR lpszName, HWND hWnd, TRACE("(%s %p %p %p %p %p %p)\n", debugstr_w(lpszName), hWnd, pStream, ppUnkContainer, ppUnkControl, iidSink, punkSink); - hRes = CLSIDFromString( (LPOLESTR) lpszName, &controlId ); + hRes = CLSIDFromString( lpszName, &controlId ); if ( FAILED(hRes) ) hRes = CLSIDFromProgID( lpszName, &controlId ); if ( SUCCEEDED( hRes ) ) diff --git a/reactos/dll/win32/avifil32/rsrc.rc b/reactos/dll/win32/avifil32/rsrc.rc index d86578c5a6b..b13fcb93e42 100644 --- a/reactos/dll/win32/avifil32/rsrc.rc +++ b/reactos/dll/win32/avifil32/rsrc.rc @@ -1,7 +1,7 @@ /* * Top level resource file for avifil32.dll * - * Copyright 2002 Michael Gnnewig + * Copyright 2002 Michael Günnewig * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -18,10 +18,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "windef.h" -#include "winbase.h" -#include "winuser.h" -#include "winver.h" #include "avifile_private.h" LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL diff --git a/reactos/dll/win32/cabinet/fdi.c b/reactos/dll/win32/cabinet/fdi.c index de64f025bd3..b68ab15acd8 100644 --- a/reactos/dll/win32/cabinet/fdi.c +++ b/reactos/dll/win32/cabinet/fdi.c @@ -77,7 +77,7 @@ THOSE_ZIP_CONSTS; struct fdi_file { struct fdi_file *next; /* next file in sequence */ - LPCSTR filename; /* output name of file */ + LPSTR filename; /* output name of file */ int fh; /* open file handle or NULL */ cab_ULONG length; /* uncompressed length of file */ cab_ULONG offset; /* uncompressed offset in folder */ @@ -2301,7 +2301,7 @@ static void free_decompression_mem(HFDI hfdi, } while (CAB(firstfile)) { file = CAB(firstfile); - if (file->filename) PFDI_FREE(hfdi, (void *)file->filename); + if (file->filename) PFDI_FREE(hfdi, file->filename); CAB(firstfile) = CAB(firstfile)->next; PFDI_FREE(hfdi, file); } diff --git a/reactos/dll/win32/ole32/compobj.c b/reactos/dll/win32/ole32/compobj.c index 12f83146113..0625c0b8949 100644 --- a/reactos/dll/win32/ole32/compobj.c +++ b/reactos/dll/win32/ole32/compobj.c @@ -1566,7 +1566,7 @@ static HRESULT __CLSIDFromString(LPCWSTR s, CLSID *id) /*****************************************************************************/ -HRESULT WINAPI CLSIDFromString(LPOLESTR idstr, CLSID *id ) +HRESULT WINAPI CLSIDFromString(LPCOLESTR idstr, LPCLSID id ) { HRESULT ret; diff --git a/reactos/include/psdk/objbase.h b/reactos/include/psdk/objbase.h index 57da913bf51..e9295de6cf3 100644 --- a/reactos/include/psdk/objbase.h +++ b/reactos/include/psdk/objbase.h @@ -225,10 +225,9 @@ #define THIS void #define interface struct -#define DECLARE_INTERFACE(iface) interface iface -#define DECLARE_INTERFACE_(iface,ibase) interface iface : public ibase -#define DECLARE_INTERFACE_IID(iface, iid) interface DECLSPEC_UUID(iid) iface -#define DECLARE_INTERFACE_IID_(iface, baseiface, iid) interface DECLSPEC_UUID(iid) iface : public baseiface +#define DECLARE_INTERFACE(iface) interface DECLSPEC_NOVTABLE iface +#define DECLARE_INTERFACE_(iface,ibase) interface DECLSPEC_NOVTABLE iface : public ibase +#define DECLARE_INTERFACE_IID_(iface, ibase, iid) interface DECLSPEC_UUID(iid) DECLSPEC_NOVTABLE iface : public ibase #define BEGIN_INTERFACE #define END_INTERFACE @@ -268,6 +267,7 @@ struct iface##Vtbl #endif #define DECLARE_INTERFACE_(iface,ibase) DECLARE_INTERFACE(iface) +#define DECLARE_INTERFACE_IID_(iface, ibase, iid) DECLARE_INTERFACE_(iface, ibase) #define BEGIN_INTERFACE #define END_INTERFACE @@ -431,7 +431,7 @@ HRESULT WINAPI CoWaitForMultipleHandles(DWORD dwFlags,DWORD dwTimeout,ULONG cHan * GUID API */ HRESULT WINAPI StringFromCLSID(REFCLSID id, LPOLESTR*); -HRESULT WINAPI CLSIDFromString(LPOLESTR, CLSID *); +HRESULT WINAPI CLSIDFromString(LPCOLESTR, LPCLSID); HRESULT WINAPI CLSIDFromProgID(LPCOLESTR progid, LPCLSID riid); HRESULT WINAPI ProgIDFromCLSID(REFCLSID clsid, LPOLESTR *lplpszProgID); diff --git a/reactos/include/psdk/winnt.h b/reactos/include/psdk/winnt.h index f856b079970..66c94b21d6d 100644 --- a/reactos/include/psdk/winnt.h +++ b/reactos/include/psdk/winnt.h @@ -63,6 +63,14 @@ extern "C" { #define UNALIGNED #endif +#ifndef DECLSPEC_NOVTABLE +# if defined(_MSC_VER) && (_MSC_VER >= 1100) && defined(__cplusplus) +# define DECLSPEC_NOVTABLE __declspec(novtable) +# else +# define DECLSPEC_NOVTABLE +# endif +#endif + #ifndef DECLSPEC_ADDRSAFE #if (_MSC_VER >= 1200) && (defined(_M_ALPHA) || defined(_M_AXP64)) #define DECLSPEC_ADDRSAFE __declspec(address_safe) From 7c4b750a575a00d066a0c1f01160d86f59c05906 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Mon, 19 Apr 2010 15:41:21 +0000 Subject: [PATCH 006/131] Revert r46582, to see if it fixes the regtests svn path=/trunk/; revision=46942 --- reactos/include/ddk/ntddk.h | 5574 ++++++++------------------------- reactos/include/ddk/ntifs.h | 4747 ++++++++++++++-------------- reactos/include/ddk/ntimage.h | 17 +- reactos/include/ddk/wdm.h | 5380 ++++++------------------------- reactos/include/ndk/ketypes.h | 23 + 5 files changed, 4780 insertions(+), 10961 deletions(-) diff --git a/reactos/include/ddk/ntddk.h b/reactos/include/ddk/ntddk.h index fdd99d9f7ef..62c1f7873f1 100644 --- a/reactos/include/ddk/ntddk.h +++ b/reactos/include/ddk/ntddk.h @@ -1,13 +1,12 @@ /* * ntddk.h * - * Windows NT Device Driver Kit + * Windows Device Driver Kit * - * This file is part of the ReactOS DDK package. + * This file is part of the w32api package. * * Contributors: - * Amine Khaldi - * Timo Kreuzer (timo.kreuzer@reactos.org) + * Created by Casper S. Hornstrup * * THIS SOFTWARE IS NOT COPYRIGHTED * @@ -19,10 +18,13 @@ * DISCLAIMED. This includes but is not limited to warranties of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * + * DEFINES: + * DBG - Debugging enabled/disabled (0/1) + * POOL_TAGGING - Enable pool tagging + * _X86_ - X86 environment */ -#pragma once - +#ifndef _NTDDK_ #define _NTDDK_ #if !defined(_NTHAL_) && !defined(_NTIFS_) @@ -39,7 +41,6 @@ #include #include #include -#include /* FIXME #include @@ -54,128 +55,41 @@ extern "C" { #endif -/* GUID and UUID */ -#ifndef _NTLSA_IFS_ -#ifndef _NTLSA_AUDIT_ -#define _NTLSA_AUDIT_ - -#ifndef GUID_DEFINED -#include -#endif - -#endif /* _NTLSA_AUDIT_ */ -#endif /* _NTLSA_IFS_ */ - -typedef GUID UUID; - struct _LOADER_PARAMETER_BLOCK; struct _CREATE_DISK; struct _DRIVE_LAYOUT_INFORMATION_EX; struct _SET_PARTITION_INFORMATION_EX; -typedef struct _BUS_HANDLER *PBUS_HANDLER; -typedef struct _DEVICE_HANDLER_OBJECT *PDEVICE_HANDLER_OBJECT; -#if defined(_NTHAL_INCLUDED_) -typedef struct _KAFFINITY_EX *PKAFFINITY_EX; +// +// GUID and UUID +// +#ifndef GUID_DEFINED +#include #endif +typedef GUID UUID; + +typedef struct _BUS_HANDLER *PBUS_HANDLER; + typedef struct _PEB *PPEB; -#ifndef _NTIMAGE_ +#define EXCEPTION_READ_FAULT 0 +#define EXCEPTION_WRITE_FAULT 1 +#define EXCEPTION_EXECUTE_FAULT 8 -typedef struct _IMAGE_NT_HEADERS *PIMAGE_NT_HEADERS32; -typedef struct _IMAGE_NT_HEADERS64 *PIMAGE_NT_HEADERS64; - -#ifdef _WIN64 -typedef PIMAGE_NT_HEADERS64 PIMAGE_NT_HEADERS; +#if (NTDDI_VERSION >= NTDDI_VISTA) +extern NTSYSAPI volatile CCHAR KeNumberProcessors; +#elif (NTDDI_VERSION >= NTDDI_WINXP) +extern NTSYSAPI CCHAR KeNumberProcessors; #else -typedef PIMAGE_NT_HEADERS32 PIMAGE_NT_HEADERS; +extern PCCHAR KeNumberProcessors; #endif -#endif /* _NTIMAGE_ */ +#define MAX_WOW64_SHARED_ENTRIES 16 -/****************************************************************************** - * Executive Types * - ******************************************************************************/ - -typedef struct _ZONE_SEGMENT_HEADER { - SINGLE_LIST_ENTRY SegmentList; - PVOID Reserved; -} ZONE_SEGMENT_HEADER, *PZONE_SEGMENT_HEADER; - -typedef struct _ZONE_HEADER { - SINGLE_LIST_ENTRY FreeList; - SINGLE_LIST_ENTRY SegmentList; - ULONG BlockSize; - ULONG TotalSegmentSize; -} ZONE_HEADER, *PZONE_HEADER; - -#define PROTECTED_POOL 0x80000000 - - -/****************************************************************************** - * I/O Manager Types * - ******************************************************************************/ - -/* DEVICE_OBJECT.Flags */ -#define DO_DEVICE_HAS_NAME 0x00000040 -#define DO_SYSTEM_BOOT_PARTITION 0x00000100 -#define DO_LONG_TERM_REQUESTS 0x00000200 -#define DO_NEVER_LAST_DEVICE 0x00000400 -#define DO_LOW_PRIORITY_FILESYSTEM 0x00010000 -#define DO_SUPPORTS_TRANSACTIONS 0x00040000 -#define DO_FORCE_NEITHER_IO 0x00080000 -#define DO_VOLUME_DEVICE_OBJECT 0x00100000 -#define DO_SYSTEM_SYSTEM_PARTITION 0x00200000 -#define DO_SYSTEM_CRITICAL_PARTITION 0x00400000 -#define DO_DISALLOW_EXECUTE 0x00800000 - -#ifndef _ARC_DDK_ -#define _ARC_DDK_ -typedef enum _CONFIGURATION_TYPE { - ArcSystem, - CentralProcessor, - FloatingPointProcessor, - PrimaryIcache, - PrimaryDcache, - SecondaryIcache, - SecondaryDcache, - SecondaryCache, - EisaAdapter, - TcAdapter, - ScsiAdapter, - DtiAdapter, - MultiFunctionAdapter, - DiskController, - TapeController, - CdromController, - WormController, - SerialController, - NetworkController, - DisplayController, - ParallelController, - PointerController, - KeyboardController, - AudioController, - OtherController, - DiskPeripheral, - FloppyDiskPeripheral, - TapePeripheral, - ModemPeripheral, - MonitorPeripheral, - PrinterPeripheral, - PointerPeripheral, - KeyboardPeripheral, - TerminalPeripheral, - OtherPeripheral, - LinePeripheral, - NetworkPeripheral, - SystemMemory, - DockingInformation, - RealModeIrqRoutingTable, - RealModePCIEnumeration, - MaximumType -} CONFIGURATION_TYPE, *PCONFIGURATION_TYPE; -#endif /* !_ARC_DDK_ */ +#define NX_SUPPORT_POLICY_ALWAYSOFF 0 +#define NX_SUPPORT_POLICY_ALWAYSON 1 +#define NX_SUPPORT_POLICY_OPTIN 2 +#define NX_SUPPORT_POLICY_OPTOUT 3 /* ** IRP function codes @@ -210,118 +124,102 @@ typedef enum _CONFIGURATION_TYPE { #define IRP_MN_QUERY_LEGACY_BUS_INFORMATION 0x18 -#define IO_CHECK_CREATE_PARAMETERS 0x0200 -#define IO_ATTACH_DEVICE 0x0400 -#define IO_IGNORE_SHARE_ACCESS_CHECK 0x0800 +typedef struct _IO_COUNTERS { + ULONGLONG ReadOperationCount; + ULONGLONG WriteOperationCount; + ULONGLONG OtherOperationCount; + ULONGLONG ReadTransferCount; + ULONGLONG WriteTransferCount; + ULONGLONG OtherTransferCount; +} IO_COUNTERS, *PIO_COUNTERS; -typedef -NTSTATUS -(NTAPI *PIO_QUERY_DEVICE_ROUTINE)( - IN PVOID Context, - IN PUNICODE_STRING PathName, - IN INTERFACE_TYPE BusType, - IN ULONG BusNumber, - IN PKEY_VALUE_FULL_INFORMATION *BusInformation, - IN CONFIGURATION_TYPE ControllerType, - IN ULONG ControllerNumber, - IN PKEY_VALUE_FULL_INFORMATION *ControllerInformation, - IN CONFIGURATION_TYPE PeripheralType, - IN ULONG PeripheralNumber, - IN PKEY_VALUE_FULL_INFORMATION *PeripheralInformation); +typedef struct _VM_COUNTERS { + SIZE_T PeakVirtualSize; + SIZE_T VirtualSize; + ULONG PageFaultCount; + SIZE_T PeakWorkingSetSize; + SIZE_T WorkingSetSize; + SIZE_T QuotaPeakPagedPoolUsage; + SIZE_T QuotaPagedPoolUsage; + SIZE_T QuotaPeakNonPagedPoolUsage; + SIZE_T QuotaNonPagedPoolUsage; + SIZE_T PagefileUsage; + SIZE_T PeakPagefileUsage; +} VM_COUNTERS, *PVM_COUNTERS; -typedef enum _IO_QUERY_DEVICE_DATA_FORMAT { - IoQueryDeviceIdentifier = 0, - IoQueryDeviceConfigurationData, - IoQueryDeviceComponentInformation, - IoQueryDeviceMaxData -} IO_QUERY_DEVICE_DATA_FORMAT, *PIO_QUERY_DEVICE_DATA_FORMAT; +typedef struct _VM_COUNTERS_EX +{ + SIZE_T PeakVirtualSize; + SIZE_T VirtualSize; + ULONG PageFaultCount; + SIZE_T PeakWorkingSetSize; + SIZE_T WorkingSetSize; + SIZE_T QuotaPeakPagedPoolUsage; + SIZE_T QuotaPagedPoolUsage; + SIZE_T QuotaPeakNonPagedPoolUsage; + SIZE_T QuotaNonPagedPoolUsage; + SIZE_T PagefileUsage; + SIZE_T PeakPagefileUsage; + SIZE_T PrivateUsage; +} VM_COUNTERS_EX, *PVM_COUNTERS_EX; -typedef VOID -(NTAPI *PDRIVER_REINITIALIZE)( - IN struct _DRIVER_OBJECT *DriverObject, - IN PVOID Context OPTIONAL, - IN ULONG Count); +typedef struct _POOLED_USAGE_AND_LIMITS +{ + SIZE_T PeakPagedPoolUsage; + SIZE_T PagedPoolUsage; + SIZE_T PagedPoolLimit; + SIZE_T PeakNonPagedPoolUsage; + SIZE_T NonPagedPoolUsage; + SIZE_T NonPagedPoolLimit; + SIZE_T PeakPagefileUsage; + SIZE_T PagefileUsage; + SIZE_T PagefileLimit; +} POOLED_USAGE_AND_LIMITS, *PPOOLED_USAGE_AND_LIMITS; -typedef struct _CONTROLLER_OBJECT { - CSHORT Type; - CSHORT Size; - PVOID ControllerExtension; - KDEVICE_QUEUE DeviceWaitQueue; - ULONG Spare1; - LARGE_INTEGER Spare2; -} CONTROLLER_OBJECT, *PCONTROLLER_OBJECT; +/* DEVICE_OBJECT.Flags */ + +#define DO_VERIFY_VOLUME 0x00000002 +#define DO_BUFFERED_IO 0x00000004 +#define DO_EXCLUSIVE 0x00000008 +#define DO_DIRECT_IO 0x00000010 +#define DO_MAP_IO_BUFFER 0x00000020 +#define DO_DEVICE_HAS_NAME 0x00000040 +#define DO_DEVICE_INITIALIZING 0x00000080 +#define DO_SYSTEM_BOOT_PARTITION 0x00000100 +#define DO_LONG_TERM_REQUESTS 0x00000200 +#define DO_NEVER_LAST_DEVICE 0x00000400 +#define DO_SHUTDOWN_REGISTERED 0x00000800 +#define DO_BUS_ENUMERATED_DEVICE 0x00001000 +#define DO_POWER_PAGABLE 0x00002000 +#define DO_POWER_INRUSH 0x00004000 +#define DO_LOW_PRIORITY_FILESYSTEM 0x00010000 +#define DO_SUPPORTS_TRANSACTIONS 0x00040000 +#define DO_FORCE_NEITHER_IO 0x00080000 +#define DO_VOLUME_DEVICE_OBJECT 0x00100000 +#define DO_SYSTEM_SYSTEM_PARTITION 0x00200000 +#define DO_SYSTEM_CRITICAL_PARTITION 0x00400000 +#define DO_DISALLOW_EXECUTE 0x00800000 #define DRVO_REINIT_REGISTERED 0x00000008 #define DRVO_INITIALIZED 0x00000010 #define DRVO_BOOTREINIT_REGISTERED 0x00000020 #define DRVO_LEGACY_RESOURCES 0x00000040 -typedef struct _CONFIGURATION_INFORMATION { - ULONG DiskCount; - ULONG FloppyCount; - ULONG CdRomCount; - ULONG TapeCount; - ULONG ScsiPortCount; - ULONG SerialCount; - ULONG ParallelCount; - BOOLEAN AtDiskPrimaryAddressClaimed; - BOOLEAN AtDiskSecondaryAddressClaimed; - ULONG Version; - ULONG MediumChangerCount; -} CONFIGURATION_INFORMATION, *PCONFIGURATION_INFORMATION; +typedef enum _ARBITER_REQUEST_SOURCE { + ArbiterRequestUndefined = -1, + ArbiterRequestLegacyReported, + ArbiterRequestHalReported, + ArbiterRequestLegacyAssigned, + ArbiterRequestPnpDetected, + ArbiterRequestPnpEnumerated +} ARBITER_REQUEST_SOURCE; -typedef struct _DISK_SIGNATURE { - ULONG PartitionStyle; - _ANONYMOUS_UNION union { - struct { - ULONG Signature; - ULONG CheckSum; - } Mbr; - struct { - GUID DiskId; - } Gpt; - } DUMMYUNIONNAME; -} DISK_SIGNATURE, *PDISK_SIGNATURE; - -typedef struct _TXN_PARAMETER_BLOCK { - USHORT Length; - USHORT TxFsContext; - PVOID TransactionObject; -} TXN_PARAMETER_BLOCK, *PTXN_PARAMETER_BLOCK; - -#define TXF_MINIVERSION_DEFAULT_VIEW (0xFFFE) - -typedef struct _IO_DRIVER_CREATE_CONTEXT { - CSHORT Size; - struct _ECP_LIST *ExtraCreateParameter; - PVOID DeviceObjectHint; - PTXN_PARAMETER_BLOCK TxnParameters; -} IO_DRIVER_CREATE_CONTEXT, *PIO_DRIVER_CREATE_CONTEXT; - -typedef struct _AGP_TARGET_BUS_INTERFACE_STANDARD { - USHORT Size; - USHORT Version; - PVOID Context; - PINTERFACE_REFERENCE InterfaceReference; - PINTERFACE_DEREFERENCE InterfaceDereference; - PGET_SET_DEVICE_DATA SetBusData; - PGET_SET_DEVICE_DATA GetBusData; - UCHAR CapabilityID; -} AGP_TARGET_BUS_INTERFACE_STANDARD, *PAGP_TARGET_BUS_INTERFACE_STANDARD; - -typedef NTSTATUS -(NTAPI *PGET_LOCATION_STRING)( - IN OUT PVOID Context OPTIONAL, - OUT PWCHAR *LocationStrings); - -typedef struct _PNP_LOCATION_INTERFACE { - USHORT Size; - USHORT Version; - PVOID Context; - PINTERFACE_REFERENCE InterfaceReference; - PINTERFACE_DEREFERENCE InterfaceDereference; - PGET_LOCATION_STRING GetLocationString; -} PNP_LOCATION_INTERFACE, *PPNP_LOCATION_INTERFACE; +typedef enum _ARBITER_RESULT { + ArbiterResultUndefined = -1, + ArbiterResultSuccess, + ArbiterResultExternalConflict, + ArbiterResultNullRequest +} ARBITER_RESULT; typedef enum _ARBITER_ACTION { ArbiterActionTestAllocation, @@ -342,69 +240,39 @@ typedef struct _ARBITER_CONFLICT_INFO { ULONGLONG End; } ARBITER_CONFLICT_INFO, *PARBITER_CONFLICT_INFO; -typedef struct _ARBITER_TEST_ALLOCATION_PARAMETERS { +typedef struct _ARBITER_PARAMETERS { + union { + struct { IN OUT PLIST_ENTRY ArbitrationList; IN ULONG AllocateFromCount; IN PCM_PARTIAL_RESOURCE_DESCRIPTOR AllocateFrom; -} ARBITER_TEST_ALLOCATION_PARAMETERS, *PARBITER_TEST_ALLOCATION_PARAMETERS; - -typedef struct _ARBITER_RETEST_ALLOCATION_PARAMETERS { + } TestAllocation; + struct { IN OUT PLIST_ENTRY ArbitrationList; IN ULONG AllocateFromCount; IN PCM_PARTIAL_RESOURCE_DESCRIPTOR AllocateFrom; -} ARBITER_RETEST_ALLOCATION_PARAMETERS, *PARBITER_RETEST_ALLOCATION_PARAMETERS; - -typedef struct _ARBITER_BOOT_ALLOCATION_PARAMETERS { + } RetestAllocation; + struct { IN OUT PLIST_ENTRY ArbitrationList; -} ARBITER_BOOT_ALLOCATION_PARAMETERS, *PARBITER_BOOT_ALLOCATION_PARAMETERS; - -typedef struct _ARBITER_QUERY_ALLOCATED_RESOURCES_PARAMETERS { + } BootAllocation; + struct { OUT PCM_PARTIAL_RESOURCE_LIST *AllocatedResources; -} ARBITER_QUERY_ALLOCATED_RESOURCES_PARAMETERS, *PARBITER_QUERY_ALLOCATED_RESOURCES_PARAMETERS; - -typedef struct _ARBITER_QUERY_CONFLICT_PARAMETERS { + } QueryAllocatedResources; + struct { IN PDEVICE_OBJECT PhysicalDeviceObject; IN PIO_RESOURCE_DESCRIPTOR ConflictingResource; OUT PULONG ConflictCount; OUT PARBITER_CONFLICT_INFO *Conflicts; -} ARBITER_QUERY_CONFLICT_PARAMETERS, *PARBITER_QUERY_CONFLICT_PARAMETERS; - -typedef struct _ARBITER_QUERY_ARBITRATE_PARAMETERS { + } QueryConflict; + struct { IN PLIST_ENTRY ArbitrationList; -} ARBITER_QUERY_ARBITRATE_PARAMETERS, *PARBITER_QUERY_ARBITRATE_PARAMETERS; - -typedef struct _ARBITER_ADD_RESERVED_PARAMETERS { + } QueryArbitrate; + struct { IN PDEVICE_OBJECT ReserveDevice; -} ARBITER_ADD_RESERVED_PARAMETERS, *PARBITER_ADD_RESERVED_PARAMETERS; - -typedef struct _ARBITER_PARAMETERS { - union { - ARBITER_TEST_ALLOCATION_PARAMETERS TestAllocation; - ARBITER_RETEST_ALLOCATION_PARAMETERS RetestAllocation; - ARBITER_BOOT_ALLOCATION_PARAMETERS BootAllocation; - ARBITER_QUERY_ALLOCATED_RESOURCES_PARAMETERS QueryAllocatedResources; - ARBITER_QUERY_CONFLICT_PARAMETERS QueryConflict; - ARBITER_QUERY_ARBITRATE_PARAMETERS QueryArbitrate; - ARBITER_ADD_RESERVED_PARAMETERS AddReserved; + } AddReserved; } Parameters; } ARBITER_PARAMETERS, *PARBITER_PARAMETERS; -typedef enum _ARBITER_REQUEST_SOURCE { - ArbiterRequestUndefined = -1, - ArbiterRequestLegacyReported, - ArbiterRequestHalReported, - ArbiterRequestLegacyAssigned, - ArbiterRequestPnpDetected, - ArbiterRequestPnpEnumerated -} ARBITER_REQUEST_SOURCE; - -typedef enum _ARBITER_RESULT { - ArbiterResultUndefined = -1, - ArbiterResultSuccess, - ArbiterResultExternalConflict, - ArbiterResultNullRequest -} ARBITER_RESULT; - #define ARBITER_FLAG_BOOT_CONFIG 0x00000001 typedef struct _ARBITER_LIST_ENTRY { @@ -441,826 +309,6 @@ typedef struct _ARBITER_INTERFACE { ULONG Flags; } ARBITER_INTERFACE, *PARBITER_INTERFACE; -typedef enum _RESOURCE_TRANSLATION_DIRECTION { - TranslateChildToParent, - TranslateParentToChild -} RESOURCE_TRANSLATION_DIRECTION; - -typedef NTSTATUS -(NTAPI *PTRANSLATE_RESOURCE_HANDLER)( - IN OUT PVOID Context OPTIONAL, - IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Source, - IN RESOURCE_TRANSLATION_DIRECTION Direction, - IN ULONG AlternativesCount OPTIONAL, - IN IO_RESOURCE_DESCRIPTOR Alternatives[], - IN PDEVICE_OBJECT PhysicalDeviceObject, - OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR Target); - -typedef NTSTATUS -(NTAPI *PTRANSLATE_RESOURCE_REQUIREMENTS_HANDLER)( - IN OUT PVOID Context OPTIONAL, - IN PIO_RESOURCE_DESCRIPTOR Source, - IN PDEVICE_OBJECT PhysicalDeviceObject, - OUT PULONG TargetCount, - OUT PIO_RESOURCE_DESCRIPTOR *Target); - -typedef struct _TRANSLATOR_INTERFACE { - USHORT Size; - USHORT Version; - PVOID Context; - PINTERFACE_REFERENCE InterfaceReference; - PINTERFACE_DEREFERENCE InterfaceDereference; - PTRANSLATE_RESOURCE_HANDLER TranslateResources; - PTRANSLATE_RESOURCE_REQUIREMENTS_HANDLER TranslateResourceRequirements; -} TRANSLATOR_INTERFACE, *PTRANSLATOR_INTERFACE; - -typedef struct _PCI_AGP_CAPABILITY { - PCI_CAPABILITIES_HEADER Header; - USHORT Minor:4; - USHORT Major:4; - USHORT Rsvd1:8; - struct _PCI_AGP_STATUS { - ULONG Rate:3; - ULONG Agp3Mode:1; - ULONG FastWrite:1; - ULONG FourGB:1; - ULONG HostTransDisable:1; - ULONG Gart64:1; - ULONG ITA_Coherent:1; - ULONG SideBandAddressing:1; - ULONG CalibrationCycle:3; - ULONG AsyncRequestSize:3; - ULONG Rsvd1:1; - ULONG Isoch:1; - ULONG Rsvd2:6; - ULONG RequestQueueDepthMaximum:8; - } AGPStatus; - struct _PCI_AGP_COMMAND { - ULONG Rate:3; - ULONG Rsvd1:1; - ULONG FastWriteEnable:1; - ULONG FourGBEnable:1; - ULONG Rsvd2:1; - ULONG Gart64:1; - ULONG AGPEnable:1; - ULONG SBAEnable:1; - ULONG CalibrationCycle:3; - ULONG AsyncReqSize:3; - ULONG Rsvd3:8; - ULONG RequestQueueDepth:8; - } AGPCommand; -} PCI_AGP_CAPABILITY, *PPCI_AGP_CAPABILITY; - -typedef enum _EXTENDED_AGP_REGISTER { - IsochStatus, - AgpControl, - ApertureSize, - AperturePageSize, - GartLow, - GartHigh, - IsochCommand -} EXTENDED_AGP_REGISTER, *PEXTENDED_AGP_REGISTER; - -typedef struct _PCI_AGP_ISOCH_STATUS { - ULONG ErrorCode:2; - ULONG Rsvd1:1; - ULONG Isoch_L:3; - ULONG Isoch_Y:2; - ULONG Isoch_N:8; - ULONG Rsvd2:16; -} PCI_AGP_ISOCH_STATUS, *PPCI_AGP_ISOCH_STATUS; - -typedef struct _PCI_AGP_CONTROL { - ULONG Rsvd1:7; - ULONG GTLB_Enable:1; - ULONG AP_Enable:1; - ULONG CAL_Disable:1; - ULONG Rsvd2:22; -} PCI_AGP_CONTROL, *PPCI_AGP_CONTROL; - -typedef struct _PCI_AGP_APERTURE_PAGE_SIZE { - USHORT PageSizeMask:11; - USHORT Rsvd1:1; - USHORT PageSizeSelect:4; -} PCI_AGP_APERTURE_PAGE_SIZE, *PPCI_AGP_APERTURE_PAGE_SIZE; - -typedef struct _PCI_AGP_ISOCH_COMMAND { - USHORT Rsvd1:6; - USHORT Isoch_Y:2; - USHORT Isoch_N:8; -} PCI_AGP_ISOCH_COMMAND, *PPCI_AGP_ISOCH_COMMAND; - -typedef struct PCI_AGP_EXTENDED_CAPABILITY { - PCI_AGP_ISOCH_STATUS IsochStatus; - PCI_AGP_CONTROL AgpControl; - USHORT ApertureSize; - PCI_AGP_APERTURE_PAGE_SIZE AperturePageSize; - ULONG GartLow; - ULONG GartHigh; - PCI_AGP_ISOCH_COMMAND IsochCommand; -} PCI_AGP_EXTENDED_CAPABILITY, *PPCI_AGP_EXTENDED_CAPABILITY; - -#define PCI_AGP_RATE_1X 0x1 -#define PCI_AGP_RATE_2X 0x2 -#define PCI_AGP_RATE_4X 0x4 - -#define PCIX_MODE_CONVENTIONAL_PCI 0x0 -#define PCIX_MODE1_66MHZ 0x1 -#define PCIX_MODE1_100MHZ 0x2 -#define PCIX_MODE1_133MHZ 0x3 -#define PCIX_MODE2_266_66MHZ 0x9 -#define PCIX_MODE2_266_100MHZ 0xA -#define PCIX_MODE2_266_133MHZ 0xB -#define PCIX_MODE2_533_66MHZ 0xD -#define PCIX_MODE2_533_100MHZ 0xE -#define PCIX_MODE2_533_133MHZ 0xF - -#define PCIX_VERSION_MODE1_ONLY 0x0 -#define PCIX_VERSION_MODE2_ECC 0x1 -#define PCIX_VERSION_DUAL_MODE_ECC 0x2 - -typedef struct _PCIX_BRIDGE_CAPABILITY { - PCI_CAPABILITIES_HEADER Header; - union { - struct { - USHORT Bus64Bit:1; - USHORT Bus133MHzCapable:1; - USHORT SplitCompletionDiscarded:1; - USHORT UnexpectedSplitCompletion:1; - USHORT SplitCompletionOverrun:1; - USHORT SplitRequestDelayed:1; - USHORT BusModeFrequency:4; - USHORT Rsvd:2; - USHORT Version:2; - USHORT Bus266MHzCapable:1; - USHORT Bus533MHzCapable:1; - } DUMMYSTRUCTNAME; - USHORT AsUSHORT; - } SecondaryStatus; - union { - struct { - ULONG FunctionNumber:3; - ULONG DeviceNumber:5; - ULONG BusNumber:8; - ULONG Device64Bit:1; - ULONG Device133MHzCapable:1; - ULONG SplitCompletionDiscarded:1; - ULONG UnexpectedSplitCompletion:1; - ULONG SplitCompletionOverrun:1; - ULONG SplitRequestDelayed:1; - ULONG Rsvd:7; - ULONG DIMCapable:1; - ULONG Device266MHzCapable:1; - ULONG Device533MHzCapable:1; - } DUMMYSTRUCTNAME; - ULONG AsULONG; - } BridgeStatus; - USHORT UpstreamSplitTransactionCapacity; - USHORT UpstreamSplitTransactionLimit; - USHORT DownstreamSplitTransactionCapacity; - USHORT DownstreamSplitTransactionLimit; - union { - struct { - ULONG SelectSecondaryRegisters:1; - ULONG ErrorPresentInOtherBank:1; - ULONG AdditionalCorrectableError:1; - ULONG AdditionalUncorrectableError:1; - ULONG ErrorPhase:3; - ULONG ErrorCorrected:1; - ULONG Syndrome:8; - ULONG ErrorFirstCommand:4; - ULONG ErrorSecondCommand:4; - ULONG ErrorUpperAttributes:4; - ULONG ControlUpdateEnable:1; - ULONG Rsvd:1; - ULONG DisableSingleBitCorrection:1; - ULONG EccMode:1; - } DUMMYSTRUCTNAME; - ULONG AsULONG; - } EccControlStatus; - ULONG EccFirstAddress; - ULONG EccSecondAddress; - ULONG EccAttribute; -} PCIX_BRIDGE_CAPABILITY, *PPCIX_BRIDGE_CAPABILITY; - -typedef struct _PCI_SUBSYSTEM_IDS_CAPABILITY { - PCI_CAPABILITIES_HEADER Header; - USHORT Reserved; - USHORT SubVendorID; - USHORT SubSystemID; -} PCI_SUBSYSTEM_IDS_CAPABILITY, *PPCI_SUBSYSTEM_IDS_CAPABILITY; - -#define OSC_FIRMWARE_FAILURE 0x02 -#define OSC_UNRECOGNIZED_UUID 0x04 -#define OSC_UNRECOGNIZED_REVISION 0x08 -#define OSC_CAPABILITIES_MASKED 0x10 - -#define PCI_ROOT_BUS_OSC_METHOD_CAPABILITY_REVISION 0x01 - -typedef struct _PCI_ROOT_BUS_OSC_SUPPORT_FIELD { - union { - struct { - ULONG ExtendedConfigOpRegions:1; - ULONG ActiveStatePowerManagement:1; - ULONG ClockPowerManagement:1; - ULONG SegmentGroups:1; - ULONG MessageSignaledInterrupts:1; - ULONG WindowsHardwareErrorArchitecture:1; - ULONG Reserved:26; - } DUMMYSTRUCTNAME; - ULONG AsULONG; - } u; -} PCI_ROOT_BUS_OSC_SUPPORT_FIELD, *PPCI_ROOT_BUS_OSC_SUPPORT_FIELD; - -typedef struct _PCI_ROOT_BUS_OSC_CONTROL_FIELD { - union { - struct { - ULONG ExpressNativeHotPlug:1; - ULONG ShpcNativeHotPlug:1; - ULONG ExpressNativePME:1; - ULONG ExpressAdvancedErrorReporting:1; - ULONG ExpressCapabilityStructure:1; - ULONG Reserved:27; - } DUMMYSTRUCTNAME; - ULONG AsULONG; - } u; -} PCI_ROOT_BUS_OSC_CONTROL_FIELD, *PPCI_ROOT_BUS_OSC_CONTROL_FIELD; - -typedef enum _PCI_HARDWARE_INTERFACE { - PciConventional, - PciXMode1, - PciXMode2, - PciExpress -} PCI_HARDWARE_INTERFACE, *PPCI_HARDWARE_INTERFACE; - -typedef enum { - BusWidth32Bits, - BusWidth64Bits -} PCI_BUS_WIDTH; - -typedef struct _PCI_ROOT_BUS_HARDWARE_CAPABILITY { - PCI_HARDWARE_INTERFACE SecondaryInterface; - struct { - BOOLEAN BusCapabilitiesFound; - ULONG CurrentSpeedAndMode; - ULONG SupportedSpeedsAndModes; - BOOLEAN DeviceIDMessagingCapable; - PCI_BUS_WIDTH SecondaryBusWidth; - } DUMMYSTRUCTNAME; - PCI_ROOT_BUS_OSC_SUPPORT_FIELD OscFeatureSupport; - PCI_ROOT_BUS_OSC_CONTROL_FIELD OscControlRequest; - PCI_ROOT_BUS_OSC_CONTROL_FIELD OscControlGranted; -} PCI_ROOT_BUS_HARDWARE_CAPABILITY, *PPCI_ROOT_BUS_HARDWARE_CAPABILITY; - -typedef union _PCI_EXPRESS_CAPABILITIES_REGISTER { - struct { - USHORT CapabilityVersion:4; - USHORT DeviceType:4; - USHORT SlotImplemented:1; - USHORT InterruptMessageNumber:5; - USHORT Rsvd:2; - } DUMMYSTRUCTNAME; - USHORT AsUSHORT; -} PCI_EXPRESS_CAPABILITIES_REGISTER, *PPCI_EXPRESS_CAPABILITIES_REGISTER; - -typedef union _PCI_EXPRESS_DEVICE_CAPABILITIES_REGISTER { - struct { - ULONG MaxPayloadSizeSupported:3; - ULONG PhantomFunctionsSupported:2; - ULONG ExtendedTagSupported:1; - ULONG L0sAcceptableLatency:3; - ULONG L1AcceptableLatency:3; - ULONG Undefined:3; - ULONG RoleBasedErrorReporting:1; - ULONG Rsvd1:2; - ULONG CapturedSlotPowerLimit:8; - ULONG CapturedSlotPowerLimitScale:2; - ULONG Rsvd2:4; - } DUMMYSTRUCTNAME; - ULONG AsULONG; -} PCI_EXPRESS_DEVICE_CAPABILITIES_REGISTER, *PPCI_EXPRESS_DEVICE_CAPABILITIES_REGISTER; - -#define PCI_EXPRESS_AER_DEVICE_CONTROL_MASK 0x07; - -typedef union _PCI_EXPRESS_DEVICE_CONTROL_REGISTER { - struct { - USHORT CorrectableErrorEnable:1; - USHORT NonFatalErrorEnable:1; - USHORT FatalErrorEnable:1; - USHORT UnsupportedRequestErrorEnable:1; - USHORT EnableRelaxedOrder:1; - USHORT MaxPayloadSize:3; - USHORT ExtendedTagEnable:1; - USHORT PhantomFunctionsEnable:1; - USHORT AuxPowerEnable:1; - USHORT NoSnoopEnable:1; - USHORT MaxReadRequestSize:3; - USHORT BridgeConfigRetryEnable:1; - } DUMMYSTRUCTNAME; - USHORT AsUSHORT; -} PCI_EXPRESS_DEVICE_CONTROL_REGISTER, *PPCI_EXPRESS_DEVICE_CONTROL_REGISTER; - -#define PCI_EXPRESS_AER_DEVICE_STATUS_MASK 0x0F; - -typedef union _PCI_EXPRESS_DEVICE_STATUS_REGISTER { - struct { - USHORT CorrectableErrorDetected:1; - USHORT NonFatalErrorDetected:1; - USHORT FatalErrorDetected:1; - USHORT UnsupportedRequestDetected:1; - USHORT AuxPowerDetected:1; - USHORT TransactionsPending:1; - USHORT Rsvd:10; - } DUMMYSTRUCTNAME; - USHORT AsUSHORT; -} PCI_EXPRESS_DEVICE_STATUS_REGISTER, *PPCI_EXPRESS_DEVICE_STATUS_REGISTER; - -typedef union _PCI_EXPRESS_LINK_CAPABILITIES_REGISTER { - struct { - ULONG MaximumLinkSpeed:4; - ULONG MaximumLinkWidth:6; - ULONG ActiveStatePMSupport:2; - ULONG L0sExitLatency:3; - ULONG L1ExitLatency:3; - ULONG ClockPowerManagement:1; - ULONG SurpriseDownErrorReportingCapable:1; - ULONG DataLinkLayerActiveReportingCapable:1; - ULONG Rsvd:3; - ULONG PortNumber:8; - } DUMMYSTRUCTNAME; - ULONG AsULONG; -} PCI_EXPRESS_LINK_CAPABILITIES_REGISTER, *PPCI_EXPRESS_LINK_CAPABILITIES_REGISTER; - -typedef union _PCI_EXPRESS_LINK_CONTROL_REGISTER { - struct { - USHORT ActiveStatePMControl:2; - USHORT Rsvd1:1; - USHORT ReadCompletionBoundary:1; - USHORT LinkDisable:1; - USHORT RetrainLink:1; - USHORT CommonClockConfig:1; - USHORT ExtendedSynch:1; - USHORT EnableClockPowerManagement:1; - USHORT Rsvd2:7; - } DUMMYSTRUCTNAME; - USHORT AsUSHORT; -} PCI_EXPRESS_LINK_CONTROL_REGISTER, *PPCI_EXPRESS_LINK_CONTROL_REGISTER; - -typedef union _PCI_EXPRESS_LINK_STATUS_REGISTER { - struct { - USHORT LinkSpeed:4; - USHORT LinkWidth:6; - USHORT Undefined:1; - USHORT LinkTraining:1; - USHORT SlotClockConfig:1; - USHORT DataLinkLayerActive:1; - USHORT Rsvd:2; - } DUMMYSTRUCTNAME; - USHORT AsUSHORT; -} PCI_EXPRESS_LINK_STATUS_REGISTER, *PPCI_EXPRESS_LINK_STATUS_REGISTER; - -typedef union _PCI_EXPRESS_SLOT_CAPABILITIES_REGISTER { - struct { - ULONG AttentionButtonPresent:1; - ULONG PowerControllerPresent:1; - ULONG MRLSensorPresent:1; - ULONG AttentionIndicatorPresent:1; - ULONG PowerIndicatorPresent:1; - ULONG HotPlugSurprise:1; - ULONG HotPlugCapable:1; - ULONG SlotPowerLimit:8; - ULONG SlotPowerLimitScale:2; - ULONG ElectromechanicalLockPresent:1; - ULONG NoCommandCompletedSupport:1; - ULONG PhysicalSlotNumber:13; - } DUMMYSTRUCTNAME; - ULONG AsULONG; -} PCI_EXPRESS_SLOT_CAPABILITIES_REGISTER, *PPCI_EXPRESS_SLOT_CAPABILITIES_REGISTER; - -typedef union _PCI_EXPRESS_SLOT_CONTROL_REGISTER { - struct { - USHORT AttentionButtonEnable:1; - USHORT PowerFaultDetectEnable:1; - USHORT MRLSensorEnable:1; - USHORT PresenceDetectEnable:1; - USHORT CommandCompletedEnable:1; - USHORT HotPlugInterruptEnable:1; - USHORT AttentionIndicatorControl:2; - USHORT PowerIndicatorControl:2; - USHORT PowerControllerControl:1; - USHORT ElectromechanicalLockControl:1; - USHORT DataLinkStateChangeEnable:1; - USHORT Rsvd:3; - } DUMMYSTRUCTNAME; - USHORT AsUSHORT; -} PCI_EXPRESS_SLOT_CONTROL_REGISTER, *PPCI_EXPRESS_SLOT_CONTROL_REGISTER; - -typedef union _PCI_EXPRESS_SLOT_STATUS_REGISTER { - struct { - USHORT AttentionButtonPressed:1; - USHORT PowerFaultDetected:1; - USHORT MRLSensorChanged:1; - USHORT PresenceDetectChanged:1; - USHORT CommandCompleted:1; - USHORT MRLSensorState:1; - USHORT PresenceDetectState:1; - USHORT ElectromechanicalLockEngaged:1; - USHORT DataLinkStateChanged:1; - USHORT Rsvd:7; - } DUMMYSTRUCTNAME; - USHORT AsUSHORT; -} PCI_EXPRESS_SLOT_STATUS_REGISTER, *PPCI_EXPRESS_SLOT_STATUS_REGISTER; - -typedef union _PCI_EXPRESS_ROOT_CONTROL_REGISTER { - struct { - USHORT CorrectableSerrEnable:1; - USHORT NonFatalSerrEnable:1; - USHORT FatalSerrEnable:1; - USHORT PMEInterruptEnable:1; - USHORT CRSSoftwareVisibilityEnable:1; - USHORT Rsvd:11; - } DUMMYSTRUCTNAME; - USHORT AsUSHORT; -} PCI_EXPRESS_ROOT_CONTROL_REGISTER, *PPCI_EXPRESS_ROOT_CONTROL_REGISTER; - -typedef union _PCI_EXPRESS_ROOT_CAPABILITIES_REGISTER { - struct { - USHORT CRSSoftwareVisibility:1; - USHORT Rsvd:15; - } DUMMYSTRUCTNAME; - USHORT AsUSHORT; -} PCI_EXPRESS_ROOT_CAPABILITIES_REGISTER, *PPCI_EXPRESS_ROOT_CAPABILITIES_REGISTER; - -typedef union _PCI_EXPRESS_ROOT_STATUS_REGISTER { - struct { - ULONG PMERequestorId:16; - ULONG PMEStatus:1; - ULONG PMEPending:1; - ULONG Rsvd:14; - } DUMMYSTRUCTNAME; - ULONG AsULONG; -} PCI_EXPRESS_ROOT_STATUS_REGISTER, *PPCI_EXPRESS_ROOT_STATUS_REGISTER; - -typedef struct _PCI_EXPRESS_CAPABILITY { - PCI_CAPABILITIES_HEADER Header; - PCI_EXPRESS_CAPABILITIES_REGISTER ExpressCapabilities; - PCI_EXPRESS_DEVICE_CAPABILITIES_REGISTER DeviceCapabilities; - PCI_EXPRESS_DEVICE_CONTROL_REGISTER DeviceControl; - PCI_EXPRESS_DEVICE_STATUS_REGISTER DeviceStatus; - PCI_EXPRESS_LINK_CAPABILITIES_REGISTER LinkCapabilities; - PCI_EXPRESS_LINK_CONTROL_REGISTER LinkControl; - PCI_EXPRESS_LINK_STATUS_REGISTER LinkStatus; - PCI_EXPRESS_SLOT_CAPABILITIES_REGISTER SlotCapabilities; - PCI_EXPRESS_SLOT_CONTROL_REGISTER SlotControl; - PCI_EXPRESS_SLOT_STATUS_REGISTER SlotStatus; - PCI_EXPRESS_ROOT_CONTROL_REGISTER RootControl; - PCI_EXPRESS_ROOT_CAPABILITIES_REGISTER RootCapabilities; - PCI_EXPRESS_ROOT_STATUS_REGISTER RootStatus; -} PCI_EXPRESS_CAPABILITY, *PPCI_EXPRESS_CAPABILITY; - -typedef enum { - MRLClosed = 0, - MRLOpen -} PCI_EXPRESS_MRL_STATE; - -typedef enum { - SlotEmpty = 0, - CardPresent -} PCI_EXPRESS_CARD_PRESENCE; - -typedef enum { - IndicatorOn = 1, - IndicatorBlink, - IndicatorOff -} PCI_EXPRESS_INDICATOR_STATE; - -typedef enum { - PowerOn = 0, - PowerOff -} PCI_EXPRESS_POWER_STATE; - -typedef enum { - L0sEntrySupport = 1, - L0sAndL1EntrySupport = 3 -} PCI_EXPRESS_ASPM_SUPPORT; - -typedef enum { - L0sAndL1EntryDisabled, - L0sEntryEnabled, - L1EntryEnabled, - L0sAndL1EntryEnabled -} PCI_EXPRESS_ASPM_CONTROL; - -typedef enum { - L0s_Below64ns = 0, - L0s_64ns_128ns, - L0s_128ns_256ns, - L0s_256ns_512ns, - L0s_512ns_1us, - L0s_1us_2us, - L0s_2us_4us, - L0s_Above4us -} PCI_EXPRESS_L0s_EXIT_LATENCY; - -typedef enum { - L1_Below1us = 0, - L1_1us_2us, - L1_2us_4us, - L1_4us_8us, - L1_8us_16us, - L1_16us_32us, - L1_32us_64us, - L1_Above64us -} PCI_EXPRESS_L1_EXIT_LATENCY; - -typedef enum { - PciExpressEndpoint = 0, - PciExpressLegacyEndpoint, - PciExpressRootPort = 4, - PciExpressUpstreamSwitchPort, - PciExpressDownstreamSwitchPort, - PciExpressToPciXBridge, - PciXToExpressBridge, - PciExpressRootComplexIntegratedEndpoint, - PciExpressRootComplexEventCollector -} PCI_EXPRESS_DEVICE_TYPE; - -typedef enum { - MaxPayload128Bytes = 0, - MaxPayload256Bytes, - MaxPayload512Bytes, - MaxPayload1024Bytes, - MaxPayload2048Bytes, - MaxPayload4096Bytes -} PCI_EXPRESS_MAX_PAYLOAD_SIZE; - -typedef union _PCI_EXPRESS_PME_REQUESTOR_ID { - struct { - USHORT FunctionNumber:3; - USHORT DeviceNumber:5; - USHORT BusNumber:8; - } DUMMYSTRUCTNAME; - USHORT AsUSHORT; -} PCI_EXPRESS_PME_REQUESTOR_ID, *PPCI_EXPRESS_PME_REQUESTOR_ID; - -#if defined(_WIN64) - -#ifndef USE_DMA_MACROS -#define USE_DMA_MACROS -#endif - -#ifndef NO_LEGACY_DRIVERS -#define NO_LEGACY_DRIVERS -#endif - -#endif /* defined(_WIN64) */ - -typedef enum _PHYSICAL_COUNTER_RESOURCE_DESCRIPTOR_TYPE { - ResourceTypeSingle = 0, - ResourceTypeRange, - ResourceTypeExtendedCounterConfiguration, - ResourceTypeOverflow, - ResourceTypeMax -} PHYSICAL_COUNTER_RESOURCE_DESCRIPTOR_TYPE; - -typedef struct _PHYSICAL_COUNTER_RESOURCE_DESCRIPTOR { - PHYSICAL_COUNTER_RESOURCE_DESCRIPTOR_TYPE Type; - ULONG Flags; - union { - ULONG CounterIndex; - ULONG ExtendedRegisterAddress; - struct { - ULONG Begin; - ULONG End; - } Range; - } u; -} PHYSICAL_COUNTER_RESOURCE_DESCRIPTOR, *PPHYSICAL_COUNTER_RESOURCE_DESCRIPTOR; - -typedef struct _PHYSICAL_COUNTER_RESOURCE_LIST { - ULONG Count; - PHYSICAL_COUNTER_RESOURCE_DESCRIPTOR Descriptors[ANYSIZE_ARRAY]; -} PHYSICAL_COUNTER_RESOURCE_LIST, *PPHYSICAL_COUNTER_RESOURCE_LIST; - -typedef VOID -(NTAPI *PciPin2Line)( - IN struct _BUS_HANDLER *BusHandler, - IN struct _BUS_HANDLER *RootHandler, - IN PCI_SLOT_NUMBER SlotNumber, - IN PPCI_COMMON_CONFIG PciData); - -typedef VOID -(NTAPI *PciLine2Pin)( - IN struct _BUS_HANDLER *BusHandler, - IN struct _BUS_HANDLER *RootHandler, - IN PCI_SLOT_NUMBER SlotNumber, - IN PPCI_COMMON_CONFIG PciNewData, - IN PPCI_COMMON_CONFIG PciOldData); - -typedef VOID -(NTAPI *PciReadWriteConfig)( - IN struct _BUS_HANDLER *BusHandler, - IN PCI_SLOT_NUMBER Slot, - IN PVOID Buffer, - IN ULONG Offset, - IN ULONG Length); - -#define PCI_DATA_TAG ' ICP' -#define PCI_DATA_VERSION 1 - -typedef struct _PCIBUSDATA { - ULONG Tag; - ULONG Version; - PciReadWriteConfig ReadConfig; - PciReadWriteConfig WriteConfig; - PciPin2Line Pin2Line; - PciLine2Pin Line2Pin; - PCI_SLOT_NUMBER ParentSlot; - PVOID Reserved[4]; -} PCIBUSDATA, *PPCIBUSDATA; - -#ifndef _PCIINTRF_X_ -#define _PCIINTRF_X_ - -typedef ULONG -(NTAPI *PCI_READ_WRITE_CONFIG)( - IN PVOID Context, - IN ULONG BusOffset, - IN ULONG Slot, - IN PVOID Buffer, - IN ULONG Offset, - IN ULONG Length); - -typedef VOID -(NTAPI *PCI_PIN_TO_LINE)( - IN PVOID Context, - IN PPCI_COMMON_CONFIG PciData); - -typedef VOID -(NTAPI *PCI_LINE_TO_PIN)( - IN PVOID Context, - IN PPCI_COMMON_CONFIG PciNewData, - IN PPCI_COMMON_CONFIG PciOldData); - -typedef VOID -(NTAPI *PCI_ROOT_BUS_CAPABILITY)( - IN PVOID Context, - OUT PPCI_ROOT_BUS_HARDWARE_CAPABILITY HardwareCapability); - -typedef VOID -(NTAPI *PCI_EXPRESS_WAKE_CONTROL)( - IN PVOID Context, - IN BOOLEAN EnableWake); - -typedef struct _PCI_BUS_INTERFACE_STANDARD { - USHORT Size; - USHORT Version; - PVOID Context; - PINTERFACE_REFERENCE InterfaceReference; - PINTERFACE_DEREFERENCE InterfaceDereference; - PCI_READ_WRITE_CONFIG ReadConfig; - PCI_READ_WRITE_CONFIG WriteConfig; - PCI_PIN_TO_LINE PinToLine; - PCI_LINE_TO_PIN LineToPin; - PCI_ROOT_BUS_CAPABILITY RootBusCapability; - PCI_EXPRESS_WAKE_CONTROL ExpressWakeControl; -} PCI_BUS_INTERFACE_STANDARD, *PPCI_BUS_INTERFACE_STANDARD; - -#define PCI_BUS_INTERFACE_STANDARD_VERSION 1 - -#endif /* _PCIINTRF_X_ */ - -#if (NTDDI_VERSION >= NTDDI_WIN7) - -#define FILE_CHARACTERISTICS_EXPECT_ORDERLY_REMOVAL_EX 0x00004000 -#define FILE_CHARACTERISTICS_EXPECT_SURPRISE_REMOVAL_EX 0x00008000 -#define FILE_CHARACTERISTICS_REMOVAL_POLICY_MASK_EX \ - (FILE_CHARACTERISTICS_EXPECT_ORDERLY_REMOVAL_EX | \ - FILE_CHARACTERISTICS_EXPECT_SURPRISE_REMOVAL_EX) - -#define FILE_CHARACTERISTICS_EXPECT_ORDERLY_REMOVAL_DEPRECATED 0x00000200 -#define FILE_CHARACTERISTICS_EXPECT_SURPRISE_REMOVAL_DEPRECATED 0x00000300 -#define FILE_CHARACTERISTICS_REMOVAL_POLICY_MASK_DEPRECATED 0x00000300 - -#else - -#define FILE_CHARACTERISTICS_EXPECT_ORDERLY_REMOVAL 0x00000200 -#define FILE_CHARACTERISTICS_EXPECT_SURPRISE_REMOVAL 0x00000300 -#define FILE_CHARACTERISTICS_REMOVAL_POLICY_MASK 0x00000300 - -#define FILE_CHARACTERISTICS_EXPECT_ORDERLY_REMOVAL_EX FILE_CHARACTERISTICS_EXPECT_ORDERLY_REMOVAL -#define FILE_CHARACTERISTICS_EXPECT_SURPRISE_REMOVAL_EX FILE_CHARACTERISTICS_EXPECT_SURPRISE_REMOVAL -#define FILE_CHARACTERISTICS_REMOVAL_POLICY_MASK_EX FILE_CHARACTERISTICS_REMOVAL_POLICY_MASK - -#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ - -#define FILE_CHARACTERISTICS_PROPAGATED ( FILE_REMOVABLE_MEDIA | \ - FILE_READ_ONLY_DEVICE | \ - FILE_FLOPPY_DISKETTE | \ - FILE_WRITE_ONCE_MEDIA | \ - FILE_DEVICE_SECURE_OPEN ) - -typedef struct _FILE_ALIGNMENT_INFORMATION { - ULONG AlignmentRequirement; -} FILE_ALIGNMENT_INFORMATION, *PFILE_ALIGNMENT_INFORMATION; - -typedef struct _FILE_NAME_INFORMATION { - ULONG FileNameLength; - WCHAR FileName[1]; -} FILE_NAME_INFORMATION, *PFILE_NAME_INFORMATION; - - -typedef struct _FILE_ATTRIBUTE_TAG_INFORMATION { - ULONG FileAttributes; - ULONG ReparseTag; -} FILE_ATTRIBUTE_TAG_INFORMATION, *PFILE_ATTRIBUTE_TAG_INFORMATION; - -typedef struct _FILE_DISPOSITION_INFORMATION { - BOOLEAN DeleteFile; -} FILE_DISPOSITION_INFORMATION, *PFILE_DISPOSITION_INFORMATION; - -typedef struct _FILE_END_OF_FILE_INFORMATION { - LARGE_INTEGER EndOfFile; -} FILE_END_OF_FILE_INFORMATION, *PFILE_END_OF_FILE_INFORMATION; - -typedef struct _FILE_VALID_DATA_LENGTH_INFORMATION { - LARGE_INTEGER ValidDataLength; -} FILE_VALID_DATA_LENGTH_INFORMATION, *PFILE_VALID_DATA_LENGTH_INFORMATION; - -typedef struct _FILE_FS_LABEL_INFORMATION { - ULONG VolumeLabelLength; - WCHAR VolumeLabel[1]; -} FILE_FS_LABEL_INFORMATION, *PFILE_FS_LABEL_INFORMATION; - -typedef struct _FILE_FS_VOLUME_INFORMATION { - LARGE_INTEGER VolumeCreationTime; - ULONG VolumeSerialNumber; - ULONG VolumeLabelLength; - BOOLEAN SupportsObjects; - WCHAR VolumeLabel[1]; -} FILE_FS_VOLUME_INFORMATION, *PFILE_FS_VOLUME_INFORMATION; - -typedef struct _FILE_FS_SIZE_INFORMATION { - LARGE_INTEGER TotalAllocationUnits; - LARGE_INTEGER AvailableAllocationUnits; - ULONG SectorsPerAllocationUnit; - ULONG BytesPerSector; -} FILE_FS_SIZE_INFORMATION, *PFILE_FS_SIZE_INFORMATION; - -typedef struct _FILE_FS_FULL_SIZE_INFORMATION { - LARGE_INTEGER TotalAllocationUnits; - LARGE_INTEGER CallerAvailableAllocationUnits; - LARGE_INTEGER ActualAvailableAllocationUnits; - ULONG SectorsPerAllocationUnit; - ULONG BytesPerSector; -} FILE_FS_FULL_SIZE_INFORMATION, *PFILE_FS_FULL_SIZE_INFORMATION; - -typedef struct _FILE_FS_OBJECTID_INFORMATION { - UCHAR ObjectId[16]; - UCHAR ExtendedInfo[48]; -} FILE_FS_OBJECTID_INFORMATION, *PFILE_FS_OBJECTID_INFORMATION; - -typedef union _FILE_SEGMENT_ELEMENT { - PVOID64 Buffer; - ULONGLONG Alignment; -}FILE_SEGMENT_ELEMENT, *PFILE_SEGMENT_ELEMENT; - -#define IOCTL_AVIO_ALLOCATE_STREAM CTL_CODE(FILE_DEVICE_AVIO, 1, METHOD_BUFFERED, FILE_SPECIAL_ACCESS) -#define IOCTL_AVIO_FREE_STREAM CTL_CODE(FILE_DEVICE_AVIO, 2, METHOD_BUFFERED, FILE_SPECIAL_ACCESS) -#define IOCTL_AVIO_MODIFY_STREAM CTL_CODE(FILE_DEVICE_AVIO, 3, METHOD_BUFFERED, FILE_SPECIAL_ACCESS) - -typedef enum _BUS_DATA_TYPE { - ConfigurationSpaceUndefined = -1, - Cmos, - EisaConfiguration, - Pos, - CbusConfiguration, - PCIConfiguration, - VMEConfiguration, - NuBusConfiguration, - PCMCIAConfiguration, - MPIConfiguration, - MPSAConfiguration, - PNPISAConfiguration, - SgiInternalConfiguration, - MaximumBusDataType -} BUS_DATA_TYPE, *PBUS_DATA_TYPE; - -/* Hardware Abstraction Layer Types */ - -typedef BOOLEAN -(NTAPI *PHAL_RESET_DISPLAY_PARAMETERS)( - IN ULONG Columns, - IN ULONG Rows); - -typedef PBUS_HANDLER -(FASTCALL *pHalHandlerForBus)( - IN INTERFACE_TYPE InterfaceType, - IN ULONG BusNumber); - -typedef VOID -(FASTCALL *pHalReferenceBusHandler)( - IN PBUS_HANDLER BusHandler); - typedef enum _HAL_QUERY_INFORMATION_CLASS { HalInstalledBusInformation, HalProfileSourceInformation, @@ -1307,18 +355,92 @@ typedef enum _HAL_SET_INFORMATION_CLASS { HalProfileDpgoSourceInterruptHandler } HAL_SET_INFORMATION_CLASS, *PHAL_SET_INFORMATION_CLASS; -typedef NTSTATUS -(NTAPI *pHalQuerySystemInformation)( - IN HAL_QUERY_INFORMATION_CLASS InformationClass, - IN ULONG BufferSize, - IN OUT PVOID Buffer, - OUT PULONG ReturnedLength); +typedef struct _HAL_PROFILE_SOURCE_INTERVAL { + KPROFILE_SOURCE Source; + ULONG_PTR Interval; +} HAL_PROFILE_SOURCE_INTERVAL, *PHAL_PROFILE_SOURCE_INTERVAL; + +typedef struct _HAL_PROFILE_SOURCE_INFORMATION { + KPROFILE_SOURCE Source; + BOOLEAN Supported; + ULONG Interval; +} HAL_PROFILE_SOURCE_INFORMATION, *PHAL_PROFILE_SOURCE_INFORMATION; + +typedef struct _MAP_REGISTER_ENTRY { + PVOID MapRegister; + BOOLEAN WriteToDevice; +} MAP_REGISTER_ENTRY, *PMAP_REGISTER_ENTRY; + +typedef struct _DEBUG_DEVICE_ADDRESS { + UCHAR Type; + BOOLEAN Valid; + UCHAR Reserved[2]; + PUCHAR TranslatedAddress; + ULONG Length; +} DEBUG_DEVICE_ADDRESS, *PDEBUG_DEVICE_ADDRESS; + +typedef struct _DEBUG_MEMORY_REQUIREMENTS { + PHYSICAL_ADDRESS Start; + PHYSICAL_ADDRESS MaxEnd; + PVOID VirtualAddress; + ULONG Length; + BOOLEAN Cached; + BOOLEAN Aligned; +} DEBUG_MEMORY_REQUIREMENTS, *PDEBUG_MEMORY_REQUIREMENTS; + +typedef struct _DEBUG_DEVICE_DESCRIPTOR { + ULONG Bus; + ULONG Slot; + USHORT Segment; + USHORT VendorID; + USHORT DeviceID; + UCHAR BaseClass; + UCHAR SubClass; + UCHAR ProgIf; + BOOLEAN Initialized; + BOOLEAN Configured; + DEBUG_DEVICE_ADDRESS BaseAddress[6]; + DEBUG_MEMORY_REQUIREMENTS Memory; +} DEBUG_DEVICE_DESCRIPTOR, *PDEBUG_DEVICE_DESCRIPTOR; + +typedef struct _PM_DISPATCH_TABLE { + ULONG Signature; + ULONG Version; + PVOID Function[1]; +} PM_DISPATCH_TABLE, *PPM_DISPATCH_TABLE; + +typedef enum _RESOURCE_TRANSLATION_DIRECTION { + TranslateChildToParent, + TranslateParentToChild +} RESOURCE_TRANSLATION_DIRECTION; typedef NTSTATUS -(NTAPI *pHalSetSystemInformation)( - IN HAL_SET_INFORMATION_CLASS InformationClass, - IN ULONG BufferSize, - IN PVOID Buffer); +(NTAPI *PTRANSLATE_RESOURCE_HANDLER)( + IN OUT PVOID Context, + IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Source, + IN RESOURCE_TRANSLATION_DIRECTION Direction, + IN ULONG AlternativesCount OPTIONAL, + IN IO_RESOURCE_DESCRIPTOR Alternatives[], + IN PDEVICE_OBJECT PhysicalDeviceObject, + OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR Target); + +typedef NTSTATUS +(NTAPI *PTRANSLATE_RESOURCE_REQUIREMENTS_HANDLER)( + IN PVOID Context OPTIONAL, + IN PIO_RESOURCE_DESCRIPTOR Source, + IN PDEVICE_OBJECT PhysicalDeviceObject, + OUT PULONG TargetCount, + OUT PIO_RESOURCE_DESCRIPTOR *Target); + +typedef struct _TRANSLATOR_INTERFACE { + USHORT Size; + USHORT Version; + PVOID Context; + PINTERFACE_REFERENCE InterfaceReference; + PINTERFACE_DEREFERENCE InterfaceDereference; + PTRANSLATE_RESOURCE_HANDLER TranslateResources; + PTRANSLATE_RESOURCE_REQUIREMENTS_HANDLER TranslateResourceRequirements; +} TRANSLATOR_INTERFACE, *PTRANSLATOR_INTERFACE; typedef VOID (FASTCALL *pHalExamineMBR)( @@ -1349,6 +471,28 @@ typedef NTSTATUS IN ULONG NumberOfHeads, IN struct _DRIVE_LAYOUT_INFORMATION *PartitionBuffer); +typedef PBUS_HANDLER +(FASTCALL *pHalHandlerForBus)( + IN INTERFACE_TYPE InterfaceType, + IN ULONG BusNumber); + +typedef VOID +(FASTCALL *pHalReferenceBusHandler)( + IN PBUS_HANDLER BusHandler); + +typedef NTSTATUS +(NTAPI *pHalQuerySystemInformation)( + IN HAL_QUERY_INFORMATION_CLASS InformationClass, + IN ULONG BufferSize, + IN OUT PVOID Buffer, + OUT PULONG ReturnedLength); + +typedef NTSTATUS +(NTAPI *pHalSetSystemInformation)( + IN HAL_SET_INFORMATION_CLASS InformationClass, + IN ULONG BufferSize, + IN PVOID Buffer); + typedef NTSTATUS (NTAPI *pHalQueryBusSlots)( IN PBUS_HANDLER BusHandler, @@ -1360,12 +504,6 @@ typedef NTSTATUS (NTAPI *pHalInitPnpDriver)( VOID); -typedef struct _PM_DISPATCH_TABLE { - ULONG Signature; - ULONG Version; - PVOID Function[1]; -} PM_DISPATCH_TABLE, *PPM_DISPATCH_TABLE; - typedef NTSTATUS (NTAPI *pHalInitPowerManagement)( IN PPM_DISPATCH_TABLE PmDriverDispatchTable, @@ -1405,7 +543,12 @@ typedef NTSTATUS IN PHYSICAL_ADDRESS PhysicalAddress, IN LARGE_INTEGER NumberOfBytes); -typedef BOOLEAN +typedef VOID +(NTAPI *pHalEndOfBoot)( + VOID); + +typedef +BOOLEAN (NTAPI *pHalTranslateBusAddress)( IN INTERFACE_TYPE InterfaceType, IN ULONG BusNumber, @@ -1413,7 +556,8 @@ typedef BOOLEAN IN OUT PULONG AddressSpace, OUT PPHYSICAL_ADDRESS TranslatedAddress); -typedef NTSTATUS +typedef +NTSTATUS (NTAPI *pHalAssignSlotResources)( IN PUNICODE_STRING RegistryPath, IN PUNICODE_STRING DriverClassName OPTIONAL, @@ -1424,24 +568,23 @@ typedef NTSTATUS IN ULONG SlotNumber, IN OUT PCM_RESOURCE_LIST *AllocatedResources); -typedef VOID +typedef +VOID (NTAPI *pHalHaltSystem)( VOID); -typedef BOOLEAN +typedef +BOOLEAN (NTAPI *pHalResetDisplay)( VOID); -typedef struct _MAP_REGISTER_ENTRY { - PVOID MapRegister; - BOOLEAN WriteToDevice; -} MAP_REGISTER_ENTRY, *PMAP_REGISTER_ENTRY; - -typedef UCHAR +typedef +UCHAR (NTAPI *pHalVectorToIDTEntry)( ULONG Vector); -typedef BOOLEAN +typedef +BOOLEAN (NTAPI *pHalFindBusAddressTranslation)( IN PHYSICAL_ADDRESS BusAddress, IN OUT PULONG AddressSpace, @@ -1449,33 +592,94 @@ typedef BOOLEAN IN OUT PULONG_PTR Context, IN BOOLEAN NextBus); -typedef VOID -(NTAPI *pHalEndOfBoot)( - VOID); +typedef +NTSTATUS +(NTAPI *pKdSetupPciDeviceForDebugging)( + IN PVOID LoaderBlock OPTIONAL, + IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice); -typedef PVOID +typedef +NTSTATUS +(NTAPI *pKdReleasePciDeviceForDebugging)( + IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice); + +typedef +PVOID +(NTAPI *pKdGetAcpiTablePhase0)( + IN struct _LOADER_PARAMETER_BLOCK *LoaderBlock, + IN ULONG Signature); + +typedef +PVOID (NTAPI *pHalGetAcpiTable)( IN ULONG Signature, IN PCSTR OemId OPTIONAL, IN PCSTR OemTableId OPTIONAL); -#if defined(_IA64_) -typedef NTSTATUS -(*pHalGetErrorCapList)( - IN OUT PULONG CapsListLength, - IN OUT PUCHAR ErrorCapList); +typedef +VOID +(NTAPI *pKdCheckPowerButton)( + VOID); -typedef NTSTATUS -(*pHalInjectError)( - IN ULONG BufferLength, - IN PUCHAR Buffer); +#if (NTDDI_VERSION >= NTDDI_VISTA) +typedef +PVOID +(NTAPI *pKdMapPhysicalMemory64)( + IN PHYSICAL_ADDRESS PhysicalAddress, + IN ULONG NumberPages, + IN BOOLEAN FlushCurrentTLB); + +typedef +VOID +(NTAPI *pKdUnmapVirtualAddress)( + IN PVOID VirtualAddress, + IN ULONG NumberPages, + IN BOOLEAN FlushCurrentTLB); +#else +typedef +PVOID +(NTAPI *pKdMapPhysicalMemory64)( + IN PHYSICAL_ADDRESS PhysicalAddress, + IN ULONG NumberPages); + +typedef +VOID +(NTAPI *pKdUnmapVirtualAddress)( + IN PVOID VirtualAddress, + IN ULONG NumberPages); #endif -typedef VOID + +typedef +ULONG +(NTAPI *pKdGetPciDataByOffset)( + IN ULONG BusNumber, + IN ULONG SlotNumber, + OUT PVOID Buffer, + IN ULONG Offset, + IN ULONG Length); + +typedef +ULONG +(NTAPI *pKdSetPciDataByOffset)( + IN ULONG BusNumber, + IN ULONG SlotNumber, + IN PVOID Buffer, + IN ULONG Offset, + IN ULONG Length); + +typedef BOOLEAN +(NTAPI *PHAL_RESET_DISPLAY_PARAMETERS)( + IN ULONG Columns, + IN ULONG Rows); + +typedef +VOID (NTAPI *PCI_ERROR_HANDLER_CALLBACK)( VOID); -typedef VOID +typedef +VOID (NTAPI *pHalSetPciErrorHandlerCallback)( IN PCI_ERROR_HANDLER_CALLBACK Callback); @@ -1549,706 +753,78 @@ extern NTKERNELAPI HAL_DISPATCH HalDispatchTable; #define HalMirrorPhysicalMemory HALDISPATCH->HalMirrorPhysicalMemory #define HalEndOfBoot HALDISPATCH->HalEndOfBoot #define HalMirrorVerify HALDISPATCH->HalMirrorVerify -#define HalGetCachedAcpiTable HALDISPATCH->HalGetCachedAcpiTable -#define HalSetPciErrorHandlerCallback HALDISPATCH->HalSetPciErrorHandlerCallback -#if defined(_IA64_) -#define HalGetErrorCapList HALDISPATCH->HalGetErrorCapList -#define HalInjectError HALDISPATCH->HalInjectError + +typedef struct _FILE_ALIGNMENT_INFORMATION { + ULONG AlignmentRequirement; +} FILE_ALIGNMENT_INFORMATION, *PFILE_ALIGNMENT_INFORMATION; + +typedef struct _FILE_NAME_INFORMATION { + ULONG FileNameLength; + WCHAR FileName[1]; +} FILE_NAME_INFORMATION, *PFILE_NAME_INFORMATION; + + +typedef struct _FILE_ATTRIBUTE_TAG_INFORMATION { + ULONG FileAttributes; + ULONG ReparseTag; +} FILE_ATTRIBUTE_TAG_INFORMATION, *PFILE_ATTRIBUTE_TAG_INFORMATION; + +typedef struct _FILE_DISPOSITION_INFORMATION { + BOOLEAN DeleteFile; +} FILE_DISPOSITION_INFORMATION, *PFILE_DISPOSITION_INFORMATION; + +typedef struct _FILE_END_OF_FILE_INFORMATION { + LARGE_INTEGER EndOfFile; +} FILE_END_OF_FILE_INFORMATION, *PFILE_END_OF_FILE_INFORMATION; + +typedef struct _FILE_VALID_DATA_LENGTH_INFORMATION { + LARGE_INTEGER ValidDataLength; +} FILE_VALID_DATA_LENGTH_INFORMATION, *PFILE_VALID_DATA_LENGTH_INFORMATION; + +typedef union _FILE_SEGMENT_ELEMENT { + PVOID64 Buffer; + ULONGLONG Alignment; +}FILE_SEGMENT_ELEMENT, *PFILE_SEGMENT_ELEMENT; + +#define SE_UNSOLICITED_INPUT_PRIVILEGE 6 + +#if (NTDDI_VERSION >= NTDDI_WIN2K) +NTSYSAPI +ULONGLONG +NTAPI +VerSetConditionMask( + IN ULONGLONG ConditionMask, + IN ULONG TypeMask, + IN UCHAR Condition); #endif -typedef struct _HAL_BUS_INFORMATION { - INTERFACE_TYPE BusType; - BUS_DATA_TYPE ConfigurationType; - ULONG BusNumber; - ULONG Reserved; -} HAL_BUS_INFORMATION, *PHAL_BUS_INFORMATION; - -typedef struct _HAL_PROFILE_SOURCE_INFORMATION { - KPROFILE_SOURCE Source; - BOOLEAN Supported; - ULONG Interval; -} HAL_PROFILE_SOURCE_INFORMATION, *PHAL_PROFILE_SOURCE_INFORMATION; - -typedef struct _HAL_PROFILE_SOURCE_INFORMATION_EX { - KPROFILE_SOURCE Source; - BOOLEAN Supported; - ULONG_PTR Interval; - ULONG_PTR DefInterval; - ULONG_PTR MaxInterval; - ULONG_PTR MinInterval; -} HAL_PROFILE_SOURCE_INFORMATION_EX, *PHAL_PROFILE_SOURCE_INFORMATION_EX; - -typedef struct _HAL_PROFILE_SOURCE_INTERVAL { - KPROFILE_SOURCE Source; - ULONG_PTR Interval; -} HAL_PROFILE_SOURCE_INTERVAL, *PHAL_PROFILE_SOURCE_INTERVAL; - -typedef struct _HAL_PROFILE_SOURCE_LIST { - KPROFILE_SOURCE Source; - PWSTR Description; -} HAL_PROFILE_SOURCE_LIST, *PHAL_PROFILE_SOURCE_LIST; - -typedef enum _HAL_DISPLAY_BIOS_INFORMATION { - HalDisplayInt10Bios, - HalDisplayEmulatedBios, - HalDisplayNoBios -} HAL_DISPLAY_BIOS_INFORMATION, *PHAL_DISPLAY_BIOS_INFORMATION; - -typedef struct _HAL_POWER_INFORMATION { - ULONG TBD; -} HAL_POWER_INFORMATION, *PHAL_POWER_INFORMATION; - -typedef struct _HAL_PROCESSOR_SPEED_INFO { - ULONG ProcessorSpeed; -} HAL_PROCESSOR_SPEED_INFORMATION, *PHAL_PROCESSOR_SPEED_INFORMATION; - -typedef struct _HAL_CALLBACKS { - PCALLBACK_OBJECT SetSystemInformation; - PCALLBACK_OBJECT BusCheck; -} HAL_CALLBACKS, *PHAL_CALLBACKS; - -typedef struct _HAL_PROCESSOR_FEATURE { - ULONG UsableFeatureBits; -} HAL_PROCESSOR_FEATURE; - -typedef NTSTATUS -(NTAPI *PHALIOREADWRITEHANDLER)( - IN BOOLEAN fRead, - IN ULONG dwAddr, - IN ULONG dwSize, - IN OUT PULONG pdwData); - -typedef struct _HAL_AMLI_BAD_IO_ADDRESS_LIST { - ULONG BadAddrBegin; - ULONG BadAddrSize; - ULONG OSVersionTrigger; - PHALIOREADWRITEHANDLER IOHandler; -} HAL_AMLI_BAD_IO_ADDRESS_LIST, *PHAL_AMLI_BAD_IO_ADDRESS_LIST; - -#if defined(_X86_) || defined(_IA64_) || defined(_AMD64_) - -typedef VOID -(NTAPI *PHALMCAINTERFACELOCK)( - VOID); - -typedef VOID -(NTAPI *PHALMCAINTERFACEUNLOCK)( - VOID); - -typedef NTSTATUS -(NTAPI *PHALMCAINTERFACEREADREGISTER)( - IN UCHAR BankNumber, - IN OUT PVOID Exception); - -typedef struct _HAL_MCA_INTERFACE { - PHALMCAINTERFACELOCK Lock; - PHALMCAINTERFACEUNLOCK Unlock; - PHALMCAINTERFACEREADREGISTER ReadRegister; -} HAL_MCA_INTERFACE; - -typedef enum { - ApicDestinationModePhysical = 1, - ApicDestinationModeLogicalFlat, - ApicDestinationModeLogicalClustered, - ApicDestinationModeUnknown -} HAL_APIC_DESTINATION_MODE, *PHAL_APIC_DESTINATION_MODE; - -#if defined(_AMD64_) - -struct _KTRAP_FRAME; -struct _KEXCEPTION_FRAME; - -typedef ERROR_SEVERITY -(NTAPI *PDRIVER_EXCPTN_CALLBACK)( - IN PVOID Context, - IN struct _KTRAP_FRAME *TrapFrame, - IN struct _KEXCEPTION_FRAME *ExceptionFrame, - IN PMCA_EXCEPTION Exception); - -#endif - -#if defined(_X86_) || defined(_IA64_) -typedef -#if defined(_IA64_) -ERROR_SEVERITY -#else -VOID -#endif -(NTAPI *PDRIVER_EXCPTN_CALLBACK)( - IN PVOID Context, - IN PMCA_EXCEPTION BankLog); -#endif - -typedef PDRIVER_EXCPTN_CALLBACK PDRIVER_MCA_EXCEPTION_CALLBACK; - -typedef struct _MCA_DRIVER_INFO { - PDRIVER_MCA_EXCEPTION_CALLBACK ExceptionCallback; - PKDEFERRED_ROUTINE DpcCallback; - PVOID DeviceContext; -} MCA_DRIVER_INFO, *PMCA_DRIVER_INFO; - -typedef struct _HAL_ERROR_INFO { - ULONG Version; - ULONG InitMaxSize; - ULONG McaMaxSize; - ULONG McaPreviousEventsCount; - ULONG McaCorrectedEventsCount; - ULONG McaKernelDeliveryFails; - ULONG McaDriverDpcQueueFails; - ULONG McaReserved; - ULONG CmcMaxSize; - ULONG CmcPollingInterval; - ULONG CmcInterruptsCount; - ULONG CmcKernelDeliveryFails; - ULONG CmcDriverDpcQueueFails; - ULONG CmcGetStateFails; - ULONG CmcClearStateFails; - ULONG CmcReserved; - ULONGLONG CmcLogId; - ULONG CpeMaxSize; - ULONG CpePollingInterval; - ULONG CpeInterruptsCount; - ULONG CpeKernelDeliveryFails; - ULONG CpeDriverDpcQueueFails; - ULONG CpeGetStateFails; - ULONG CpeClearStateFails; - ULONG CpeInterruptSources; - ULONGLONG CpeLogId; - ULONGLONG KernelReserved[4]; -} HAL_ERROR_INFO, *PHAL_ERROR_INFO; - -#define HAL_MCE_INTERRUPTS_BASED ((ULONG)-1) -#define HAL_MCE_DISABLED ((ULONG)0) - -#define HAL_CMC_INTERRUPTS_BASED HAL_MCE_INTERRUPTS_BASED -#define HAL_CMC_DISABLED HAL_MCE_DISABLED - -#define HAL_CPE_INTERRUPTS_BASED HAL_MCE_INTERRUPTS_BASED -#define HAL_CPE_DISABLED HAL_MCE_DISABLED - -#define HAL_MCA_INTERRUPTS_BASED HAL_MCE_INTERRUPTS_BASED -#define HAL_MCA_DISABLED HAL_MCE_DISABLED - -typedef VOID -(NTAPI *PDRIVER_CMC_EXCEPTION_CALLBACK)( - IN PVOID Context, - IN PCMC_EXCEPTION CmcLog); - -typedef VOID -(NTAPI *PDRIVER_CPE_EXCEPTION_CALLBACK)( - IN PVOID Context, - IN PCPE_EXCEPTION CmcLog); - -typedef struct _CMC_DRIVER_INFO { - PDRIVER_CMC_EXCEPTION_CALLBACK ExceptionCallback; - PKDEFERRED_ROUTINE DpcCallback; - PVOID DeviceContext; -} CMC_DRIVER_INFO, *PCMC_DRIVER_INFO; - -typedef struct _CPE_DRIVER_INFO { - PDRIVER_CPE_EXCEPTION_CALLBACK ExceptionCallback; - PKDEFERRED_ROUTINE DpcCallback; - PVOID DeviceContext; -} CPE_DRIVER_INFO, *PCPE_DRIVER_INFO; - -#endif // defined(_X86_) || defined(_IA64_) || defined(_AMD64_) - -#if defined(_IA64_) - -typedef NTSTATUS -(*HALSENDCROSSPARTITIONIPI)( - IN USHORT ProcessorID, - IN UCHAR HardwareVector); - -typedef NTSTATUS -(*HALRESERVECROSSPARTITIONINTERRUPTVECTOR)( - OUT PULONG Vector, - OUT PKIRQL Irql, - IN OUT PGROUP_AFFINITY Affinity, - OUT PUCHAR HardwareVector); - -typedef VOID -(*HALFREECROSSPARTITIONINTERRUPTVECTOR)( - IN ULONG Vector, - IN PGROUP_AFFINITY Affinity); - -typedef struct _HAL_CROSS_PARTITION_IPI_INTERFACE { - HALSENDCROSSPARTITIONIPI HalSendCrossPartitionIpi; - HALRESERVECROSSPARTITIONINTERRUPTVECTOR HalReserveCrossPartitionInterruptVector; - HALFREECROSSPARTITIONINTERRUPTVECTOR HalFreeCrossPartitionInterruptVector; -} HAL_CROSS_PARTITION_IPI_INTERFACE; - -#define HAL_CROSS_PARTITION_IPI_INTERFACE_MINIMUM_SIZE \ - FIELD_OFFSET(HAL_CROSS_PARTITION_IPI_INTERFACE, \ - HalFreeCrossPartitionInterruptVector) - -#endif /* defined(_IA64_) */ - -typedef struct _HAL_PLATFORM_INFORMATION { - ULONG PlatformFlags; -} HAL_PLATFORM_INFORMATION, *PHAL_PLATFORM_INFORMATION; - -#define HAL_PLATFORM_DISABLE_WRITE_COMBINING 0x01L -#define HAL_PLATFORM_DISABLE_PTCG 0x04L -#define HAL_PLATFORM_DISABLE_UC_MAIN_MEMORY 0x08L -#define HAL_PLATFORM_ENABLE_WRITE_COMBINING_MMIO 0x10L -#define HAL_PLATFORM_ACPI_TABLES_CACHED 0x20L - -/****************************************************************************** - * Kernel Types * - ******************************************************************************/ - -#define NX_SUPPORT_POLICY_ALWAYSOFF 0 -#define NX_SUPPORT_POLICY_ALWAYSON 1 -#define NX_SUPPORT_POLICY_OPTIN 2 -#define NX_SUPPORT_POLICY_OPTOUT 3 - -typedef VOID -(NTAPI *PEXPAND_STACK_CALLOUT)( - IN PVOID Parameter OPTIONAL); - -typedef VOID -(NTAPI *PTIMER_APC_ROUTINE)( - IN PVOID TimerContext, - IN ULONG TimerLowValue, - IN LONG TimerHighValue); - -typedef enum _TIMER_SET_INFORMATION_CLASS { - TimerSetCoalescableTimer, - MaxTimerInfoClass -} TIMER_SET_INFORMATION_CLASS; - -#if (NTDDI_VERSION >= NTDDI_WIN7) -typedef struct _TIMER_SET_COALESCABLE_TIMER_INFO { - IN LARGE_INTEGER DueTime; - IN PTIMER_APC_ROUTINE TimerApcRoutine OPTIONAL; - IN PVOID TimerContext OPTIONAL; - IN struct _COUNTED_REASON_CONTEXT *WakeContext OPTIONAL; - IN ULONG Period OPTIONAL; - IN ULONG TolerableDelay; - OUT PBOOLEAN PreviousState OPTIONAL; -} TIMER_SET_COALESCABLE_TIMER_INFO, *PTIMER_SET_COALESCABLE_TIMER_INFO; -#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ - -#define XSTATE_LEGACY_FLOATING_POINT 0 -#define XSTATE_LEGACY_SSE 1 -#define XSTATE_GSSE 2 - -#define XSTATE_MASK_LEGACY_FLOATING_POINT (1i64 << (XSTATE_LEGACY_FLOATING_POINT)) -#define XSTATE_MASK_LEGACY_SSE (1i64 << (XSTATE_LEGACY_SSE)) -#define XSTATE_MASK_LEGACY (XSTATE_MASK_LEGACY_FLOATING_POINT | XSTATE_MASK_LEGACY_SSE) -#define XSTATE_MASK_GSSE (1i64 << (XSTATE_GSSE)) - -#define MAXIMUM_XSTATE_FEATURES 64 - -typedef struct _XSTATE_FEATURE { - ULONG Offset; - ULONG Size; -} XSTATE_FEATURE, *PXSTATE_FEATURE; - -typedef struct _XSTATE_CONFIGURATION { - ULONG64 EnabledFeatures; - ULONG Size; - ULONG OptimizedSave:1; - XSTATE_FEATURE Features[MAXIMUM_XSTATE_FEATURES]; -} XSTATE_CONFIGURATION, *PXSTATE_CONFIGURATION; - -#define MAX_WOW64_SHARED_ENTRIES 16 - -typedef struct _KUSER_SHARED_DATA { - ULONG TickCountLowDeprecated; - ULONG TickCountMultiplier; - volatile KSYSTEM_TIME InterruptTime; - volatile KSYSTEM_TIME SystemTime; - volatile KSYSTEM_TIME TimeZoneBias; - USHORT ImageNumberLow; - USHORT ImageNumberHigh; - WCHAR NtSystemRoot[260]; - ULONG MaxStackTraceDepth; - ULONG CryptoExponent; - ULONG TimeZoneId; - ULONG LargePageMinimum; - ULONG Reserved2[7]; - NT_PRODUCT_TYPE NtProductType; - BOOLEAN ProductTypeIsValid; - ULONG NtMajorVersion; - ULONG NtMinorVersion; - BOOLEAN ProcessorFeatures[PROCESSOR_FEATURE_MAX]; - ULONG Reserved1; - ULONG Reserved3; - volatile ULONG TimeSlip; - ALTERNATIVE_ARCHITECTURE_TYPE AlternativeArchitecture; - ULONG AltArchitecturePad[1]; - LARGE_INTEGER SystemExpirationDate; - ULONG SuiteMask; - BOOLEAN KdDebuggerEnabled; -#if (NTDDI_VERSION >= NTDDI_WINXPSP2) - UCHAR NXSupportPolicy; -#endif - volatile ULONG ActiveConsoleId; - volatile ULONG DismountCount; - ULONG ComPlusPackage; - ULONG LastSystemRITEventTickCount; - ULONG NumberOfPhysicalPages; - BOOLEAN SafeBootMode; -#if (NTDDI_VERSION >= NTDDI_WIN7) - union { - UCHAR TscQpcData; - struct { - UCHAR TscQpcEnabled:1; - UCHAR TscQpcSpareFlag:1; - UCHAR TscQpcShift:6; - } DUMMYSTRUCTNAME; - } DUMMYUNIONNAME; - UCHAR TscQpcPad[2]; -#endif -#if (NTDDI_VERSION >= NTDDI_VISTA) - union { - ULONG SharedDataFlags; - struct { - ULONG DbgErrorPortPresent:1; - ULONG DbgElevationEnabled:1; - ULONG DbgVirtEnabled:1; - ULONG DbgInstallerDetectEnabled:1; - ULONG DbgSystemDllRelocated:1; - ULONG DbgDynProcessorEnabled:1; - ULONG DbgSEHValidationEnabled:1; - ULONG SpareBits:25; - } DUMMYSTRUCTNAME2; - } DUMMYUNIONNAME2; -#else - ULONG TraceLogging; -#endif - ULONG DataFlagsPad[1]; - ULONGLONG TestRetInstruction; - ULONG SystemCall; - ULONG SystemCallReturn; - ULONGLONG SystemCallPad[3]; - _ANONYMOUS_UNION union { - volatile KSYSTEM_TIME TickCount; - volatile ULONG64 TickCountQuad; - _ANONYMOUS_STRUCT struct { - ULONG ReservedTickCountOverlay[3]; - ULONG TickCountPad[1]; - } DUMMYSTRUCTNAME; - } DUMMYUNIONNAME3; - ULONG Cookie; - ULONG CookiePad[1]; -#if (NTDDI_VERSION >= NTDDI_WS03) - LONGLONG ConsoleSessionForegroundProcessId; - ULONG Wow64SharedInformation[MAX_WOW64_SHARED_ENTRIES]; -#endif -#if (NTDDI_VERSION >= NTDDI_VISTA) -#if (NTDDI_VERSION >= NTDDI_WIN7) - USHORT UserModeGlobalLogger[16]; -#else - USHORT UserModeGlobalLogger[8]; - ULONG HeapTracingPid[2]; - ULONG CritSecTracingPid[2]; -#endif - ULONG ImageFileExecutionOptions; -#if (NTDDI_VERSION >= NTDDI_VISTASP1) - ULONG LangGenerationCount; -#else - /* 4 bytes padding */ -#endif - ULONGLONG Reserved5; - volatile ULONG64 InterruptTimeBias; -#endif -#if (NTDDI_VERSION >= NTDDI_WIN7) - volatile ULONG64 TscQpcBias; - volatile ULONG ActiveProcessorCount; - volatile USHORT ActiveGroupCount; - USHORT Reserved4; - volatile ULONG AitSamplingValue; - volatile ULONG AppCompatFlag; - ULONGLONG SystemDllNativeRelocation; - ULONG SystemDllWowRelocation; - ULONG XStatePad[1]; - XSTATE_CONFIGURATION XState; -#endif -} KUSER_SHARED_DATA, *PKUSER_SHARED_DATA; - -#if (NTDDI_VERSION >= NTDDI_VISTA) -extern NTSYSAPI volatile CCHAR KeNumberProcessors; -#elif (NTDDI_VERSION >= NTDDI_WINXP) -extern NTSYSAPI CCHAR KeNumberProcessors; -#else -extern PCCHAR KeNumberProcessors; -#endif - - -/****************************************************************************** - * Kernel Debugger Types * - ******************************************************************************/ -typedef struct _DEBUG_DEVICE_ADDRESS { - UCHAR Type; - BOOLEAN Valid; - UCHAR Reserved[2]; - PUCHAR TranslatedAddress; - ULONG Length; -} DEBUG_DEVICE_ADDRESS, *PDEBUG_DEVICE_ADDRESS; - -typedef struct _DEBUG_MEMORY_REQUIREMENTS { - PHYSICAL_ADDRESS Start; - PHYSICAL_ADDRESS MaxEnd; - PVOID VirtualAddress; - ULONG Length; - BOOLEAN Cached; - BOOLEAN Aligned; -} DEBUG_MEMORY_REQUIREMENTS, *PDEBUG_MEMORY_REQUIREMENTS; - -typedef struct _DEBUG_DEVICE_DESCRIPTOR { - ULONG Bus; - ULONG Slot; - USHORT Segment; - USHORT VendorID; - USHORT DeviceID; - UCHAR BaseClass; - UCHAR SubClass; - UCHAR ProgIf; - BOOLEAN Initialized; - BOOLEAN Configured; - DEBUG_DEVICE_ADDRESS BaseAddress[6]; - DEBUG_MEMORY_REQUIREMENTS Memory; -} DEBUG_DEVICE_DESCRIPTOR, *PDEBUG_DEVICE_DESCRIPTOR; - -typedef NTSTATUS -(NTAPI *pKdSetupPciDeviceForDebugging)( - IN PVOID LoaderBlock OPTIONAL, - IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice); - -typedef NTSTATUS -(NTAPI *pKdReleasePciDeviceForDebugging)( - IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice); - -typedef PVOID -(NTAPI *pKdGetAcpiTablePhase0)( - IN struct _LOADER_PARAMETER_BLOCK *LoaderBlock, - IN ULONG Signature); - -typedef VOID -(NTAPI *pKdCheckPowerButton)( - VOID); - -#if (NTDDI_VERSION >= NTDDI_VISTA) -typedef PVOID -(NTAPI *pKdMapPhysicalMemory64)( - IN PHYSICAL_ADDRESS PhysicalAddress, - IN ULONG NumberPages, - IN BOOLEAN FlushCurrentTLB); - -typedef VOID -(NTAPI *pKdUnmapVirtualAddress)( - IN PVOID VirtualAddress, - IN ULONG NumberPages, - IN BOOLEAN FlushCurrentTLB); -#else -typedef PVOID -(NTAPI *pKdMapPhysicalMemory64)( - IN PHYSICAL_ADDRESS PhysicalAddress, - IN ULONG NumberPages); - -typedef VOID -(NTAPI *pKdUnmapVirtualAddress)( - IN PVOID VirtualAddress, - IN ULONG NumberPages); -#endif - -typedef ULONG -(NTAPI *pKdGetPciDataByOffset)( - IN ULONG BusNumber, - IN ULONG SlotNumber, - OUT PVOID Buffer, - IN ULONG Offset, - IN ULONG Length); - -typedef ULONG -(NTAPI *pKdSetPciDataByOffset)( - IN ULONG BusNumber, - IN ULONG SlotNumber, - IN PVOID Buffer, - IN ULONG Offset, - IN ULONG Length); -/****************************************************************************** - * Memory manager Types * - ******************************************************************************/ - -typedef struct _PHYSICAL_MEMORY_RANGE { - PHYSICAL_ADDRESS BaseAddress; - LARGE_INTEGER NumberOfBytes; -} PHYSICAL_MEMORY_RANGE, *PPHYSICAL_MEMORY_RANGE; - -typedef NTSTATUS -(NTAPI *PMM_ROTATE_COPY_CALLBACK_FUNCTION)( - IN PMDL DestinationMdl, - IN PMDL SourceMdl, - IN PVOID Context); - -typedef enum _MM_ROTATE_DIRECTION { - MmToFrameBuffer, - MmToFrameBufferNoCopy, - MmToRegularMemory, - MmToRegularMemoryNoCopy, - MmMaximumRotateDirection -} MM_ROTATE_DIRECTION, *PMM_ROTATE_DIRECTION; - - -/****************************************************************************** - * Process Manager Types * - ******************************************************************************/ - -#define QUOTA_LIMITS_HARDWS_MIN_ENABLE 0x00000001 -#define QUOTA_LIMITS_HARDWS_MIN_DISABLE 0x00000002 -#define QUOTA_LIMITS_HARDWS_MAX_ENABLE 0x00000004 -#define QUOTA_LIMITS_HARDWS_MAX_DISABLE 0x00000008 -#define QUOTA_LIMITS_USE_DEFAULT_LIMITS 0x00000010 - -typedef struct _QUOTA_LIMITS { - SIZE_T PagedPoolLimit; - SIZE_T NonPagedPoolLimit; - SIZE_T MinimumWorkingSetSize; - SIZE_T MaximumWorkingSetSize; - SIZE_T PagefileLimit; - LARGE_INTEGER TimeLimit; -} QUOTA_LIMITS, *PQUOTA_LIMITS; - -typedef union _RATE_QUOTA_LIMIT { - ULONG RateData; - struct { - ULONG RatePercent:7; - ULONG Reserved0:25; - } DUMMYSTRUCTNAME; -} RATE_QUOTA_LIMIT, *PRATE_QUOTA_LIMIT; - -typedef struct _QUOTA_LIMITS_EX { - SIZE_T PagedPoolLimit; - SIZE_T NonPagedPoolLimit; - SIZE_T MinimumWorkingSetSize; - SIZE_T MaximumWorkingSetSize; - SIZE_T PagefileLimit; - LARGE_INTEGER TimeLimit; - SIZE_T WorkingSetLimit; - SIZE_T Reserved2; - SIZE_T Reserved3; - SIZE_T Reserved4; - ULONG Flags; - RATE_QUOTA_LIMIT CpuRateLimit; -} QUOTA_LIMITS_EX, *PQUOTA_LIMITS_EX; - -typedef struct _IO_COUNTERS { - ULONGLONG ReadOperationCount; - ULONGLONG WriteOperationCount; - ULONGLONG OtherOperationCount; - ULONGLONG ReadTransferCount; - ULONGLONG WriteTransferCount; - ULONGLONG OtherTransferCount; -} IO_COUNTERS, *PIO_COUNTERS; - -typedef struct _VM_COUNTERS { - SIZE_T PeakVirtualSize; - SIZE_T VirtualSize; - ULONG PageFaultCount; - SIZE_T PeakWorkingSetSize; - SIZE_T WorkingSetSize; - SIZE_T QuotaPeakPagedPoolUsage; - SIZE_T QuotaPagedPoolUsage; - SIZE_T QuotaPeakNonPagedPoolUsage; - SIZE_T QuotaNonPagedPoolUsage; - SIZE_T PagefileUsage; - SIZE_T PeakPagefileUsage; -} VM_COUNTERS, *PVM_COUNTERS; - -typedef struct _VM_COUNTERS_EX { - SIZE_T PeakVirtualSize; - SIZE_T VirtualSize; - ULONG PageFaultCount; - SIZE_T PeakWorkingSetSize; - SIZE_T WorkingSetSize; - SIZE_T QuotaPeakPagedPoolUsage; - SIZE_T QuotaPagedPoolUsage; - SIZE_T QuotaPeakNonPagedPoolUsage; - SIZE_T QuotaNonPagedPoolUsage; - SIZE_T PagefileUsage; - SIZE_T PeakPagefileUsage; - SIZE_T PrivateUsage; -} VM_COUNTERS_EX, *PVM_COUNTERS_EX; - -#define MAX_HW_COUNTERS 16 -#define THREAD_PROFILING_FLAG_DISPATCH 0x00000001 - -typedef enum _HARDWARE_COUNTER_TYPE { - PMCCounter, - MaxHardwareCounterType -} HARDWARE_COUNTER_TYPE, *PHARDWARE_COUNTER_TYPE; - -typedef struct _HARDWARE_COUNTER { - HARDWARE_COUNTER_TYPE Type; - ULONG Reserved; - ULONG64 Index; -} HARDWARE_COUNTER, *PHARDWARE_COUNTER; - -typedef struct _POOLED_USAGE_AND_LIMITS { - SIZE_T PeakPagedPoolUsage; - SIZE_T PagedPoolUsage; - SIZE_T PagedPoolLimit; - SIZE_T PeakNonPagedPoolUsage; - SIZE_T NonPagedPoolUsage; - SIZE_T NonPagedPoolLimit; - SIZE_T PeakPagefileUsage; - SIZE_T PagefileUsage; - SIZE_T PagefileLimit; -} POOLED_USAGE_AND_LIMITS, *PPOOLED_USAGE_AND_LIMITS; - -typedef struct _PROCESS_ACCESS_TOKEN { - HANDLE Token; - HANDLE Thread; -} PROCESS_ACCESS_TOKEN, *PPROCESS_ACCESS_TOKEN; - -#define PROCESS_EXCEPTION_PORT_ALL_STATE_BITS 0x00000003UL -#define PROCESS_EXCEPTION_PORT_ALL_STATE_FLAGS ((ULONG_PTR)((1UL << PROCESS_EXCEPTION_PORT_ALL_STATE_BITS) - 1)) - -typedef struct _PROCESS_EXCEPTION_PORT { - IN HANDLE ExceptionPortHandle; - IN OUT ULONG StateFlags; -} PROCESS_EXCEPTION_PORT, *PPROCESS_EXCEPTION_PORT; - -typedef VOID -(NTAPI *PCREATE_PROCESS_NOTIFY_ROUTINE)( - IN HANDLE ParentId, - IN HANDLE ProcessId, - IN BOOLEAN Create); - -typedef struct _PS_CREATE_NOTIFY_INFO { - IN SIZE_T Size; - union { - IN ULONG Flags; - struct { - IN ULONG FileOpenNameAvailable:1; - IN ULONG Reserved:31; - }; - }; - IN HANDLE ParentProcessId; - IN CLIENT_ID CreatingThreadId; - IN OUT struct _FILE_OBJECT *FileObject; - IN PCUNICODE_STRING ImageFileName; - IN PCUNICODE_STRING CommandLine OPTIONAL; - IN OUT NTSTATUS CreationStatus; -} PS_CREATE_NOTIFY_INFO, *PPS_CREATE_NOTIFY_INFO; - -typedef VOID -(NTAPI *PCREATE_PROCESS_NOTIFY_ROUTINE_EX)( - IN OUT PEPROCESS Process, - IN HANDLE ProcessId, - IN PPS_CREATE_NOTIFY_INFO CreateInfo OPTIONAL); - -typedef VOID -(NTAPI *PCREATE_THREAD_NOTIFY_ROUTINE)( - IN HANDLE ProcessId, - IN HANDLE ThreadId, - IN BOOLEAN Create); - -#define IMAGE_ADDRESSING_MODE_32BIT 3 +#define VER_SET_CONDITION(ConditionMask, TypeBitMask, ComparisonType) \ + ((ConditionMask) = VerSetConditionMask((ConditionMask), \ + (TypeBitMask), (ComparisonType))) + +/* RtlVerifyVersionInfo() TypeMask */ + +#define VER_MINORVERSION 0x0000001 +#define VER_MAJORVERSION 0x0000002 +#define VER_BUILDNUMBER 0x0000004 +#define VER_PLATFORMID 0x0000008 +#define VER_SERVICEPACKMINOR 0x0000010 +#define VER_SERVICEPACKMAJOR 0x0000020 +#define VER_SUITENAME 0x0000040 +#define VER_PRODUCT_TYPE 0x0000080 + +/* RtlVerifyVersionInfo() ComparisonType */ + +#define VER_EQUAL 1 +#define VER_GREATER 2 +#define VER_GREATER_EQUAL 3 +#define VER_LESS 4 +#define VER_LESS_EQUAL 5 +#define VER_AND 6 +#define VER_OR 7 + +#define VER_CONDITION_MASK 7 +#define VER_NUM_BITS_PER_CONDITION_MASK 3 typedef struct _IMAGE_INFO { _ANONYMOUS_UNION union { @@ -2258,7 +834,7 @@ typedef struct _IMAGE_INFO { ULONG SystemModeImage:1; ULONG ImageMappedToAllPids:1; ULONG ExtendedInfoPresent:1; - ULONG Reserved:21; + ULONG Reserved:22; } DUMMYSTRUCTNAME; } DUMMYUNIONNAME; PVOID ImageBase; @@ -2267,24 +843,24 @@ typedef struct _IMAGE_INFO { ULONG ImageSectionNumber; } IMAGE_INFO, *PIMAGE_INFO; -typedef struct _IMAGE_INFO_EX { - SIZE_T Size; - IMAGE_INFO ImageInfo; - struct _FILE_OBJECT *FileObject; -} IMAGE_INFO_EX, *PIMAGE_INFO_EX; +#define IMAGE_ADDRESSING_MODE_32BIT 3 -typedef VOID -(NTAPI *PLOAD_IMAGE_NOTIFY_ROUTINE)( - IN PUNICODE_STRING FullImageName, - IN HANDLE ProcessId, - IN PIMAGE_INFO ImageInfo); - -#define THREAD_CSWITCH_PMU_DISABLE FALSE -#define THREAD_CSWITCH_PMU_ENABLE TRUE - -#define PROCESS_LUID_DOSDEVICES_ONLY 0x00000001 - -#define PROCESS_HANDLE_TRACING_MAX_STACKS 16 +typedef enum _BUS_DATA_TYPE { + ConfigurationSpaceUndefined = -1, + Cmos, + EisaConfiguration, + Pos, + CbusConfiguration, + PCIConfiguration, + VMEConfiguration, + NuBusConfiguration, + PCMCIAConfiguration, + MPIConfiguration, + MPSAConfiguration, + PNPISAConfiguration, + SgiInternalConfiguration, + MaximumBusDataType +} BUS_DATA_TYPE, *PBUS_DATA_TYPE; typedef struct _NT_TIB { struct _EXCEPTION_REGISTRATION_RECORD *ExceptionList; @@ -2418,15 +994,6 @@ typedef enum _THREADINFOCLASS { MaxThreadInfoClass } THREADINFOCLASS; -typedef struct _PAGE_PRIORITY_INFORMATION { - ULONG PagePriority; -} PAGE_PRIORITY_INFORMATION, *PPAGE_PRIORITY_INFORMATION; - -typedef struct _PROCESS_WS_WATCH_INFORMATION { - PVOID FaultingPc; - PVOID FaultingVa; -} PROCESS_WS_WATCH_INFORMATION, *PPROCESS_WS_WATCH_INFORMATION; - typedef struct _PROCESS_BASIC_INFORMATION { NTSTATUS ExitStatus; struct _PEB *PebBaseAddress; @@ -2436,20 +1003,10 @@ typedef struct _PROCESS_BASIC_INFORMATION { ULONG_PTR InheritedFromUniqueProcessId; } PROCESS_BASIC_INFORMATION,*PPROCESS_BASIC_INFORMATION; -typedef struct _PROCESS_EXTENDED_BASIC_INFORMATION { - SIZE_T Size; - PROCESS_BASIC_INFORMATION BasicInfo; - union { - ULONG Flags; - struct { - ULONG IsProtectedProcess:1; - ULONG IsWow64Process:1; - ULONG IsProcessDeleting:1; - ULONG IsCrossSessionCreate:1; - ULONG SpareBits:28; - } DUMMYSTRUCTNAME; - } DUMMYUNIONNAME; -} PROCESS_EXTENDED_BASIC_INFORMATION, *PPROCESS_EXTENDED_BASIC_INFORMATION; +typedef struct _PROCESS_WS_WATCH_INFORMATION { + PVOID FaultingPc; + PVOID FaultingVa; +} PROCESS_WS_WATCH_INFORMATION, *PPROCESS_WS_WATCH_INFORMATION; typedef struct _PROCESS_DEVICEMAP_INFORMATION { __GNU_EXTENSION union { @@ -2463,263 +1020,514 @@ typedef struct _PROCESS_DEVICEMAP_INFORMATION { }; } PROCESS_DEVICEMAP_INFORMATION, *PPROCESS_DEVICEMAP_INFORMATION; -typedef struct _PROCESS_DEVICEMAP_INFORMATION_EX { - union { - struct { - HANDLE DirectoryHandle; - } Set; - struct { - ULONG DriveMap; - UCHAR DriveType[32]; - } Query; - } DUMMYUNIONNAME; - ULONG Flags; -} PROCESS_DEVICEMAP_INFORMATION_EX, *PPROCESS_DEVICEMAP_INFORMATION_EX; +typedef struct _KERNEL_USER_TIMES { + LARGE_INTEGER CreateTime; + LARGE_INTEGER ExitTime; + LARGE_INTEGER KernelTime; + LARGE_INTEGER UserTime; +} KERNEL_USER_TIMES, *PKERNEL_USER_TIMES; + +typedef struct _PROCESS_ACCESS_TOKEN { + HANDLE Token; + HANDLE Thread; +} PROCESS_ACCESS_TOKEN, *PPROCESS_ACCESS_TOKEN; typedef struct _PROCESS_SESSION_INFORMATION { ULONG SessionId; } PROCESS_SESSION_INFORMATION, *PPROCESS_SESSION_INFORMATION; -typedef struct _PROCESS_HANDLE_TRACING_ENABLE { - ULONG Flags; -} PROCESS_HANDLE_TRACING_ENABLE, *PPROCESS_HANDLE_TRACING_ENABLE; +typedef enum _IO_QUERY_DEVICE_DATA_FORMAT { + IoQueryDeviceIdentifier = 0, + IoQueryDeviceConfigurationData, + IoQueryDeviceComponentInformation, + IoQueryDeviceMaxData +} IO_QUERY_DEVICE_DATA_FORMAT, *PIO_QUERY_DEVICE_DATA_FORMAT; -typedef struct _PROCESS_HANDLE_TRACING_ENABLE_EX { - ULONG Flags; - ULONG TotalSlots; -} PROCESS_HANDLE_TRACING_ENABLE_EX, *PPROCESS_HANDLE_TRACING_ENABLE_EX; +typedef struct _DISK_SIGNATURE { + ULONG PartitionStyle; + _ANONYMOUS_UNION union { + struct { + ULONG Signature; + ULONG CheckSum; + } Mbr; + struct { + GUID DiskId; + } Gpt; + } DUMMYUNIONNAME; +} DISK_SIGNATURE, *PDISK_SIGNATURE; -typedef struct _PROCESS_HANDLE_TRACING_ENTRY { - HANDLE Handle; - CLIENT_ID ClientId; - ULONG Type; - PVOID Stacks[PROCESS_HANDLE_TRACING_MAX_STACKS]; -} PROCESS_HANDLE_TRACING_ENTRY, *PPROCESS_HANDLE_TRACING_ENTRY; +typedef ULONG_PTR +(NTAPI *PDRIVER_VERIFIER_THUNK_ROUTINE)( + IN PVOID Context); -typedef struct _PROCESS_HANDLE_TRACING_QUERY { - HANDLE Handle; - ULONG TotalTraces; - PROCESS_HANDLE_TRACING_ENTRY HandleTrace[1]; -} PROCESS_HANDLE_TRACING_QUERY, *PPROCESS_HANDLE_TRACING_QUERY; +typedef struct _DRIVER_VERIFIER_THUNK_PAIRS { + PDRIVER_VERIFIER_THUNK_ROUTINE PristineRoutine; + PDRIVER_VERIFIER_THUNK_ROUTINE NewRoutine; +} DRIVER_VERIFIER_THUNK_PAIRS, *PDRIVER_VERIFIER_THUNK_PAIRS; -extern NTKERNELAPI PEPROCESS PsInitialSystemProcess; - - -/****************************************************************************** - * Runtime Library Types * - ******************************************************************************/ - - - -#ifndef _RTL_RUN_ONCE_DEF -#define _RTL_RUN_ONCE_DEF - -#define RTL_RUN_ONCE_INIT {0} - -#define RTL_RUN_ONCE_CHECK_ONLY 0x00000001UL -#define RTL_RUN_ONCE_ASYNC 0x00000002UL -#define RTL_RUN_ONCE_INIT_FAILED 0x00000004UL - -#define RTL_RUN_ONCE_CTX_RESERVED_BITS 2 - -#define RTL_HASH_ALLOCATED_HEADER 0x00000001 - -#define RTL_HASH_RESERVED_SIGNATURE 0 - -/* RtlVerifyVersionInfo() ComparisonType */ - -#define VER_EQUAL 1 -#define VER_GREATER 2 -#define VER_GREATER_EQUAL 3 -#define VER_LESS 4 -#define VER_LESS_EQUAL 5 -#define VER_AND 6 -#define VER_OR 7 - -#define VER_CONDITION_MASK 7 -#define VER_NUM_BITS_PER_CONDITION_MASK 3 - -/* RtlVerifyVersionInfo() TypeMask */ - -#define VER_MINORVERSION 0x0000001 -#define VER_MAJORVERSION 0x0000002 -#define VER_BUILDNUMBER 0x0000004 -#define VER_PLATFORMID 0x0000008 -#define VER_SERVICEPACKMINOR 0x0000010 -#define VER_SERVICEPACKMAJOR 0x0000020 -#define VER_SUITENAME 0x0000040 -#define VER_PRODUCT_TYPE 0x0000080 - -#define VER_NT_WORKSTATION 0x0000001 -#define VER_NT_DOMAIN_CONTROLLER 0x0000002 -#define VER_NT_SERVER 0x0000003 - -#define VER_PLATFORM_WIN32s 0 -#define VER_PLATFORM_WIN32_WINDOWS 1 -#define VER_PLATFORM_WIN32_NT 2 - -typedef union _RTL_RUN_ONCE { - PVOID Ptr; -} RTL_RUN_ONCE, *PRTL_RUN_ONCE; - -typedef ULONG /* LOGICAL */ -(NTAPI *PRTL_RUN_ONCE_INIT_FN) ( - IN OUT PRTL_RUN_ONCE RunOnce, - IN OUT PVOID Parameter OPTIONAL, - IN OUT PVOID *Context OPTIONAL); - -#endif /* _RTL_RUN_ONCE_DEF */ - -typedef enum _TABLE_SEARCH_RESULT { - TableEmptyTree, - TableFoundNode, - TableInsertAsLeft, - TableInsertAsRight -} TABLE_SEARCH_RESULT; - -typedef enum _RTL_GENERIC_COMPARE_RESULTS { - GenericLessThan, - GenericGreaterThan, - GenericEqual -} RTL_GENERIC_COMPARE_RESULTS; - -// Forwarder -struct _RTL_AVL_TABLE; - -typedef RTL_GENERIC_COMPARE_RESULTS -(NTAPI *PRTL_AVL_COMPARE_ROUTINE) ( - IN struct _RTL_AVL_TABLE *Table, - IN PVOID FirstStruct, - IN PVOID SecondStruct); - -typedef PVOID -(NTAPI *PRTL_AVL_ALLOCATE_ROUTINE) ( - IN struct _RTL_AVL_TABLE *Table, - IN CLONG ByteSize); +#define DRIVER_VERIFIER_SPECIAL_POOLING 0x0001 +#define DRIVER_VERIFIER_FORCE_IRQL_CHECKING 0x0002 +#define DRIVER_VERIFIER_INJECT_ALLOCATION_FAILURES 0x0004 +#define DRIVER_VERIFIER_TRACK_POOL_ALLOCATIONS 0x0008 +#define DRIVER_VERIFIER_IO_CHECKING 0x0010 typedef VOID -(NTAPI *PRTL_AVL_FREE_ROUTINE) ( - IN struct _RTL_AVL_TABLE *Table, - IN PVOID Buffer); +(NTAPI *PTIMER_APC_ROUTINE)( + IN PVOID TimerContext, + IN ULONG TimerLowValue, + IN LONG TimerHighValue); -typedef NTSTATUS -(NTAPI *PRTL_AVL_MATCH_FUNCTION) ( - IN struct _RTL_AVL_TABLE *Table, - IN PVOID UserData, - IN PVOID MatchData); +typedef struct _KUSER_SHARED_DATA +{ + ULONG TickCountLowDeprecated; + ULONG TickCountMultiplier; + volatile KSYSTEM_TIME InterruptTime; + volatile KSYSTEM_TIME SystemTime; + volatile KSYSTEM_TIME TimeZoneBias; + USHORT ImageNumberLow; + USHORT ImageNumberHigh; + WCHAR NtSystemRoot[260]; + ULONG MaxStackTraceDepth; + ULONG CryptoExponent; + ULONG TimeZoneId; + ULONG LargePageMinimum; + ULONG Reserved2[7]; + NT_PRODUCT_TYPE NtProductType; + BOOLEAN ProductTypeIsValid; + ULONG NtMajorVersion; + ULONG NtMinorVersion; + BOOLEAN ProcessorFeatures[PROCESSOR_FEATURE_MAX]; + ULONG Reserved1; + ULONG Reserved3; + volatile ULONG TimeSlip; + ALTERNATIVE_ARCHITECTURE_TYPE AlternativeArchitecture; + ULONG AltArchitecturePad[1]; + LARGE_INTEGER SystemExpirationDate; + ULONG SuiteMask; + BOOLEAN KdDebuggerEnabled; +#if (NTDDI_VERSION >= NTDDI_WINXPSP2) + UCHAR NXSupportPolicy; +#endif + volatile ULONG ActiveConsoleId; + volatile ULONG DismountCount; + ULONG ComPlusPackage; + ULONG LastSystemRITEventTickCount; + ULONG NumberOfPhysicalPages; + BOOLEAN SafeBootMode; +#if (NTDDI_VERSION >= NTDDI_WIN7) + union { + UCHAR TscQpcData; + struct { + UCHAR TscQpcEnabled:1; + UCHAR TscQpcSpareFlag:1; + UCHAR TscQpcShift:6; + } DUMMYSTRUCTNAME; + } DUMMYUNIONNAME; + UCHAR TscQpcPad[2]; +#endif +#if (NTDDI_VERSION >= NTDDI_VISTA) + union { + ULONG SharedDataFlags; + struct { + ULONG DbgErrorPortPresent:1; + ULONG DbgElevationEnabled:1; + ULONG DbgVirtEnabled:1; + ULONG DbgInstallerDetectEnabled:1; + ULONG DbgSystemDllRelocated:1; + ULONG DbgDynProcessorEnabled:1; + ULONG DbgSEHValidationEnabled:1; + ULONG SpareBits:25; + } DUMMYSTRUCTNAME2; + } DUMMYUNIONNAME2; +#else + ULONG TraceLogging; +#endif + ULONG DataFlagsPad[1]; + ULONGLONG TestRetInstruction; + ULONG SystemCall; + ULONG SystemCallReturn; + ULONGLONG SystemCallPad[3]; + _ANONYMOUS_UNION union { + volatile KSYSTEM_TIME TickCount; + volatile ULONG64 TickCountQuad; + _ANONYMOUS_STRUCT struct { + ULONG ReservedTickCountOverlay[3]; + ULONG TickCountPad[1]; + } DUMMYSTRUCTNAME; + } DUMMYUNIONNAME3; + ULONG Cookie; + ULONG CookiePad[1]; +#if (NTDDI_VERSION >= NTDDI_WS03) + LONGLONG ConsoleSessionForegroundProcessId; + ULONG Wow64SharedInformation[MAX_WOW64_SHARED_ENTRIES]; +#endif +#if (NTDDI_VERSION >= NTDDI_VISTA) +#if (NTDDI_VERSION >= NTDDI_WIN7) + USHORT UserModeGlobalLogger[16]; +#else + USHORT UserModeGlobalLogger[8]; + ULONG HeapTracingPid[2]; + ULONG CritSecTracingPid[2]; +#endif + ULONG ImageFileExecutionOptions; +#if (NTDDI_VERSION >= NTDDI_VISTASP1) + ULONG LangGenerationCount; +#else + /* 4 bytes padding */ +#endif + ULONGLONG Reserved5; + volatile ULONG64 InterruptTimeBias; +#endif +#if (NTDDI_VERSION >= NTDDI_WIN7) + volatile ULONG64 TscQpcBias; + volatile ULONG ActiveProcessorCount; + volatile USHORT ActiveGroupCount; + USHORT Reserved4; + volatile ULONG AitSamplingValue; + volatile ULONG AppCompatFlag; + ULONGLONG SystemDllNativeRelocation; + ULONG SystemDllWowRelocation; + ULONG XStatePad[1]; + XSTATE_CONFIGURATION XState; +#endif +} KUSER_SHARED_DATA, *PKUSER_SHARED_DATA; -typedef struct _RTL_BALANCED_LINKS { - struct _RTL_BALANCED_LINKS *Parent; - struct _RTL_BALANCED_LINKS *LeftChild; - struct _RTL_BALANCED_LINKS *RightChild; - CHAR Balance; - UCHAR Reserved[3]; -} RTL_BALANCED_LINKS, *PRTL_BALANCED_LINKS; +extern NTKERNELAPI PVOID MmHighestUserAddress; +extern NTKERNELAPI PVOID MmSystemRangeStart; +extern NTKERNELAPI ULONG MmUserProbeAddress; -typedef struct _RTL_AVL_TABLE { - RTL_BALANCED_LINKS BalancedRoot; - PVOID OrderedPointer; - ULONG WhichOrderedElement; - ULONG NumberGenericTableElements; - ULONG DepthOfTree; - PRTL_BALANCED_LINKS RestartKey; - ULONG DeleteCount; - PRTL_AVL_COMPARE_ROUTINE CompareRoutine; - PRTL_AVL_ALLOCATE_ROUTINE AllocateRoutine; - PRTL_AVL_FREE_ROUTINE FreeRoutine; - PVOID TableContext; -} RTL_AVL_TABLE, *PRTL_AVL_TABLE; -#ifndef RTL_USE_AVL_TABLES +#ifdef _X86_ -struct _RTL_GENERIC_TABLE; +#define MM_HIGHEST_USER_ADDRESS MmHighestUserAddress +#define MM_SYSTEM_RANGE_START MmSystemRangeStart +#if defined(_LOCAL_COPY_USER_PROBE_ADDRESS_) +#define MM_USER_PROBE_ADDRESS _LOCAL_COPY_USER_PROBE_ADDRESS_ +extern ULONG _LOCAL_COPY_USER_PROBE_ADDRESS_; +#else +#define MM_USER_PROBE_ADDRESS MmUserProbeAddress +#endif +#define MM_LOWEST_USER_ADDRESS (PVOID)0x10000 +#define MM_KSEG0_BASE MM_SYSTEM_RANGE_START +#define MM_SYSTEM_SPACE_END 0xFFFFFFFF +#if !defined (_X86PAE_) +#define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xC0800000 +#else +#define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xC0C00000 +#endif -typedef RTL_GENERIC_COMPARE_RESULTS -(NTAPI *PRTL_GENERIC_COMPARE_ROUTINE) ( - IN struct _RTL_GENERIC_TABLE *Table, - IN PVOID FirstStruct, - IN PVOID SecondStruct); +#define KeGetPcr() PCR -typedef PVOID -(NTAPI *PRTL_GENERIC_ALLOCATE_ROUTINE) ( - IN struct _RTL_GENERIC_TABLE *Table, - IN CLONG ByteSize); +#define KERNEL_STACK_SIZE 12288 +#define KERNEL_LARGE_STACK_SIZE 61440 +#define KERNEL_LARGE_STACK_COMMIT 12288 -typedef VOID -(NTAPI *PRTL_GENERIC_FREE_ROUTINE) ( - IN struct _RTL_GENERIC_TABLE *Table, - IN PVOID Buffer); +#define SIZE_OF_80387_REGISTERS 80 -typedef struct _RTL_SPLAY_LINKS { - struct _RTL_SPLAY_LINKS *Parent; - struct _RTL_SPLAY_LINKS *LeftChild; - struct _RTL_SPLAY_LINKS *RightChild; -} RTL_SPLAY_LINKS, *PRTL_SPLAY_LINKS; +#define PCR_MINOR_VERSION 1 +#define PCR_MAJOR_VERSION 1 -typedef struct _RTL_GENERIC_TABLE { - PRTL_SPLAY_LINKS TableRoot; - LIST_ENTRY InsertOrderList; - PLIST_ENTRY OrderedPointer; - ULONG WhichOrderedElement; - ULONG NumberGenericTableElements; - PRTL_GENERIC_COMPARE_ROUTINE CompareRoutine; - PRTL_GENERIC_ALLOCATE_ROUTINE AllocateRoutine; - PRTL_GENERIC_FREE_ROUTINE FreeRoutine; - PVOID TableContext; -} RTL_GENERIC_TABLE, *PRTL_GENERIC_TABLE; +#if !defined(RC_INVOKED) -#endif /* !RTL_USE_AVL_TABLES */ +#define CONTEXT_i386 0x10000 +#define CONTEXT_i486 0x10000 +#define CONTEXT_CONTROL (CONTEXT_i386|0x00000001L) +#define CONTEXT_INTEGER (CONTEXT_i386|0x00000002L) +#define CONTEXT_SEGMENTS (CONTEXT_i386|0x00000004L) +#define CONTEXT_FLOATING_POINT (CONTEXT_i386|0x00000008L) +#define CONTEXT_DEBUG_REGISTERS (CONTEXT_i386|0x00000010L) +#define CONTEXT_EXTENDED_REGISTERS (CONTEXT_i386|0x00000020L) -#ifdef RTL_USE_AVL_TABLES +#define CONTEXT_FULL (CONTEXT_CONTROL|CONTEXT_INTEGER|CONTEXT_SEGMENTS) -#undef PRTL_GENERIC_COMPARE_ROUTINE -#undef RTL_GENERIC_COMPARE_ROUTINE -#undef PRTL_GENERIC_ALLOCATE_ROUTINE -#undef RTL_GENERIC_ALLOCATE_ROUTINE -#undef PRTL_GENERIC_FREE_ROUTINE -#undef RTL_GENERIC_FREE_ROUTINE -#undef RTL_GENERIC_TABLE -#undef PRTL_GENERIC_TABLE +#endif /* !defined(RC_INVOKED) */ -#define PRTL_GENERIC_COMPARE_ROUTINE PRTL_AVL_COMPARE_ROUTINE -#define RTL_GENERIC_COMPARE_ROUTINE RTL_AVL_COMPARE_ROUTINE -#define PRTL_GENERIC_ALLOCATE_ROUTINE PRTL_AVL_ALLOCATE_ROUTINE -#define RTL_GENERIC_ALLOCATE_ROUTINE RTL_AVL_ALLOCATE_ROUTINE -#define PRTL_GENERIC_FREE_ROUTINE PRTL_AVL_FREE_ROUTINE -#define RTL_GENERIC_FREE_ROUTINE RTL_AVL_FREE_ROUTINE -#define RTL_GENERIC_TABLE RTL_AVL_TABLE -#define PRTL_GENERIC_TABLE PRTL_AVL_TABLE +typedef struct _KPCR { + union { + NT_TIB NtTib; + struct { + struct _EXCEPTION_REGISTRATION_RECORD *Used_ExceptionList; + PVOID Used_StackBase; + PVOID Spare2; + PVOID TssCopy; + ULONG ContextSwitches; + KAFFINITY SetMemberCopy; + PVOID Used_Self; + }; + }; + struct _KPCR *SelfPcr; + struct _KPRCB *Prcb; + KIRQL Irql; + ULONG IRR; + ULONG IrrActive; + ULONG IDR; + PVOID KdVersionBlock; + struct _KIDTENTRY *IDT; + struct _KGDTENTRY *GDT; + struct _KTSS *TSS; + USHORT MajorVersion; + USHORT MinorVersion; + KAFFINITY SetMember; + ULONG StallScaleFactor; + UCHAR SpareUnused; + UCHAR Number; + UCHAR Spare0; + UCHAR SecondLevelCacheAssociativity; + ULONG VdmAlert; + ULONG KernelReserved[14]; + ULONG SecondLevelCacheSize; + ULONG HalReserved[16]; +} KPCR, *PKPCR; -#endif /* RTL_USE_AVL_TABLES */ +FORCEINLINE +ULONG +KeGetCurrentProcessorNumber(VOID) +{ + return (ULONG)__readfsbyte(FIELD_OFFSET(KPCR, Number)); +} -typedef struct _RTL_DYNAMIC_HASH_TABLE_ENTRY { - LIST_ENTRY Linkage; - ULONG_PTR Signature; -} RTL_DYNAMIC_HASH_TABLE_ENTRY, *PRTL_DYNAMIC_HASH_TABLE_ENTRY; +typedef struct _FLOATING_SAVE_AREA { + ULONG ControlWord; + ULONG StatusWord; + ULONG TagWord; + ULONG ErrorOffset; + ULONG ErrorSelector; + ULONG DataOffset; + ULONG DataSelector; + UCHAR RegisterArea[SIZE_OF_80387_REGISTERS]; + ULONG Cr0NpxState; +} FLOATING_SAVE_AREA, *PFLOATING_SAVE_AREA; -typedef struct _RTL_DYNAMIC_HASH_TABLE_CONTEXT { - PLIST_ENTRY ChainHead; - PLIST_ENTRY PrevLinkage; - ULONG_PTR Signature; -} RTL_DYNAMIC_HASH_TABLE_CONTEXT, *PRTL_DYNAMIC_HASH_TABLE_CONTEXT; +#include "pshpack4.h" +typedef struct _CONTEXT { + ULONG ContextFlags; + ULONG Dr0; + ULONG Dr1; + ULONG Dr2; + ULONG Dr3; + ULONG Dr6; + ULONG Dr7; + FLOATING_SAVE_AREA FloatSave; + ULONG SegGs; + ULONG SegFs; + ULONG SegEs; + ULONG SegDs; + ULONG Edi; + ULONG Esi; + ULONG Ebx; + ULONG Edx; + ULONG Ecx; + ULONG Eax; + ULONG Ebp; + ULONG Eip; + ULONG SegCs; + ULONG EFlags; + ULONG Esp; + ULONG SegSs; + UCHAR ExtendedRegisters[MAXIMUM_SUPPORTED_EXTENSION]; +} CONTEXT; +#include "poppack.h" -typedef struct _RTL_DYNAMIC_HASH_TABLE_ENUMERATOR { - RTL_DYNAMIC_HASH_TABLE_ENTRY HashEntry; - PLIST_ENTRY ChainHead; - ULONG BucketIndex; -} RTL_DYNAMIC_HASH_TABLE_ENUMERATOR, *PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR; +#endif /* _X86_ */ -typedef struct _RTL_DYNAMIC_HASH_TABLE { - ULONG Flags; - ULONG Shift; - ULONG TableSize; - ULONG Pivot; - ULONG DivisorMask; - ULONG NumEntries; - ULONG NonEmptyBuckets; - ULONG NumEnumerators; - PVOID Directory; -} RTL_DYNAMIC_HASH_TABLE, *PRTL_DYNAMIC_HASH_TABLE; +#ifdef _AMD64_ + +#define PTI_SHIFT 12L +#define PDI_SHIFT 21L +#define PPI_SHIFT 30L +#define PXI_SHIFT 39L +#define PTE_PER_PAGE 512 +#define PDE_PER_PAGE 512 +#define PPE_PER_PAGE 512 +#define PXE_PER_PAGE 512 +#define PTI_MASK_AMD64 (PTE_PER_PAGE - 1) +#define PDI_MASK_AMD64 (PDE_PER_PAGE - 1) +#define PPI_MASK (PPE_PER_PAGE - 1) +#define PXI_MASK (PXE_PER_PAGE - 1) + +#define PXE_BASE 0xFFFFF6FB7DBED000ULL +#define PXE_SELFMAP 0xFFFFF6FB7DBEDF68ULL +#define PPE_BASE 0xFFFFF6FB7DA00000ULL +#define PDE_BASE 0xFFFFF6FB40000000ULL +#define PTE_BASE 0xFFFFF68000000000ULL +#define PXE_TOP 0xFFFFF6FB7DBEDFFFULL +#define PPE_TOP 0xFFFFF6FB7DBFFFFFULL +#define PDE_TOP 0xFFFFF6FB7FFFFFFFULL +#define PTE_TOP 0xFFFFF6FFFFFFFFFFULL + +#define MM_HIGHEST_USER_ADDRESS MmHighestUserAddress +#define MM_SYSTEM_RANGE_START MmSystemRangeStart +#define MM_USER_PROBE_ADDRESS MmUserProbeAddress +#define MM_LOWEST_USER_ADDRESS (PVOID)0x10000 +#define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xFFFF080000000000ULL +#define KI_USER_SHARED_DATA 0xFFFFF78000000000ULL + +typedef struct DECLSPEC_ALIGN(16) _CONTEXT { + ULONG64 P1Home; + ULONG64 P2Home; + ULONG64 P3Home; + ULONG64 P4Home; + ULONG64 P5Home; + ULONG64 P6Home; + + /* Control flags */ + ULONG ContextFlags; + ULONG MxCsr; + + /* Segment */ + USHORT SegCs; + USHORT SegDs; + USHORT SegEs; + USHORT SegFs; + USHORT SegGs; + USHORT SegSs; + ULONG EFlags; + + /* Debug */ + ULONG64 Dr0; + ULONG64 Dr1; + ULONG64 Dr2; + ULONG64 Dr3; + ULONG64 Dr6; + ULONG64 Dr7; + + /* Integer */ + ULONG64 Rax; + ULONG64 Rcx; + ULONG64 Rdx; + ULONG64 Rbx; + ULONG64 Rsp; + ULONG64 Rbp; + ULONG64 Rsi; + ULONG64 Rdi; + ULONG64 R8; + ULONG64 R9; + ULONG64 R10; + ULONG64 R11; + ULONG64 R12; + ULONG64 R13; + ULONG64 R14; + ULONG64 R15; + + /* Counter */ + ULONG64 Rip; + + /* Floating point */ + union { + XMM_SAVE_AREA32 FltSave; + struct { + M128A Header[2]; + M128A Legacy[8]; + M128A Xmm0; + M128A Xmm1; + M128A Xmm2; + M128A Xmm3; + M128A Xmm4; + M128A Xmm5; + M128A Xmm6; + M128A Xmm7; + M128A Xmm8; + M128A Xmm9; + M128A Xmm10; + M128A Xmm11; + M128A Xmm12; + M128A Xmm13; + M128A Xmm14; + M128A Xmm15; + } DUMMYSTRUCTNAME; + } DUMMYUNIONNAME; + + /* Vector */ + M128A VectorRegister[26]; + ULONG64 VectorControl; + + /* Debug control */ + ULONG64 DebugControl; + ULONG64 LastBranchToRip; + ULONG64 LastBranchFromRip; + ULONG64 LastExceptionToRip; + ULONG64 LastExceptionFromRip; +} CONTEXT; + +typedef struct _KPCR +{ + _ANONYMOUS_UNION union + { + NT_TIB NtTib; + _ANONYMOUS_STRUCT struct + { + union _KGDTENTRY64 *GdtBase; + struct _KTSS64 *TssBase; + ULONG64 UserRsp; + struct _KPCR *Self; + struct _KPRCB *CurrentPrcb; + PKSPIN_LOCK_QUEUE LockArray; + PVOID Used_Self; + }; + }; + union _KIDTENTRY64 *IdtBase; + ULONG64 Unused[2]; + KIRQL Irql; + UCHAR SecondLevelCacheAssociativity; + UCHAR ObsoleteNumber; + UCHAR Fill0; + ULONG Unused0[3]; + USHORT MajorVersion; + USHORT MinorVersion; + ULONG StallScaleFactor; + PVOID Unused1[3]; + ULONG KernelReserved[15]; + ULONG SecondLevelCacheSize; + ULONG HalReserved[16]; + ULONG Unused2; + PVOID KdVersionBlock; + PVOID Unused3; + ULONG PcrAlign1[24]; +} KPCR, *PKPCR; + +FORCEINLINE +PKPCR +KeGetPcr(VOID) +{ + return (PKPCR)__readgsqword(FIELD_OFFSET(KPCR, Self)); +} + +FORCEINLINE +ULONG +KeGetCurrentProcessorNumber(VOID) +{ + return (ULONG)__readgsword(0x184); +} + +#if !defined(RC_INVOKED) + +#define CONTEXT_AMD64 0x100000 + +#define CONTEXT_CONTROL (CONTEXT_AMD64 | 0x1L) +#define CONTEXT_INTEGER (CONTEXT_AMD64 | 0x2L) +#define CONTEXT_SEGMENTS (CONTEXT_AMD64 | 0x4L) +#define CONTEXT_FLOATING_POINT (CONTEXT_AMD64 | 0x8L) +#define CONTEXT_DEBUG_REGISTERS (CONTEXT_AMD64 | 0x10L) + +#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_FLOATING_POINT) +#define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS | CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS) + +#define CONTEXT_XSTATE (CONTEXT_AMD64 | 0x20L) + +#define CONTEXT_EXCEPTION_ACTIVE 0x8000000 +#define CONTEXT_SERVICE_ACTIVE 0x10000000 +#define CONTEXT_EXCEPTION_REQUEST 0x40000000 +#define CONTEXT_EXCEPTION_REPORTING 0x80000000 + +#endif /* RC_INVOKED */ + +#endif /* _AMD64_ */ + +typedef enum _INTERLOCKED_RESULT { + ResultNegative = RESULT_NEGATIVE, + ResultZero = RESULT_ZERO, + ResultPositive = RESULT_POSITIVE +} INTERLOCKED_RESULT; typedef struct _OSVERSIONINFOA { ULONG dwOSVersionInfoSize; @@ -2783,461 +1591,24 @@ typedef POSVERSIONINFOA POSVERSIONINFO; typedef LPOSVERSIONINFOA LPOSVERSIONINFO; #endif /* UNICODE */ -#define HASH_ENTRY_KEY(x) ((x)->Signature) +/* Executive Types */ -/****************************************************************************** - * Security Manager Types * - ******************************************************************************/ -#define SE_UNSOLICITED_INPUT_PRIVILEGE 6 +#define PROTECTED_POOL 0x80000000 -typedef enum _WELL_KNOWN_SID_TYPE { - WinNullSid = 0, - WinWorldSid = 1, - WinLocalSid = 2, - WinCreatorOwnerSid = 3, - WinCreatorGroupSid = 4, - WinCreatorOwnerServerSid = 5, - WinCreatorGroupServerSid = 6, - WinNtAuthoritySid = 7, - WinDialupSid = 8, - WinNetworkSid = 9, - WinBatchSid = 10, - WinInteractiveSid = 11, - WinServiceSid = 12, - WinAnonymousSid = 13, - WinProxySid = 14, - WinEnterpriseControllersSid = 15, - WinSelfSid = 16, - WinAuthenticatedUserSid = 17, - WinRestrictedCodeSid = 18, - WinTerminalServerSid = 19, - WinRemoteLogonIdSid = 20, - WinLogonIdsSid = 21, - WinLocalSystemSid = 22, - WinLocalServiceSid = 23, - WinNetworkServiceSid = 24, - WinBuiltinDomainSid = 25, - WinBuiltinAdministratorsSid = 26, - WinBuiltinUsersSid = 27, - WinBuiltinGuestsSid = 28, - WinBuiltinPowerUsersSid = 29, - WinBuiltinAccountOperatorsSid = 30, - WinBuiltinSystemOperatorsSid = 31, - WinBuiltinPrintOperatorsSid = 32, - WinBuiltinBackupOperatorsSid = 33, - WinBuiltinReplicatorSid = 34, - WinBuiltinPreWindows2000CompatibleAccessSid = 35, - WinBuiltinRemoteDesktopUsersSid = 36, - WinBuiltinNetworkConfigurationOperatorsSid = 37, - WinAccountAdministratorSid = 38, - WinAccountGuestSid = 39, - WinAccountKrbtgtSid = 40, - WinAccountDomainAdminsSid = 41, - WinAccountDomainUsersSid = 42, - WinAccountDomainGuestsSid = 43, - WinAccountComputersSid = 44, - WinAccountControllersSid = 45, - WinAccountCertAdminsSid = 46, - WinAccountSchemaAdminsSid = 47, - WinAccountEnterpriseAdminsSid = 48, - WinAccountPolicyAdminsSid = 49, - WinAccountRasAndIasServersSid = 50, - WinNTLMAuthenticationSid = 51, - WinDigestAuthenticationSid = 52, - WinSChannelAuthenticationSid = 53, - WinThisOrganizationSid = 54, - WinOtherOrganizationSid = 55, - WinBuiltinIncomingForestTrustBuildersSid = 56, - WinBuiltinPerfMonitoringUsersSid = 57, - WinBuiltinPerfLoggingUsersSid = 58, - WinBuiltinAuthorizationAccessSid = 59, - WinBuiltinTerminalServerLicenseServersSid = 60, - WinBuiltinDCOMUsersSid = 61, - WinBuiltinIUsersSid = 62, - WinIUserSid = 63, - WinBuiltinCryptoOperatorsSid = 64, - WinUntrustedLabelSid = 65, - WinLowLabelSid = 66, - WinMediumLabelSid = 67, - WinHighLabelSid = 68, - WinSystemLabelSid = 69, - WinWriteRestrictedCodeSid = 70, - WinCreatorOwnerRightsSid = 71, - WinCacheablePrincipalsGroupSid = 72, - WinNonCacheablePrincipalsGroupSid = 73, - WinEnterpriseReadonlyControllersSid = 74, - WinAccountReadonlyControllersSid = 75, - WinBuiltinEventLogReadersGroup = 76, - WinNewEnterpriseReadonlyControllersSid = 77, - WinBuiltinCertSvcDComAccessGroup = 78, - WinMediumPlusLabelSid = 79, - WinLocalLogonSid = 80, - WinConsoleLogonSid = 81, - WinThisOrganizationCertificateSid = 82, -} WELL_KNOWN_SID_TYPE; +typedef struct _ZONE_SEGMENT_HEADER { + SINGLE_LIST_ENTRY SegmentList; + PVOID Reserved; +} ZONE_SEGMENT_HEADER, *PZONE_SEGMENT_HEADER; +typedef struct _ZONE_HEADER { + SINGLE_LIST_ENTRY FreeList; + SINGLE_LIST_ENTRY SegmentList; + ULONG BlockSize; + ULONG TotalSegmentSize; +} ZONE_HEADER, *PZONE_HEADER; +/* Executive Functions */ -#if defined(_M_IX86) - -#define PAUSE_PROCESSOR YieldProcessor(); - -#define KERNEL_STACK_SIZE 12288 -#define KERNEL_LARGE_STACK_SIZE 61440 -#define KERNEL_LARGE_STACK_COMMIT 12288 - -#define SIZE_OF_80387_REGISTERS 80 - -#if !defined(RC_INVOKED) - -#define CONTEXT_i386 0x10000 -#define CONTEXT_i486 0x10000 -#define CONTEXT_CONTROL (CONTEXT_i386|0x00000001L) -#define CONTEXT_INTEGER (CONTEXT_i386|0x00000002L) -#define CONTEXT_SEGMENTS (CONTEXT_i386|0x00000004L) -#define CONTEXT_FLOATING_POINT (CONTEXT_i386|0x00000008L) -#define CONTEXT_DEBUG_REGISTERS (CONTEXT_i386|0x00000010L) -#define CONTEXT_EXTENDED_REGISTERS (CONTEXT_i386|0x00000020L) - -#define CONTEXT_FULL (CONTEXT_CONTROL|CONTEXT_INTEGER|CONTEXT_SEGMENTS) -#define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS | \ - CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS | \ - CONTEXT_EXTENDED_REGISTERS) - -#define CONTEXT_XSTATE (CONTEXT_i386 | 0x00000040L) - -#endif /* !defined(RC_INVOKED) */ - -typedef struct _FLOATING_SAVE_AREA { - ULONG ControlWord; - ULONG StatusWord; - ULONG TagWord; - ULONG ErrorOffset; - ULONG ErrorSelector; - ULONG DataOffset; - ULONG DataSelector; - UCHAR RegisterArea[SIZE_OF_80387_REGISTERS]; - ULONG Cr0NpxState; -} FLOATING_SAVE_AREA, *PFLOATING_SAVE_AREA; - -#include "pshpack4.h" -typedef struct _CONTEXT { - ULONG ContextFlags; - ULONG Dr0; - ULONG Dr1; - ULONG Dr2; - ULONG Dr3; - ULONG Dr6; - ULONG Dr7; - FLOATING_SAVE_AREA FloatSave; - ULONG SegGs; - ULONG SegFs; - ULONG SegEs; - ULONG SegDs; - ULONG Edi; - ULONG Esi; - ULONG Ebx; - ULONG Edx; - ULONG Ecx; - ULONG Eax; - ULONG Ebp; - ULONG Eip; - ULONG SegCs; - ULONG EFlags; - ULONG Esp; - ULONG SegSs; - UCHAR ExtendedRegisters[MAXIMUM_SUPPORTED_EXTENSION]; -} CONTEXT; -#include "poppack.h" - -#define KeGetPcr() PCR - -#define PCR_MINOR_VERSION 1 -#define PCR_MAJOR_VERSION 1 - -typedef struct _KPCR { - union { - NT_TIB NtTib; - struct { - struct _EXCEPTION_REGISTRATION_RECORD *Used_ExceptionList; - PVOID Used_StackBase; - PVOID Spare2; - PVOID TssCopy; - ULONG ContextSwitches; - KAFFINITY SetMemberCopy; - PVOID Used_Self; - }; - }; - struct _KPCR *SelfPcr; - struct _KPRCB *Prcb; - KIRQL Irql; - ULONG IRR; - ULONG IrrActive; - ULONG IDR; - PVOID KdVersionBlock; - struct _KIDTENTRY *IDT; - struct _KGDTENTRY *GDT; - struct _KTSS *TSS; - USHORT MajorVersion; - USHORT MinorVersion; - KAFFINITY SetMember; - ULONG StallScaleFactor; - UCHAR SpareUnused; - UCHAR Number; - UCHAR Spare0; - UCHAR SecondLevelCacheAssociativity; - ULONG VdmAlert; - ULONG KernelReserved[14]; - ULONG SecondLevelCacheSize; - ULONG HalReserved[16]; -} KPCR, *PKPCR; - -FORCEINLINE -ULONG -KeGetCurrentProcessorNumber(VOID) -{ - return (ULONG)__readfsbyte(FIELD_OFFSET(KPCR, Number)); -} - - - - - - -extern NTKERNELAPI PVOID MmHighestUserAddress; -extern NTKERNELAPI PVOID MmSystemRangeStart; -extern NTKERNELAPI ULONG MmUserProbeAddress; - -#define MM_HIGHEST_USER_ADDRESS MmHighestUserAddress -#define MM_SYSTEM_RANGE_START MmSystemRangeStart -#if defined(_LOCAL_COPY_USER_PROBE_ADDRESS_) -#define MM_USER_PROBE_ADDRESS _LOCAL_COPY_USER_PROBE_ADDRESS_ -extern ULONG _LOCAL_COPY_USER_PROBE_ADDRESS_; -#else -#define MM_USER_PROBE_ADDRESS MmUserProbeAddress -#endif -#define MM_LOWEST_USER_ADDRESS (PVOID)0x10000 -#define MM_KSEG0_BASE MM_SYSTEM_RANGE_START -#define MM_SYSTEM_SPACE_END 0xFFFFFFFF -#if !defined (_X86PAE_) -#define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xC0800000 -#else -#define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xC0C00000 -#endif - -#elif defined(_M_AMD64) - -#define PAUSE_PROCESSOR YieldProcessor(); - -#define KERNEL_STACK_SIZE 0x6000 -#define KERNEL_LARGE_STACK_SIZE 0x12000 -#define KERNEL_LARGE_STACK_COMMIT KERNEL_STACK_SIZE - -#define KERNEL_MCA_EXCEPTION_STACK_SIZE 0x2000 - -#define EXCEPTION_READ_FAULT 0 -#define EXCEPTION_WRITE_FAULT 1 -#define EXCEPTION_EXECUTE_FAULT 8 - -#if !defined(RC_INVOKED) - -#define CONTEXT_AMD64 0x100000 - -#define CONTEXT_CONTROL (CONTEXT_AMD64 | 0x1L) -#define CONTEXT_INTEGER (CONTEXT_AMD64 | 0x2L) -#define CONTEXT_SEGMENTS (CONTEXT_AMD64 | 0x4L) -#define CONTEXT_FLOATING_POINT (CONTEXT_AMD64 | 0x8L) -#define CONTEXT_DEBUG_REGISTERS (CONTEXT_AMD64 | 0x10L) - -#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_FLOATING_POINT) -#define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS | CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS) - -#define CONTEXT_XSTATE (CONTEXT_AMD64 | 0x20L) - -#define CONTEXT_EXCEPTION_ACTIVE 0x8000000 -#define CONTEXT_SERVICE_ACTIVE 0x10000000 -#define CONTEXT_EXCEPTION_REQUEST 0x40000000 -#define CONTEXT_EXCEPTION_REPORTING 0x80000000 - -#endif /* !defined(RC_INVOKED) */ - -#define INITIAL_MXCSR 0x1f80 -#define INITIAL_FPCSR 0x027f - -typedef struct DECLSPEC_ALIGN(16) _CONTEXT { - ULONG64 P1Home; - ULONG64 P2Home; - ULONG64 P3Home; - ULONG64 P4Home; - ULONG64 P5Home; - ULONG64 P6Home; - ULONG ContextFlags; - ULONG MxCsr; - USHORT SegCs; - USHORT SegDs; - USHORT SegEs; - USHORT SegFs; - USHORT SegGs; - USHORT SegSs; - ULONG EFlags; - ULONG64 Dr0; - ULONG64 Dr1; - ULONG64 Dr2; - ULONG64 Dr3; - ULONG64 Dr6; - ULONG64 Dr7; - ULONG64 Rax; - ULONG64 Rcx; - ULONG64 Rdx; - ULONG64 Rbx; - ULONG64 Rsp; - ULONG64 Rbp; - ULONG64 Rsi; - ULONG64 Rdi; - ULONG64 R8; - ULONG64 R9; - ULONG64 R10; - ULONG64 R11; - ULONG64 R12; - ULONG64 R13; - ULONG64 R14; - ULONG64 R15; - ULONG64 Rip; - union { - XMM_SAVE_AREA32 FltSave; - struct { - M128A Header[2]; - M128A Legacy[8]; - M128A Xmm0; - M128A Xmm1; - M128A Xmm2; - M128A Xmm3; - M128A Xmm4; - M128A Xmm5; - M128A Xmm6; - M128A Xmm7; - M128A Xmm8; - M128A Xmm9; - M128A Xmm10; - M128A Xmm11; - M128A Xmm12; - M128A Xmm13; - M128A Xmm14; - M128A Xmm15; - } DUMMYSTRUCTNAME; - } DUMMYUNIONNAME; - M128A VectorRegister[26]; - ULONG64 VectorControl; - ULONG64 DebugControl; - ULONG64 LastBranchToRip; - ULONG64 LastBranchFromRip; - ULONG64 LastExceptionToRip; - ULONG64 LastExceptionFromRip; -} CONTEXT; - -#define PCR_MINOR_VERSION 1 -#define PCR_MAJOR_VERSION 1 - -typedef struct _KPCR -{ - _ANONYMOUS_UNION union - { - NT_TIB NtTib; - _ANONYMOUS_STRUCT struct - { - union _KGDTENTRY64 *GdtBase; - struct _KTSS64 *TssBase; - ULONG64 UserRsp; - struct _KPCR *Self; - struct _KPRCB *CurrentPrcb; - PKSPIN_LOCK_QUEUE LockArray; - PVOID Used_Self; - }; - }; - union _KIDTENTRY64 *IdtBase; - ULONG64 Unused[2]; - KIRQL Irql; - UCHAR SecondLevelCacheAssociativity; - UCHAR ObsoleteNumber; - UCHAR Fill0; - ULONG Unused0[3]; - USHORT MajorVersion; - USHORT MinorVersion; - ULONG StallScaleFactor; - PVOID Unused1[3]; - ULONG KernelReserved[15]; - ULONG SecondLevelCacheSize; - ULONG HalReserved[16]; - ULONG Unused2; - PVOID KdVersionBlock; - PVOID Unused3; - ULONG PcrAlign1[24]; -} KPCR, *PKPCR; - -FORCEINLINE -PKPCR -KeGetPcr(VOID) -{ - return (PKPCR)__readgsqword(FIELD_OFFSET(KPCR, Self)); -} - -FORCEINLINE -ULONG -KeGetCurrentProcessorNumber(VOID) -{ - return (ULONG)__readgsword(0x184); -} - - -#define PTI_SHIFT 12L -#define PDI_SHIFT 21L -#define PPI_SHIFT 30L -#define PXI_SHIFT 39L -#define PTE_PER_PAGE 512 -#define PDE_PER_PAGE 512 -#define PPE_PER_PAGE 512 -#define PXE_PER_PAGE 512 -#define PTI_MASK_AMD64 (PTE_PER_PAGE - 1) -#define PDI_MASK_AMD64 (PDE_PER_PAGE - 1) -#define PPI_MASK (PPE_PER_PAGE - 1) -#define PXI_MASK (PXE_PER_PAGE - 1) - -#define PXE_BASE 0xFFFFF6FB7DBED000ULL -#define PXE_SELFMAP 0xFFFFF6FB7DBEDF68ULL -#define PPE_BASE 0xFFFFF6FB7DA00000ULL -#define PDE_BASE 0xFFFFF6FB40000000ULL -#define PTE_BASE 0xFFFFF68000000000ULL -#define PXE_TOP 0xFFFFF6FB7DBEDFFFULL -#define PPE_TOP 0xFFFFF6FB7DBFFFFFULL -#define PDE_TOP 0xFFFFF6FB7FFFFFFFULL -#define PTE_TOP 0xFFFFF6FFFFFFFFFFULL - -extern NTKERNELAPI PVOID MmHighestUserAddress; -extern NTKERNELAPI PVOID MmSystemRangeStart; -extern NTKERNELAPI ULONG64 MmUserProbeAddress; - -#define MM_HIGHEST_USER_ADDRESS MmHighestUserAddress -#define MM_SYSTEM_RANGE_START MmSystemRangeStart -#define MM_USER_PROBE_ADDRESS MmUserProbeAddress -#define MM_LOWEST_USER_ADDRESS (PVOID)0x10000 -#define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xFFFF080000000000ULL - - -#elif defined(_M_IA64) - -#elif defined(_M_PPC) - - -#elif defined(_M_MIPS) - -#elif defined(_M_ARM) -#else -#error Unknown Architecture -#endif - -/****************************************************************************** - * Executive Functions * - ******************************************************************************/ static __inline PVOID ExAllocateFromZone( IN PZONE_HEADER Zone) @@ -3303,37 +1674,8 @@ ExFreeToZone( #define ExIsResourceAcquired ExIsResourceAcquiredSharedLite #define ExReleaseResourceForThread ExReleaseResourceForThreadLite -#ifdef _X86_ - -typedef enum _INTERLOCKED_RESULT { - ResultNegative = RESULT_NEGATIVE, - ResultZero = RESULT_ZERO, - ResultPositive = RESULT_POSITIVE -} INTERLOCKED_RESULT; - -NTKERNELAPI -INTERLOCKED_RESULT -FASTCALL -Exfi386InterlockedIncrementLong( - IN OUT LONG volatile *Addend); - -NTKERNELAPI -INTERLOCKED_RESULT -FASTCALL -Exfi386InterlockedDecrementLong( - IN PLONG Addend); - -NTKERNELAPI -ULONG -FASTCALL -Exfi386InterlockedExchangeUlong( - IN PULONG Target, - IN ULONG Value); -#endif - - - #if (NTDDI_VERSION >= NTDDI_WIN2K) + NTKERNELAPI NTSTATUS NTAPI @@ -3370,28 +1712,315 @@ NTKERNELAPI DECLSPEC_NORETURN VOID NTAPI -ExRaiseAccessViolation(VOID); +ExRaiseAccessViolation( + VOID); NTKERNELAPI DECLSPEC_NORETURN VOID NTAPI -ExRaiseDatatypeMisalignment(VOID); +ExRaiseDatatypeMisalignment( + VOID); +#endif -#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ +#ifdef _X86_ +NTKERNELAPI +INTERLOCKED_RESULT +FASTCALL +Exfi386InterlockedIncrementLong( + IN OUT LONG volatile *Addend); + +NTKERNELAPI +INTERLOCKED_RESULT +FASTCALL +Exfi386InterlockedDecrementLong( + IN PLONG Addend); + +NTKERNELAPI +ULONG +FASTCALL +Exfi386InterlockedExchangeUlong( + IN PULONG Target, + IN ULONG Value); + +#endif /* _X86_ */ + +#ifndef _ARC_DDK_ +#define _ARC_DDK_ +typedef enum _CONFIGURATION_TYPE { + ArcSystem, + CentralProcessor, + FloatingPointProcessor, + PrimaryIcache, + PrimaryDcache, + SecondaryIcache, + SecondaryDcache, + SecondaryCache, + EisaAdapter, + TcAdapter, + ScsiAdapter, + DtiAdapter, + MultiFunctionAdapter, + DiskController, + TapeController, + CdromController, + WormController, + SerialController, + NetworkController, + DisplayController, + ParallelController, + PointerController, + KeyboardController, + AudioController, + OtherController, + DiskPeripheral, + FloppyDiskPeripheral, + TapePeripheral, + ModemPeripheral, + MonitorPeripheral, + PrinterPeripheral, + PointerPeripheral, + KeyboardPeripheral, + TerminalPeripheral, + OtherPeripheral, + LinePeripheral, + NetworkPeripheral, + SystemMemory, + DockingInformation, + RealModeIrqRoutingTable, + RealModePCIEnumeration, + MaximumType +} CONFIGURATION_TYPE, *PCONFIGURATION_TYPE; +#endif /* !_ARC_DDK_ */ + +typedef struct _CONTROLLER_OBJECT { + CSHORT Type; + CSHORT Size; + PVOID ControllerExtension; + KDEVICE_QUEUE DeviceWaitQueue; + ULONG Spare1; + LARGE_INTEGER Spare2; +} CONTROLLER_OBJECT, *PCONTROLLER_OBJECT; + +typedef struct _CONFIGURATION_INFORMATION { + ULONG DiskCount; + ULONG FloppyCount; + ULONG CdRomCount; + ULONG TapeCount; + ULONG ScsiPortCount; + ULONG SerialCount; + ULONG ParallelCount; + BOOLEAN AtDiskPrimaryAddressClaimed; + BOOLEAN AtDiskSecondaryAddressClaimed; + ULONG Version; + ULONG MediumChangerCount; +} CONFIGURATION_INFORMATION, *PCONFIGURATION_INFORMATION; + +typedef +NTSTATUS +(NTAPI *PIO_QUERY_DEVICE_ROUTINE)( + IN PVOID Context, + IN PUNICODE_STRING PathName, + IN INTERFACE_TYPE BusType, + IN ULONG BusNumber, + IN PKEY_VALUE_FULL_INFORMATION *BusInformation, + IN CONFIGURATION_TYPE ControllerType, + IN ULONG ControllerNumber, + IN PKEY_VALUE_FULL_INFORMATION *ControllerInformation, + IN CONFIGURATION_TYPE PeripheralType, + IN ULONG PeripheralNumber, + IN PKEY_VALUE_FULL_INFORMATION *PeripheralInformation); + +typedef +VOID +(NTAPI DRIVER_REINITIALIZE)( + IN struct _DRIVER_OBJECT *DriverObject, + IN PVOID Context, + IN ULONG Count); + +typedef DRIVER_REINITIALIZE *PDRIVER_REINITIALIZE; + +/** Filesystem runtime library routines **/ + +#if (NTDDI_VERSION >= NTDDI_WIN2K) +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlIsTotalDeviceFailure( + IN NTSTATUS Status); +#endif + +/* Hardware Abstraction Layer Types */ + +typedef VOID +(NTAPI *PciPin2Line)( + IN struct _BUS_HANDLER *BusHandler, + IN struct _BUS_HANDLER *RootHandler, + IN PCI_SLOT_NUMBER SlotNumber, + IN PPCI_COMMON_CONFIG PciData); + +typedef VOID +(NTAPI *PciLine2Pin)( + IN struct _BUS_HANDLER *BusHandler, + IN struct _BUS_HANDLER *RootHandler, + IN PCI_SLOT_NUMBER SlotNumber, + IN PPCI_COMMON_CONFIG PciNewData, + IN PPCI_COMMON_CONFIG PciOldData); + +typedef VOID +(NTAPI *PciReadWriteConfig)( + IN struct _BUS_HANDLER *BusHandler, + IN PCI_SLOT_NUMBER Slot, + IN PVOID Buffer, + IN ULONG Offset, + IN ULONG Length); + +#define PCI_DATA_TAG ' ICP' +#define PCI_DATA_VERSION 1 + +typedef struct _PCIBUSDATA { + ULONG Tag; + ULONG Version; + PciReadWriteConfig ReadConfig; + PciReadWriteConfig WriteConfig; + PciPin2Line Pin2Line; + PciLine2Pin Line2Pin; + PCI_SLOT_NUMBER ParentSlot; + PVOID Reserved[4]; +} PCIBUSDATA, *PPCIBUSDATA; /* Hardware Abstraction Layer Functions */ +#if !defined(NO_LEGACY_DRIVERS) + #if (NTDDI_VERSION >= NTDDI_WIN2K) -#if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_) +NTHALAPI +NTSTATUS +NTAPI +HalAssignSlotResources( + IN PUNICODE_STRING RegistryPath, + IN PUNICODE_STRING DriverClassName, + IN PDRIVER_OBJECT DriverObject, + IN PDEVICE_OBJECT DeviceObject, + IN INTERFACE_TYPE BusType, + IN ULONG BusNumber, + IN ULONG SlotNumber, + IN OUT PCM_RESOURCE_LIST *AllocatedResources); -/* Nothing here */ +NTHALAPI +ULONG +NTAPI +HalGetInterruptVector( + IN INTERFACE_TYPE InterfaceType, + IN ULONG BusNumber, + IN ULONG BusInterruptLevel, + IN ULONG BusInterruptVector, + OUT PKIRQL Irql, + OUT PKAFFINITY Affinity); -#else /* USE_DMA_MACROS ... */ +NTHALAPI +ULONG +NTAPI +HalSetBusData( + IN BUS_DATA_TYPE BusDataType, + IN ULONG BusNumber, + IN ULONG SlotNumber, + IN PVOID Buffer, + IN ULONG Length); +#endif + +#endif /* !defined(NO_LEGACY_DRIVERS) */ + +#if (NTDDI_VERSION >= NTDDI_WIN2K) + +NTHALAPI +PADAPTER_OBJECT +NTAPI +HalGetAdapter( + IN PDEVICE_DESCRIPTION DeviceDescription, + IN OUT PULONG NumberOfMapRegisters); + +NTHALAPI +BOOLEAN +NTAPI +HalMakeBeep( + IN ULONG Frequency); + +VOID +NTAPI +HalPutDmaAdapter( + IN PADAPTER_OBJECT DmaAdapter); + +NTHALAPI +VOID +NTAPI +HalAcquireDisplayOwnership( + IN PHAL_RESET_DISPLAY_PARAMETERS ResetDisplayParameters); + +NTHALAPI +ULONG +NTAPI +HalGetBusData( + IN BUS_DATA_TYPE BusDataType, + IN ULONG BusNumber, + IN ULONG SlotNumber, + OUT PVOID Buffer, + IN ULONG Length); + +NTHALAPI +ULONG +NTAPI +HalGetBusDataByOffset( + IN BUS_DATA_TYPE BusDataType, + IN ULONG BusNumber, + IN ULONG SlotNumber, + OUT PVOID Buffer, + IN ULONG Offset, + IN ULONG Length); + +NTHALAPI +ULONG +NTAPI +HalSetBusDataByOffset( + IN BUS_DATA_TYPE BusDataType, + IN ULONG BusNumber, + IN ULONG SlotNumber, + IN PVOID Buffer, + IN ULONG Offset, + IN ULONG Length); + +NTHALAPI +BOOLEAN +NTAPI +HalTranslateBusAddress( + IN INTERFACE_TYPE InterfaceType, + IN ULONG BusNumber, + IN PHYSICAL_ADDRESS BusAddress, + IN OUT PULONG AddressSpace, + OUT PPHYSICAL_ADDRESS TranslatedAddress); + +#endif + +#if (NTDDI_VERSION >= NTDDI_WINXP) +NTKERNELAPI +VOID +FASTCALL +HalExamineMBR( + IN PDEVICE_OBJECT DeviceObject, + IN ULONG SectorSize, + IN ULONG MBRTypeIdentifier, + OUT PVOID *Buffer); +#endif + +#if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_) +// nothing here +#else + +#if (NTDDI_VERSION >= NTDDI_WIN2K) //DECLSPEC_DEPRECATED_DDK NTHALAPI VOID @@ -3457,207 +2086,12 @@ HalAllocateAdapterChannel( IN ULONG NumberOfMapRegisters, IN PDRIVER_CONTROL ExecutionRoutine); -#endif /* USE_DMA_MACROS ... */ - -#if !defined(NO_LEGACY_DRIVERS) -NTHALAPI -NTSTATUS -NTAPI -HalAssignSlotResources( - IN PUNICODE_STRING RegistryPath, - IN PUNICODE_STRING DriverClassName, - IN PDRIVER_OBJECT DriverObject, - IN PDEVICE_OBJECT DeviceObject, - IN INTERFACE_TYPE BusType, - IN ULONG BusNumber, - IN ULONG SlotNumber, - IN OUT PCM_RESOURCE_LIST *AllocatedResources); - -NTHALAPI -ULONG -NTAPI -HalGetInterruptVector( - IN INTERFACE_TYPE InterfaceType, - IN ULONG BusNumber, - IN ULONG BusInterruptLevel, - IN ULONG BusInterruptVector, - OUT PKIRQL Irql, - OUT PKAFFINITY Affinity); - -NTHALAPI -ULONG -NTAPI -HalSetBusData( - IN BUS_DATA_TYPE BusDataType, - IN ULONG BusNumber, - IN ULONG SlotNumber, - IN PVOID Buffer, - IN ULONG Length); - -NTHALAPI -ULONG -NTAPI -HalGetBusData( - IN BUS_DATA_TYPE BusDataType, - IN ULONG BusNumber, - IN ULONG SlotNumber, - OUT PVOID Buffer, - IN ULONG Length); - -NTHALAPI -BOOLEAN -NTAPI -HalMakeBeep( - IN ULONG Frequency); -#endif /* !defined(NO_LEGACY_DRIVERS) */ - -NTHALAPI -PADAPTER_OBJECT -NTAPI -HalGetAdapter( - IN PDEVICE_DESCRIPTION DeviceDescription, - OUT PULONG NumberOfMapRegisters); - -VOID -NTAPI -HalPutDmaAdapter( - IN PADAPTER_OBJECT DmaAdapter); - -NTHALAPI -VOID -NTAPI -HalAcquireDisplayOwnership( - IN PHAL_RESET_DISPLAY_PARAMETERS ResetDisplayParameters); - -NTHALAPI -ULONG -NTAPI -HalGetBusDataByOffset( - IN BUS_DATA_TYPE BusDataType, - IN ULONG BusNumber, - IN ULONG SlotNumber, - OUT PVOID Buffer, - IN ULONG Offset, - IN ULONG Length); - -NTHALAPI -ULONG -NTAPI -HalSetBusDataByOffset( - IN BUS_DATA_TYPE BusDataType, - IN ULONG BusNumber, - IN ULONG SlotNumber, - IN PVOID Buffer, - IN ULONG Offset, - IN ULONG Length); - -NTHALAPI -BOOLEAN -NTAPI -HalTranslateBusAddress( - IN INTERFACE_TYPE InterfaceType, - IN ULONG BusNumber, - IN PHYSICAL_ADDRESS BusAddress, - IN OUT PULONG AddressSpace, - OUT PPHYSICAL_ADDRESS TranslatedAddress); - -NTHALAPI -PVOID -NTAPI -HalAllocateCrashDumpRegisters( - IN PADAPTER_OBJECT AdapterObject, - IN OUT PULONG NumberOfMapRegisters); - -NTSTATUS -NTAPI -HalGetScatterGatherList( - IN PADAPTER_OBJECT DmaAdapter, - IN PDEVICE_OBJECT DeviceObject, - IN PMDL Mdl, - IN PVOID CurrentVa, - IN ULONG Length, - IN PDRIVER_LIST_CONTROL ExecutionRoutine, - IN PVOID Context, - IN BOOLEAN WriteToDevice); - -VOID -NTAPI -HalPutScatterGatherList( - IN PADAPTER_OBJECT DmaAdapter, - IN PSCATTER_GATHER_LIST ScatterGather, - IN BOOLEAN WriteToDevice); - #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ -#if (NTDDI_VERSION >= NTDDI_WINXP) -NTKERNELAPI -VOID -FASTCALL -HalExamineMBR( - IN PDEVICE_OBJECT DeviceObject, - IN ULONG SectorSize, - IN ULONG MBRTypeIdentifier, - OUT PVOID *Buffer); -#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ +#endif /* defined(USE_DMA_MACROS) && !defined(_NTHAL_) && (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_) */ -#if (NTDDI_VERSION >= NTDDI_WIN7) +/* I/O Manager Functions */ -NTSTATUS -NTAPI -HalAllocateHardwareCounters( - IN PGROUP_AFFINITY GroupAffinty, - IN ULONG GroupCount, - IN PPHYSICAL_COUNTER_RESOURCE_LIST ResourceList, - OUT PHANDLE CounterSetHandle); - -NTSTATUS -NTAPI -HalFreeHardwareCounters( - IN HANDLE CounterSetHandle); - -#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ - -#if defined(_IA64_) -#if (NTDDI_VERSION >= NTDDI_WIN2K) -NTHALAPI -ULONG -NTAPI -HalGetDmaAlignmentRequirement(VOID); -#endif -#endif /* defined(_IA64_) */ - -#if defined(_M_IX86) || defined(_M_AMD64) -#define HalGetDmaAlignmentRequirement() 1L -#endif - -#if (NTDDI_VERSION >= NTDDI_WIN7) - -typedef struct _WHEA_ERROR_SOURCE_DESCRIPTOR *PWHEA_ERROR_SOURCE_DESCRIPTOR; -typedef struct _WHEA_ERROR_RECORD *PWHEA_ERROR_RECORD; - -NTHALAPI -VOID -NTAPI -HalBugCheckSystem( - IN PWHEA_ERROR_SOURCE_DESCRIPTOR ErrorSource, - IN PWHEA_ERROR_RECORD ErrorRecord); - -#else - -typedef struct _WHEA_ERROR_RECORD *PWHEA_ERROR_RECORD; - -NTHALAPI -VOID -NTAPI -HalBugCheckSystem( - IN PWHEA_ERROR_RECORD ErrorRecord); - -#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ - - -/****************************************************************************** - * I/O Manager Functions * - ******************************************************************************/ /* * VOID IoAssignArcName( * IN PUNICODE_STRING ArcName, @@ -3673,19 +2107,8 @@ HalBugCheckSystem( */ #define IoDeassignArcName IoDeleteSymbolicLink -VOID -FORCEINLINE -NTAPI -IoInitializeDriverCreateContext( - PIO_DRIVER_CREATE_CONTEXT DriverContext) -{ - RtlZeroMemory(DriverContext, sizeof(IO_DRIVER_CREATE_CONTEXT)); - DriverContext->Size = sizeof(IO_DRIVER_CREATE_CONTEXT); -} - - - #if (NTDDI_VERSION >= NTDDI_WIN2K) + #if !(defined(USE_DMA_MACROS) && (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_)) NTKERNELAPI NTSTATUS @@ -3698,7 +2121,6 @@ IoAllocateAdapterChannel( IN PVOID Context); #endif -#if !defined(DMA_MACROS_DEFINED) //DECLSPEC_DEPRECATED_DDK NTHALAPI PHYSICAL_ADDRESS @@ -3710,7 +2132,6 @@ IoMapTransfer( IN PVOID CurrentVa, IN OUT PULONG Length, IN BOOLEAN WriteToDevice); -#endif NTKERNELAPI VOID @@ -3742,7 +2163,8 @@ IoFreeController( NTKERNELAPI PCONFIGURATION_INFORMATION NTAPI -IoGetConfigurationInformation(VOID); +IoGetConfigurationInformation( + VOID); NTKERNELAPI PDEVICE_OBJECT @@ -3760,7 +2182,8 @@ IoCancelFileOpen( NTKERNELAPI PGENERIC_MAPPING NTAPI -IoGetFileObjectGenericMapping(VOID); +IoGetFileObjectGenericMapping( + VOID); NTKERNELAPI PIRP @@ -3832,7 +2255,7 @@ IoReportDetectedDevice( IN PCM_RESOURCE_LIST ResourceList OPTIONAL, IN PIO_RESOURCE_REQUIREMENTS_LIST ResourceRequirements OPTIONAL, IN BOOLEAN ResourceAssigned, - IN OUT PDEVICE_OBJECT *DeviceObject OPTIONAL); + IN OUT PDEVICE_OBJECT *DeviceObject); NTKERNELAPI NTSTATUS @@ -3878,59 +2301,9 @@ IoAssignResources( IN PIO_RESOURCE_REQUIREMENTS_LIST RequestedResources OPTIONAL, IN OUT PCM_RESOURCE_LIST *AllocatedResources); -NTKERNELAPI -BOOLEAN -NTAPI -IoSetThreadHardErrorMode( - IN BOOLEAN EnableHardErrors); - #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ -#if (NTDDI_VERSION >= NTDDI_WIN2KSP3) - -NTKERNELAPI -BOOLEAN -NTAPI -IoIsFileOriginRemote( - IN PFILE_OBJECT FileObject); - -NTKERNELAPI -NTSTATUS -NTAPI -IoSetFileOrigin( - IN PFILE_OBJECT FileObject, - IN BOOLEAN Remote); - -#endif /* (NTDDI_VERSION >= NTDDI_WIN2KSP3) */ - #if (NTDDI_VERSION >= NTDDI_WINXP) -NTKERNELAPI -NTSTATUS -FASTCALL -IoReadPartitionTable( - IN PDEVICE_OBJECT DeviceObject, - IN ULONG SectorSize, - IN BOOLEAN ReturnRecognizedPartitions, - OUT struct _DRIVE_LAYOUT_INFORMATION **PartitionBuffer); - -NTKERNELAPI -NTSTATUS -FASTCALL -IoSetPartitionInformation( - IN PDEVICE_OBJECT DeviceObject, - IN ULONG SectorSize, - IN ULONG PartitionNumber, - IN ULONG PartitionType); - -NTKERNELAPI -NTSTATUS -FASTCALL -IoWritePartitionTable( - IN PDEVICE_OBJECT DeviceObject, - IN ULONG SectorSize, - IN ULONG SectorsPerTrack, - IN ULONG NumberOfHeads, - IN struct _DRIVE_LAYOUT_INFORMATION *PartitionBuffer); NTKERNELAPI NTSTATUS @@ -3947,12 +2320,30 @@ IoReadDiskSignature( IN ULONG BytesPerSector, OUT PDISK_SIGNATURE Signature); +NTKERNELAPI +NTSTATUS +FASTCALL +IoReadPartitionTable( + IN PDEVICE_OBJECT DeviceObject, + IN ULONG SectorSize, + IN BOOLEAN ReturnRecognizedPartitions, + OUT struct _DRIVE_LAYOUT_INFORMATION **PartitionBuffer); + NTKERNELAPI NTSTATUS NTAPI IoReadPartitionTableEx( IN PDEVICE_OBJECT DeviceObject, - OUT struct _DRIVE_LAYOUT_INFORMATION_EX **PartitionBuffer); + IN struct _DRIVE_LAYOUT_INFORMATION_EX **PartitionBuffer); + +NTKERNELAPI +NTSTATUS +FASTCALL +IoSetPartitionInformation( + IN PDEVICE_OBJECT DeviceObject, + IN ULONG SectorSize, + IN ULONG PartitionNumber, + IN ULONG PartitionType); NTKERNELAPI NTSTATUS @@ -3968,6 +2359,12 @@ NTAPI IoSetSystemPartition( IN PUNICODE_STRING VolumeNameString); +NTKERNELAPI +BOOLEAN +NTAPI +IoSetThreadHardErrorMode( + IN BOOLEAN EnableHardErrors); + NTKERNELAPI NTSTATUS NTAPI @@ -3984,30 +2381,20 @@ IoVolumeDeviceToDosName( NTKERNELAPI NTSTATUS -NTAPI -IoWritePartitionTableEx( +FASTCALL +IoWritePartitionTable( IN PDEVICE_OBJECT DeviceObject, - IN struct _DRIVE_LAYOUT_INFORMATION_EX *DriveLayout); + IN ULONG SectorSize, + IN ULONG SectorsPerTrack, + IN ULONG NumberOfHeads, + IN struct _DRIVE_LAYOUT_INFORMATION *PartitionBuffer); NTKERNELAPI NTSTATUS NTAPI -IoCreateFileSpecifyDeviceObjectHint( - OUT PHANDLE FileHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes, - OUT PIO_STATUS_BLOCK IoStatusBlock, - IN PLARGE_INTEGER AllocationSize OPTIONAL, - IN ULONG FileAttributes, - IN ULONG ShareAccess, - IN ULONG Disposition, - IN ULONG CreateOptions, - IN PVOID EaBuffer OPTIONAL, - IN ULONG EaLength, - IN CREATE_FILE_TYPE CreateFileType, - IN PVOID InternalParameters OPTIONAL, - IN ULONG Options, - IN PVOID DeviceObject OPTIONAL); +IoWritePartitionTableEx( + IN PDEVICE_OBJECT DeviceObject, + IN struct _DRIVE_LAYOUT_INFORMATION_EX *DriveLayout); NTKERNELAPI NTSTATUS @@ -4019,100 +2406,8 @@ IoAttachDeviceToDeviceStackSafe( #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ +/** Kernel debugger routines **/ -#if (NTDDI_VERSION >= NTDDI_WS03) -NTKERNELAPI -IO_PAGING_PRIORITY -FASTCALL -IoGetPagingIoPriority( - IN PIRP Irp); - -#endif /* (NTDDI_VERSION >= NTDDI_WS03) */ - -#if (NTDDI_VERSION >= NTDDI_WS03SP1) -BOOLEAN -NTAPI -IoTranslateBusAddress( - IN INTERFACE_TYPE InterfaceType, - IN ULONG BusNumber, - IN PHYSICAL_ADDRESS BusAddress, - IN OUT PULONG AddressSpace, - OUT PPHYSICAL_ADDRESS TranslatedAddress); -#endif - -#if (NTDDI_VERSION >= NTDDI_VISTA) -NTKERNELAPI -NTSTATUS -NTAPI -IoUpdateDiskGeometry( - IN PDEVICE_OBJECT DeviceObject, - IN struct _DISK_GEOMETRY_EX* OldDiskGeometry, - IN struct _DISK_GEOMETRY_EX* NewDiskGeometry); - -PTXN_PARAMETER_BLOCK -NTAPI -IoGetTransactionParameterBlock( - IN PFILE_OBJECT FileObject); - -NTKERNELAPI -NTSTATUS -NTAPI -IoCreateFileEx( - OUT PHANDLE FileHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes, - OUT PIO_STATUS_BLOCK IoStatusBlock, - IN PLARGE_INTEGER AllocationSize OPTIONAL, - IN ULONG FileAttributes, - IN ULONG ShareAccess, - IN ULONG Disposition, - IN ULONG CreateOptions, - IN PVOID EaBuffer OPTIONAL, - IN ULONG EaLength, - IN CREATE_FILE_TYPE CreateFileType, - IN PVOID InternalParameters OPTIONAL, - IN ULONG Options, - IN PIO_DRIVER_CREATE_CONTEXT DriverContext OPTIONAL); - -NTSTATUS -NTAPI -IoSetIrpExtraCreateParameter( - IN OUT PIRP Irp, - IN struct _ECP_LIST *ExtraCreateParameter); - -VOID -NTAPI -IoClearIrpExtraCreateParameter( - IN OUT PIRP Irp); - -NTSTATUS -NTAPI -IoGetIrpExtraCreateParameter( - IN PIRP Irp, - OUT struct _ECP_LIST **ExtraCreateParameter OPTIONAL); - -BOOLEAN -NTAPI -IoIsFileObjectIgnoringSharing( - IN PFILE_OBJECT FileObject); - - -#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ - - -#if (NTDDI_VERSION >= NTDDI_WIN7) -NTSTATUS -NTAPI -IoSetFileObjectIgnoreSharing( - IN PFILE_OBJECT FileObject); - - -#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ - - -/****************************************************************************** - * Kernel Debugger Functions * - ******************************************************************************/ NTSYSAPI ULONG NTAPI @@ -4121,25 +2416,16 @@ DbgPrompt( OUT PCH Response, IN ULONG MaximumResponseLength); -/****************************************************************************** - * Kernel Functions * - ******************************************************************************/ -NTKERNELAPI -VOID -FASTCALL -KeInvalidateRangeAllCaches( - IN PVOID BaseAddress, - IN ULONG Length); - +/* Kernel Functions */ #if (NTDDI_VERSION >= NTDDI_WIN2K) NTKERNELAPI +DECLSPEC_NORETURN VOID NTAPI -KeSetImportanceDpc( - IN OUT PRKDPC Dpc, - IN KDPC_IMPORTANCE Importance); +KeBugCheck( + IN ULONG BugCheckCode); NTKERNELAPI LONG @@ -4156,204 +2442,24 @@ KeSetBasePriorityThread( IN OUT PRKTHREAD Thread, IN LONG Increment); -NTKERNELAPI -VOID -NTAPI -KeEnterCriticalRegion(VOID); +#endif -NTKERNELAPI -VOID -NTAPI -KeLeaveCriticalRegion(VOID); +/* Memory Manager Types */ -NTKERNELAPI -DECLSPEC_NORETURN -VOID -NTAPI -KeBugCheck( - IN ULONG BugCheckCode); +typedef struct _PHYSICAL_MEMORY_RANGE { + PHYSICAL_ADDRESS BaseAddress; + LARGE_INTEGER NumberOfBytes; +} PHYSICAL_MEMORY_RANGE, *PPHYSICAL_MEMORY_RANGE; - -#if defined(SINGLE_GROUP_LEGACY_API) - - -NTKERNELAPI -VOID -NTAPI -KeSetTargetProcessorDpc( - IN OUT PRKDPC Dpc, - IN CCHAR Number); - -NTKERNELAPI -KAFFINITY -NTAPI -KeQueryActiveProcessors(VOID); - -#endif /* defined(SINGLE_GROUP_LEGACY_API) */ - - -#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ - -#if (NTDDI_VERSION >= NTDDI_WINXP) -NTKERNELAPI -BOOLEAN -NTAPI -KeAreApcsDisabled(VOID); - - -#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ - - -#if (NTDDI_VERSION >= NTDDI_WS03) - - -NTKERNELAPI -BOOLEAN -NTAPI -KeInvalidateAllCaches(VOID); - -#endif /* (NTDDI_VERSION >= NTDDI_WS03) */ - -#if (NTDDI_VERSION >= NTDDI_WS03SP1) - -NTKERNELAPI -NTSTATUS -NTAPI -KeExpandKernelStackAndCallout( - IN PEXPAND_STACK_CALLOUT Callout, - IN PVOID Parameter OPTIONAL, - IN SIZE_T Size); - -NTKERNELAPI -VOID -NTAPI -KeEnterGuardedRegion(VOID); - -NTKERNELAPI -VOID -NTAPI -KeLeaveGuardedRegion(VOID); - - -#endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */ - -#if (NTDDI_VERSION >= NTDDI_VISTA) - - -#if defined(SINGLE_GROUP_LEGACY_API) -NTKERNELAPI -ULONG -NTAPI -KeQueryActiveProcessorCount( - OUT PKAFFINITY ActiveProcessors OPTIONAL); - -NTKERNELAPI -ULONG -NTAPI -KeQueryMaximumProcessorCount(VOID); - -#endif /* SINGLE_GROUP_LEGACY_API */ - -#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ - - -#if (NTDDI_VERSION >= NTDDI_WIN7) - -NTKERNELAPI -ULONG -NTAPI -KeQueryActiveProcessorCountEx( - IN USHORT GroupNumber); - -NTKERNELAPI -ULONG -NTAPI -KeQueryMaximumProcessorCountEx( - IN USHORT GroupNumber); - -NTKERNELAPI -USHORT -NTAPI -KeQueryActiveGroupCount(VOID); - -NTKERNELAPI -USHORT -NTAPI -KeQueryMaximumGroupCount(VOID); - -NTKERNELAPI -KAFFINITY -NTAPI -KeQueryGroupAffinity( - IN USHORT GroupNumber); - -NTKERNELAPI -ULONG -NTAPI -KeGetCurrentProcessorNumberEx( - OUT PPROCESSOR_NUMBER ProcNumber OPTIONAL); - -NTKERNELAPI -VOID -NTAPI -KeQueryNodeActiveAffinity( - IN USHORT NodeNumber, - OUT PGROUP_AFFINITY Affinity OPTIONAL, - OUT PUSHORT Count OPTIONAL); - -NTKERNELAPI -USHORT -NTAPI -KeQueryNodeMaximumProcessorCount( - IN USHORT NodeNumber); - -NTKERNELAPI -USHORT -NTAPI -KeQueryHighestNodeNumber(VOID); - -NTKERNELAPI -USHORT -NTAPI -KeGetCurrentNodeNumber(VOID); - -NTKERNELAPI -NTSTATUS -NTAPI -KeQueryLogicalProcessorRelationship( - IN PPROCESSOR_NUMBER ProcessorNumber OPTIONAL, - IN LOGICAL_PROCESSOR_RELATIONSHIP RelationshipType, - OUT PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX Information OPTIONAL, - IN OUT PULONG Length); - -NTKERNELAPI -NTSTATUS -NTAPI -KeSetHardwareCounterConfiguration( - IN PHARDWARE_COUNTER CounterArray, - IN ULONG Count); - -NTKERNELAPI -NTSTATUS -NTAPI -KeQueryHardwareCounterConfiguration( - OUT PHARDWARE_COUNTER CounterArray, - IN ULONG MaximumCount, - OUT PULONG Count); - - -#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ - - -/****************************************************************************** - * Memory manager Functions * - ******************************************************************************/ +/* Memory Manager Functions */ #if (NTDDI_VERSION >= NTDDI_WIN2K) + NTKERNELAPI PPHYSICAL_MEMORY_RANGE NTAPI -MmGetPhysicalMemoryRanges(VOID); +MmGetPhysicalMemoryRanges( + VOID); NTKERNELAPI PHYSICAL_ADDRESS @@ -4427,7 +2533,8 @@ MmIsAddressValid( NTKERNELAPI BOOLEAN NTAPI -MmIsThisAnNtAsSystem(VOID); +MmIsThisAnNtAsSystem( + VOID); NTKERNELAPI VOID @@ -4475,144 +2582,9 @@ MmUnmapVideoDisplay( IN PVOID BaseAddress, IN SIZE_T NumberOfBytes); -NTKERNELAPI -NTSTATUS -NTAPI -MmAddPhysicalMemory( - IN PPHYSICAL_ADDRESS StartAddress, - IN OUT PLARGE_INTEGER NumberOfBytes); - -NTKERNELAPI -PVOID -NTAPI -MmAllocateContiguousMemory( - IN SIZE_T NumberOfBytes, - IN PHYSICAL_ADDRESS HighestAcceptableAddress); - -NTKERNELAPI -PVOID -NTAPI -MmAllocateContiguousMemorySpecifyCache( - IN SIZE_T NumberOfBytes, - IN PHYSICAL_ADDRESS LowestAcceptableAddress, - IN PHYSICAL_ADDRESS HighestAcceptableAddress, - IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL, - IN MEMORY_CACHING_TYPE CacheType); - -NTKERNELAPI -PVOID -NTAPI -MmAllocateContiguousMemorySpecifyCacheNode( - IN SIZE_T NumberOfBytes, - IN PHYSICAL_ADDRESS LowestAcceptableAddress, - IN PHYSICAL_ADDRESS HighestAcceptableAddress, - IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL, - IN MEMORY_CACHING_TYPE CacheType, - IN NODE_REQUIREMENT PreferredNode); - -NTKERNELAPI -VOID -NTAPI -MmFreeContiguousMemory( - IN PVOID BaseAddress); - -NTKERNELAPI -VOID -NTAPI -MmFreeContiguousMemorySpecifyCache( - IN PVOID BaseAddress, - IN SIZE_T NumberOfBytes, - IN MEMORY_CACHING_TYPE CacheType); - - #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ -#if (NTDDI_VERSION >= NTDDI_WINXP) - -NTKERNELAPI -NTSTATUS -NTAPI -MmAdvanceMdl( - IN OUT PMDL Mdl, - IN ULONG NumberOfBytes); - -NTKERNELAPI -PVOID -NTAPI -MmAllocateMappingAddress( - IN SIZE_T NumberOfBytes, - IN ULONG PoolTag); - -NTKERNELAPI -VOID -NTAPI -MmFreeMappingAddress( - IN PVOID BaseAddress, - IN ULONG PoolTag); - -NTKERNELAPI -NTSTATUS -NTAPI -MmIsVerifierEnabled( - OUT PULONG VerifierFlags); - -NTKERNELAPI -PVOID -NTAPI -MmMapLockedPagesWithReservedMapping( - IN PVOID MappingAddress, - IN ULONG PoolTag, - IN PMDL MemoryDescriptorList, - IN MEMORY_CACHING_TYPE CacheType); - -NTKERNELAPI -NTSTATUS -NTAPI -MmProtectMdlSystemAddress( - IN PMDL MemoryDescriptorList, - IN ULONG NewProtect); - -NTKERNELAPI -VOID -NTAPI -MmUnmapReservedMapping( - IN PVOID BaseAddress, - IN ULONG PoolTag, - IN PMDL MemoryDescriptorList); - -NTKERNELAPI -NTSTATUS -NTAPI -MmAddVerifierThunks( - IN PVOID ThunkBuffer, - IN ULONG ThunkBufferSize); - -#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ - -#if (NTDDI_VERSION >= NTDDI_WS03) -NTKERNELAPI -NTSTATUS -NTAPI -MmCreateMirror(VOID); -#endif - - -#if (NTDDI_VERSION >= NTDDI_VISTA) -NTSTATUS -NTAPI -MmRotatePhysicalView( - IN PVOID VirtualAddress, - IN OUT PSIZE_T NumberOfBytes, - IN PMDLX NewMdl OPTIONAL, - IN MM_ROTATE_DIRECTION Direction, - IN PMM_ROTATE_COPY_CALLBACK_FUNCTION CopyFunction, - IN PVOID Context OPTIONAL); - -#endif - -/****************************************************************************** - * Process Manager Functions * - ******************************************************************************/ +/* NtXxx Functions */ NTSYSCALLAPI NTSTATUS @@ -4633,15 +2605,35 @@ NtQueryInformationProcess( IN ULONG ProcessInformationLength, OUT PULONG ReturnLength OPTIONAL); -#if (NTDDI_VERSION >= NTDDI_WIN2K) +/** Process manager types **/ +typedef VOID +(NTAPI *PCREATE_PROCESS_NOTIFY_ROUTINE)( + IN HANDLE ParentId, + IN HANDLE ProcessId, + IN BOOLEAN Create); + +typedef VOID +(NTAPI *PCREATE_THREAD_NOTIFY_ROUTINE)( + IN HANDLE ProcessId, + IN HANDLE ThreadId, + IN BOOLEAN Create); + +typedef VOID +(NTAPI *PLOAD_IMAGE_NOTIFY_ROUTINE)( + IN PUNICODE_STRING FullImageName, + IN HANDLE ProcessId, + IN PIMAGE_INFO ImageInfo); + +/** Process manager routines **/ + +#if (NTDDI_VERSION >= NTDDI_WIN2K) NTKERNELAPI NTSTATUS NTAPI -PsSetCreateProcessNotifyRoutine( - IN PCREATE_PROCESS_NOTIFY_ROUTINE NotifyRoutine, - IN BOOLEAN Remove); +PsSetLoadImageNotifyRoutine( + IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine); NTKERNELAPI NTSTATUS @@ -4652,18 +2644,21 @@ PsSetCreateThreadNotifyRoutine( NTKERNELAPI NTSTATUS NTAPI -PsSetLoadImageNotifyRoutine( - IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine); +PsSetCreateProcessNotifyRoutine( + IN PCREATE_PROCESS_NOTIFY_ROUTINE NotifyRoutine, + IN BOOLEAN Remove); NTKERNELAPI HANDLE NTAPI -PsGetCurrentProcessId(VOID); +PsGetCurrentProcessId( + VOID); NTKERNELAPI HANDLE NTAPI -PsGetCurrentThreadId(VOID); +PsGetCurrentThreadId( + VOID); NTKERNELAPI BOOLEAN @@ -4684,12 +2679,6 @@ NTAPI PsGetProcessId( IN PEPROCESS Process); -NTKERNELAPI -HANDLE -NTAPI -PsGetThreadId( - IN PETHREAD Thread); - NTKERNELAPI NTSTATUS NTAPI @@ -4702,187 +2691,102 @@ NTAPI PsRemoveLoadImageNotifyRoutine( IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine); -NTKERNELAPI -LONGLONG -NTAPI -PsGetProcessCreateTimeQuadPart( - IN PEPROCESS Process); - #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ -#if (NTDDI_VERSION >= NTDDI_WS03) -NTKERNELAPI -HANDLE -NTAPI -PsGetThreadProcessId( - IN PETHREAD Thread); -#endif /* (NTDDI_VERSION >= NTDDI_WS03) */ +extern NTKERNELAPI PEPROCESS PsInitialSystemProcess; -#if (NTDDI_VERSION >= NTDDI_VISTA) +/* RTL Types */ -NTKERNELAPI -BOOLEAN -NTAPI -PsSetCurrentThreadPrefetching( - IN BOOLEAN Prefetching); +typedef struct _RTL_SPLAY_LINKS { + struct _RTL_SPLAY_LINKS *Parent; + struct _RTL_SPLAY_LINKS *LeftChild; + struct _RTL_SPLAY_LINKS *RightChild; +} RTL_SPLAY_LINKS, *PRTL_SPLAY_LINKS; -NTKERNELAPI -BOOLEAN -NTAPI -PsIsCurrentThreadPrefetching(VOID); +/* RTL Functions */ -#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ +#if (defined(_M_AMD64) || defined(_M_IA64)) && !defined(_REALLY_GET_CALLERS_CALLER_) -#if (NTDDI_VERSION >= NTDDI_VISTASP1) -NTKERNELAPI -NTSTATUS -NTAPI -PsSetCreateProcessNotifyRoutineEx( - IN PCREATE_PROCESS_NOTIFY_ROUTINE_EX NotifyRoutine, - IN BOOLEAN Remove); -#endif /* (NTDDI_VERSION >= NTDDI_VISTASP1) */ -/****************************************************************************** - * Runtime Library Functions * - ******************************************************************************/ +#define RtlGetCallersAddress(CallersAddress, CallersCaller) \ + *CallersAddress = (PVOID)_ReturnAddress(); \ + *CallersCaller = NULL; +#else #if (NTDDI_VERSION >= NTDDI_WIN2K) - - - -#ifndef RTL_USE_AVL_TABLES - NTSYSAPI VOID NTAPI -RtlInitializeGenericTable( - OUT PRTL_GENERIC_TABLE Table, - IN PRTL_GENERIC_COMPARE_ROUTINE CompareRoutine, - IN PRTL_GENERIC_ALLOCATE_ROUTINE AllocateRoutine, - IN PRTL_GENERIC_FREE_ROUTINE FreeRoutine, - IN PVOID TableContext OPTIONAL); +RtlGetCallersAddress( + OUT PVOID *CallersAddress, + OUT PVOID *CallersCaller); +#endif +#endif + +#if !defined(MIDL_PASS) + +FORCEINLINE +LUID +NTAPI_INLINE +RtlConvertLongToLuid( + IN LONG Val) +{ + LUID Luid; + LARGE_INTEGER Temp; + + Temp.QuadPart = Val; + Luid.LowPart = Temp.u.LowPart; + Luid.HighPart = Temp.u.HighPart; + return Luid; +} + +FORCEINLINE +LUID +NTAPI_INLINE +RtlConvertUlongToLuid( + IN ULONG Val) +{ + LUID Luid; + + Luid.LowPart = Val; + Luid.HighPart = 0; + return Luid; +} + +#endif + +#if defined(_AMD64_) || defined(_IA64_) +//DECLSPEC_DEPRECATED_DDK_WINXP +__inline +LARGE_INTEGER +NTAPI_INLINE +RtlLargeIntegerDivide( + IN LARGE_INTEGER Dividend, + IN LARGE_INTEGER Divisor, + OUT PLARGE_INTEGER Remainder OPTIONAL) +{ + LARGE_INTEGER ret; + ret.QuadPart = Dividend.QuadPart / Divisor.QuadPart; + if (Remainder) + Remainder->QuadPart = Dividend.QuadPart % Divisor.QuadPart; + return ret; +} + +#else + +#if (NTDDI_VERSION >= NTDDI_WIN2K) NTSYSAPI -PVOID +LARGE_INTEGER NTAPI -RtlInsertElementGenericTable( - IN PRTL_GENERIC_TABLE Table, - IN PVOID Buffer, - IN CLONG BufferSize, - OUT PBOOLEAN NewElement OPTIONAL); +RtlLargeIntegerDivide( + IN LARGE_INTEGER Dividend, + IN LARGE_INTEGER Divisor, + OUT PLARGE_INTEGER Remainder OPTIONAL); +#endif -NTSYSAPI -PVOID -NTAPI -RtlInsertElementGenericTableFull( - IN PRTL_GENERIC_TABLE Table, - IN PVOID Buffer, - IN CLONG BufferSize, - OUT PBOOLEAN NewElement OPTIONAL, - IN PVOID NodeOrParent, - IN TABLE_SEARCH_RESULT SearchResult); +#endif /* defined(_AMD64_) || defined(_IA64_) */ -NTSYSAPI -BOOLEAN -NTAPI -RtlDeleteElementGenericTable( - IN PRTL_GENERIC_TABLE Table, - IN PVOID Buffer); - -NTSYSAPI -PVOID -NTAPI -RtlLookupElementGenericTable( - IN PRTL_GENERIC_TABLE Table, - IN PVOID Buffer); - -NTSYSAPI -PVOID -NTAPI -RtlLookupElementGenericTableFull( - IN PRTL_GENERIC_TABLE Table, - IN PVOID Buffer, - OUT PVOID *NodeOrParent, - OUT TABLE_SEARCH_RESULT *SearchResult); - -NTSYSAPI -PVOID -NTAPI -RtlEnumerateGenericTable( - IN PRTL_GENERIC_TABLE Table, - IN BOOLEAN Restart); - -NTSYSAPI -PVOID -NTAPI -RtlEnumerateGenericTableWithoutSplaying( - IN PRTL_GENERIC_TABLE Table, - IN OUT PVOID *RestartKey); - -NTSYSAPI -PVOID -NTAPI -RtlGetElementGenericTable( - IN PRTL_GENERIC_TABLE Table, - IN ULONG I); - -NTSYSAPI -ULONG -NTAPI -RtlNumberGenericTableElements( - IN PRTL_GENERIC_TABLE Table); - -NTSYSAPI -BOOLEAN -NTAPI -RtlIsGenericTableEmpty( - IN PRTL_GENERIC_TABLE Table); - -#endif /* !RTL_USE_AVL_TABLES */ - -#define RTL_STACK_WALKING_MODE_FRAMES_TO_SKIP_SHIFT 8 - -NTSYSAPI -PRTL_SPLAY_LINKS -NTAPI -RtlSplay( - IN OUT PRTL_SPLAY_LINKS Links); - -NTSYSAPI -PRTL_SPLAY_LINKS -NTAPI -RtlDelete( - IN PRTL_SPLAY_LINKS Links); - -NTSYSAPI -VOID -NTAPI -RtlDeleteNoSplay( - IN PRTL_SPLAY_LINKS Links, - IN OUT PRTL_SPLAY_LINKS *Root); - -NTSYSAPI -PRTL_SPLAY_LINKS -NTAPI -RtlSubtreeSuccessor( - IN PRTL_SPLAY_LINKS Links); - -NTSYSAPI -PRTL_SPLAY_LINKS -NTAPI -RtlSubtreePredecessor( - IN PRTL_SPLAY_LINKS Links); - -NTSYSAPI -PRTL_SPLAY_LINKS -NTAPI -RtlRealSuccessor( - IN PRTL_SPLAY_LINKS Links); - -NTSYSAPI -PRTL_SPLAY_LINKS -NTAPI -RtlRealPredecessor( - IN PRTL_SPLAY_LINKS Links); +#if (NTDDI_VERSION >= NTDDI_WIN2K) NTSYSAPI BOOLEAN @@ -4941,7 +2845,7 @@ NTAPI RtlCompareString( IN const PSTRING String1, IN const PSTRING String2, - IN BOOLEAN CaseInSensitive); + BOOLEAN CaseInSensitive); NTSYSAPI VOID @@ -4980,513 +2884,9 @@ RtlWalkFrameChain( IN ULONG Count, IN ULONG Flags); - - #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ - -#if (NTDDI_VERSION >= NTDDI_WINXP) - - -NTSYSAPI -VOID -NTAPI -RtlInitializeGenericTableAvl( - OUT PRTL_AVL_TABLE Table, - IN PRTL_AVL_COMPARE_ROUTINE CompareRoutine, - IN PRTL_AVL_ALLOCATE_ROUTINE AllocateRoutine, - IN PRTL_AVL_FREE_ROUTINE FreeRoutine, - IN PVOID TableContext OPTIONAL); - -NTSYSAPI -PVOID -NTAPI -RtlInsertElementGenericTableAvl( - IN PRTL_AVL_TABLE Table, - IN PVOID Buffer, - IN CLONG BufferSize, - OUT PBOOLEAN NewElement OPTIONAL); - -NTSYSAPI -PVOID -NTAPI -RtlInsertElementGenericTableFullAvl( - IN PRTL_AVL_TABLE Table, - IN PVOID Buffer, - IN CLONG BufferSize, - OUT PBOOLEAN NewElement OPTIONAL, - IN PVOID NodeOrParent, - IN TABLE_SEARCH_RESULT SearchResult); - -NTSYSAPI -BOOLEAN -NTAPI -RtlDeleteElementGenericTableAvl( - IN PRTL_AVL_TABLE Table, - IN PVOID Buffer); - -NTSYSAPI -PVOID -NTAPI -RtlLookupElementGenericTableAvl( - IN PRTL_AVL_TABLE Table, - IN PVOID Buffer); - -NTSYSAPI -PVOID -NTAPI -RtlLookupElementGenericTableFullAvl( - IN PRTL_AVL_TABLE Table, - IN PVOID Buffer, - OUT PVOID *NodeOrParent, - OUT TABLE_SEARCH_RESULT *SearchResult); - -NTSYSAPI -PVOID -NTAPI -RtlEnumerateGenericTableAvl( - IN PRTL_AVL_TABLE Table, - IN BOOLEAN Restart); - -NTSYSAPI -PVOID -NTAPI -RtlEnumerateGenericTableWithoutSplayingAvl( - IN PRTL_AVL_TABLE Table, - IN OUT PVOID *RestartKey); - -NTSYSAPI -PVOID -NTAPI -RtlLookupFirstMatchingElementGenericTableAvl( - IN PRTL_AVL_TABLE Table, - IN PVOID Buffer, - OUT PVOID *RestartKey); - -NTSYSAPI -PVOID -NTAPI -RtlEnumerateGenericTableLikeADirectory( - IN PRTL_AVL_TABLE Table, - IN PRTL_AVL_MATCH_FUNCTION MatchFunction OPTIONAL, - IN PVOID MatchData OPTIONAL, - IN ULONG NextFlag, - IN OUT PVOID *RestartKey, - IN OUT PULONG DeleteCount, - IN PVOID Buffer); - -NTSYSAPI -PVOID -NTAPI -RtlGetElementGenericTableAvl( - IN PRTL_AVL_TABLE Table, - IN ULONG I); - -NTSYSAPI -ULONG -NTAPI -RtlNumberGenericTableElementsAvl( - IN PRTL_AVL_TABLE Table); - -NTSYSAPI -BOOLEAN -NTAPI -RtlIsGenericTableEmptyAvl( - IN PRTL_AVL_TABLE Table); - - - -#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ - -#if (NTDDI_VERSION >= NTDDI_VISTA) - - -NTSYSAPI -VOID -NTAPI -RtlRunOnceInitialize( - OUT PRTL_RUN_ONCE RunOnce); - -NTSYSAPI -NTSTATUS -NTAPI -RtlRunOnceExecuteOnce( - IN OUT PRTL_RUN_ONCE RunOnce, - IN PRTL_RUN_ONCE_INIT_FN InitFn, - IN OUT PVOID Parameter OPTIONAL, - OUT PVOID *Context OPTIONAL); - -NTSYSAPI -NTSTATUS -NTAPI -RtlRunOnceBeginInitialize( - IN OUT PRTL_RUN_ONCE RunOnce, - IN ULONG Flags, - OUT PVOID *Context OPTIONAL); - -NTSYSAPI -NTSTATUS -NTAPI -RtlRunOnceComplete( - IN OUT PRTL_RUN_ONCE RunOnce, - IN ULONG Flags, - IN PVOID Context OPTIONAL); - -NTSYSAPI -BOOLEAN -NTAPI -RtlGetProductInfo( - IN ULONG OSMajorVersion, - IN ULONG OSMinorVersion, - IN ULONG SpMajorVersion, - IN ULONG SpMinorVersion, - OUT PULONG ReturnedProductType); - - - -#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ - -#if (NTDDI_VERSION >= NTDDI_WIN7) - - -NTSYSAPI -BOOLEAN -NTAPI -RtlCreateHashTable( - IN OUT PRTL_DYNAMIC_HASH_TABLE *HashTable OPTIONAL, - IN ULONG Shift, - IN ULONG Flags); - -NTSYSAPI -VOID -NTAPI -RtlDeleteHashTable( - IN PRTL_DYNAMIC_HASH_TABLE HashTable); - -NTSYSAPI -BOOLEAN -NTAPI -RtlInsertEntryHashTable( - IN PRTL_DYNAMIC_HASH_TABLE HashTable, - IN PRTL_DYNAMIC_HASH_TABLE_ENTRY Entry, - IN ULONG_PTR Signature, - IN OUT PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context OPTIONAL); - -NTSYSAPI -BOOLEAN -NTAPI -RtlRemoveEntryHashTable( - IN PRTL_DYNAMIC_HASH_TABLE HashTable, - IN PRTL_DYNAMIC_HASH_TABLE_ENTRY Entry, - IN OUT PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context OPTIONAL); - -NTSYSAPI -PRTL_DYNAMIC_HASH_TABLE_ENTRY -NTAPI -RtlLookupEntryHashTable( - IN PRTL_DYNAMIC_HASH_TABLE HashTable, - IN ULONG_PTR Signature, - OUT PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context OPTIONAL); - -NTSYSAPI -PRTL_DYNAMIC_HASH_TABLE_ENTRY -NTAPI -RtlGetNextEntryHashTable( - IN PRTL_DYNAMIC_HASH_TABLE HashTable, - IN PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context); - -NTSYSAPI -BOOLEAN -NTAPI -RtlInitEnumerationHashTable( - IN PRTL_DYNAMIC_HASH_TABLE HashTable, - OUT PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator); - -NTSYSAPI -PRTL_DYNAMIC_HASH_TABLE_ENTRY -NTAPI -RtlEnumerateEntryHashTable( - IN PRTL_DYNAMIC_HASH_TABLE HashTable, - IN OUT PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator); - -NTSYSAPI -VOID -NTAPI -RtlEndEnumerationHashTable( - IN PRTL_DYNAMIC_HASH_TABLE HashTable, - IN OUT PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator); - -NTSYSAPI -BOOLEAN -NTAPI -RtlInitWeakEnumerationHashTable( - IN PRTL_DYNAMIC_HASH_TABLE HashTable, - OUT PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator); - -NTSYSAPI -PRTL_DYNAMIC_HASH_TABLE_ENTRY -NTAPI -RtlWeaklyEnumerateEntryHashTable( - IN PRTL_DYNAMIC_HASH_TABLE HashTable, - IN OUT PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator); - -NTSYSAPI -VOID -NTAPI -RtlEndWeakEnumerationHashTable( - IN PRTL_DYNAMIC_HASH_TABLE HashTable, - IN OUT PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator); - -NTSYSAPI -BOOLEAN -NTAPI -RtlExpandHashTable( - IN PRTL_DYNAMIC_HASH_TABLE HashTable); - -NTSYSAPI -BOOLEAN -NTAPI -RtlContractHashTable( - IN PRTL_DYNAMIC_HASH_TABLE HashTable); - - - -#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ - - -#if defined(_AMD64_) || defined(_IA64_) - - - -//DECLSPEC_DEPRECATED_DDK_WINXP -FORCEINLINE -LARGE_INTEGER -NTAPI_INLINE -RtlLargeIntegerDivide( - IN LARGE_INTEGER Dividend, - IN LARGE_INTEGER Divisor, - OUT PLARGE_INTEGER Remainder OPTIONAL) -{ - LARGE_INTEGER ret; - ret.QuadPart = Dividend.QuadPart / Divisor.QuadPart; - if (Remainder) - Remainder->QuadPart = Dividend.QuadPart % Divisor.QuadPart; - return ret; -} - -#else - -#if (NTDDI_VERSION >= NTDDI_WIN2K) -NTSYSAPI -LARGE_INTEGER -NTAPI -RtlLargeIntegerDivide( - IN LARGE_INTEGER Dividend, - IN LARGE_INTEGER Divisor, - OUT PLARGE_INTEGER Remainder OPTIONAL); -#endif - - -#endif /* defined(_AMD64_) || defined(_IA64_) */ - - - -#ifdef RTL_USE_AVL_TABLES - -#define RtlInitializeGenericTable RtlInitializeGenericTableAvl -#define RtlInsertElementGenericTable RtlInsertElementGenericTableAvl -#define RtlInsertElementGenericTableFull RtlInsertElementGenericTableFullAvl -#define RtlDeleteElementGenericTable RtlDeleteElementGenericTableAvl -#define RtlLookupElementGenericTable RtlLookupElementGenericTableAvl -#define RtlLookupElementGenericTableFull RtlLookupElementGenericTableFullAvl -#define RtlEnumerateGenericTable RtlEnumerateGenericTableAvl -#define RtlEnumerateGenericTableWithoutSplaying RtlEnumerateGenericTableWithoutSplayingAvl -#define RtlGetElementGenericTable RtlGetElementGenericTableAvl -#define RtlNumberGenericTableElements RtlNumberGenericTableElementsAvl -#define RtlIsGenericTableEmpty RtlIsGenericTableEmptyAvl - -#endif /* RTL_USE_AVL_TABLES */ - -#define RtlInitializeSplayLinks(Links) { \ - PRTL_SPLAY_LINKS _SplayLinks; \ - _SplayLinks = (PRTL_SPLAY_LINKS)(Links); \ - _SplayLinks->Parent = _SplayLinks; \ - _SplayLinks->LeftChild = NULL; \ - _SplayLinks->RightChild = NULL; \ -} - -#define RtlIsLeftChild(Links) \ - (RtlLeftChild(RtlParent(Links)) == (PRTL_SPLAY_LINKS)(Links)) - -#define RtlIsRightChild(Links) \ - (RtlRightChild(RtlParent(Links)) == (PRTL_SPLAY_LINKS)(Links)) - -#define RtlRightChild(Links) \ - ((PRTL_SPLAY_LINKS)(Links))->RightChild - -#define RtlIsRoot(Links) \ - (RtlParent(Links) == (PRTL_SPLAY_LINKS)(Links)) - -#define RtlLeftChild(Links) \ - ((PRTL_SPLAY_LINKS)(Links))->LeftChild - -#define RtlParent(Links) \ - ((PRTL_SPLAY_LINKS)(Links))->Parent - -#define RtlInsertAsLeftChild(ParentLinks,ChildLinks) \ - { \ - PRTL_SPLAY_LINKS _SplayParent; \ - PRTL_SPLAY_LINKS _SplayChild; \ - _SplayParent = (PRTL_SPLAY_LINKS)(ParentLinks); \ - _SplayChild = (PRTL_SPLAY_LINKS)(ChildLinks); \ - _SplayParent->LeftChild = _SplayChild; \ - _SplayChild->Parent = _SplayParent; \ - } - -#define RtlInsertAsRightChild(ParentLinks,ChildLinks) \ - { \ - PRTL_SPLAY_LINKS _SplayParent; \ - PRTL_SPLAY_LINKS _SplayChild; \ - _SplayParent = (PRTL_SPLAY_LINKS)(ParentLinks); \ - _SplayChild = (PRTL_SPLAY_LINKS)(ChildLinks); \ - _SplayParent->RightChild = _SplayChild; \ - _SplayChild->Parent = _SplayParent; \ - } - -#if !defined(MIDL_PASS) - -FORCEINLINE -LUID -NTAPI_INLINE -RtlConvertLongToLuid( - IN LONG Val) -{ - LUID Luid; - LARGE_INTEGER Temp; - - Temp.QuadPart = Val; - Luid.LowPart = Temp.u.LowPart; - Luid.HighPart = Temp.u.HighPart; - return Luid; -} - -FORCEINLINE -LUID -NTAPI_INLINE -RtlConvertUlongToLuid( - IN ULONG Val) -{ - LUID Luid; - - Luid.LowPart = Val; - Luid.HighPart = 0; - return Luid; -} - -#endif /* !defined(MIDL_PASS) */ - -#if (defined(_M_AMD64) || defined(_M_IA64)) && !defined(_REALLY_GET_CALLERS_CALLER_) -#define RtlGetCallersAddress(CallersAddress, CallersCaller) \ - *CallersAddress = (PVOID)_ReturnAddress(); \ - *CallersCaller = NULL; -#else -#if (NTDDI_VERSION >= NTDDI_WIN2K) -NTSYSAPI -VOID -NTAPI -RtlGetCallersAddress( - OUT PVOID *CallersAddress, - OUT PVOID *CallersCaller); -#endif -#endif - -#if !defined(MIDL_PASS) && !defined(SORTPP_PASS) - -#if (NTDDI_VERSION >= NTDDI_WIN7) - -FORCEINLINE -VOID -NTAPI -RtlInitHashTableContext( - IN OUT PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context) -{ - Context->ChainHead = NULL; - Context->PrevLinkage = NULL; -} - -FORCEINLINE -VOID -NTAPI -RtlInitHashTableContextFromEnumerator( - IN OUT PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context, - IN PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator) -{ - Context->ChainHead = Enumerator->ChainHead; - Context->PrevLinkage = Enumerator->HashEntry.Linkage.Blink; -} - -FORCEINLINE -VOID -NTAPI -RtlReleaseHashTableContext( - IN OUT PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context) -{ - UNREFERENCED_PARAMETER(Context); - return; -} - -FORCEINLINE -ULONG -NTAPI -RtlTotalBucketsHashTable( - IN PRTL_DYNAMIC_HASH_TABLE HashTable) -{ - return HashTable->TableSize; -} - -FORCEINLINE -ULONG -NTAPI -RtlNonEmptyBucketsHashTable( - IN PRTL_DYNAMIC_HASH_TABLE HashTable) -{ - return HashTable->NonEmptyBuckets; -} - -FORCEINLINE -ULONG -NTAPI -RtlEmptyBucketsHashTable( - IN PRTL_DYNAMIC_HASH_TABLE HashTable) -{ - return HashTable->TableSize - HashTable->NonEmptyBuckets; -} - -FORCEINLINE -ULONG -NTAPI -RtlTotalEntriesHashTable( - IN PRTL_DYNAMIC_HASH_TABLE HashTable) -{ - return HashTable->NumEntries; -} - -FORCEINLINE -ULONG -NTAPI -RtlActiveEnumeratorsHashTable( - IN PRTL_DYNAMIC_HASH_TABLE HashTable) -{ - return HashTable->NumEnumerators; -} - -#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ - -#endif /* !defined(MIDL_PASS) && !defined(SORTPP_PASS) */ - -/****************************************************************************** - * Security Manager Functions * - ******************************************************************************/ +/* Security reference monitor routines */ #if (NTDDI_VERSION >= NTDDI_WIN2K) NTKERNELAPI @@ -5495,42 +2895,12 @@ NTAPI SeSinglePrivilegeCheck( IN LUID PrivilegeValue, IN KPROCESSOR_MODE PreviousMode); +#endif - -#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ - -/****************************************************************************** - * ZwXxx Functions * - ******************************************************************************/ - - - -NTSYSAPI -NTSTATUS -NTAPI -ZwAllocateLocallyUniqueId( - OUT PLUID Luid); - -NTSYSAPI -NTSTATUS -NTAPI -ZwTerminateProcess( - IN HANDLE ProcessHandle OPTIONAL, - IN NTSTATUS ExitStatus); - -NTSYSAPI -NTSTATUS -NTAPI -ZwOpenProcess( - OUT PHANDLE ProcessHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes, - IN PCLIENT_ID ClientId OPTIONAL); - +/* ZwXxx Functions */ #if (NTDDI_VERSION >= NTDDI_WIN2K) - NTSTATUS NTAPI ZwCancelTimer( @@ -5572,190 +2942,12 @@ ZwSetTimer( IN LONG Period OPTIONAL, OUT PBOOLEAN PreviousState OPTIONAL); -NTSYSAPI -NTSTATUS -NTAPI -ZwDisplayString( - IN PUNICODE_STRING String); - -NTSYSAPI -NTSTATUS -NTAPI -ZwPowerInformation( - IN POWER_INFORMATION_LEVEL PowerInformationLevel, - IN PVOID InputBuffer OPTIONAL, - IN ULONG InputBufferLength, - OUT PVOID OutputBuffer OPTIONAL, - IN ULONG OutputBufferLength); - -NTSYSAPI -NTSTATUS -NTAPI -ZwQueryVolumeInformationFile( - IN HANDLE FileHandle, - OUT PIO_STATUS_BLOCK IoStatusBlock, - OUT PVOID FsInformation, - IN ULONG Length, - IN FS_INFORMATION_CLASS FsInformationClass); - -NTSYSAPI -NTSTATUS -NTAPI -ZwDeviceIoControlFile( - IN HANDLE FileHandle, - IN HANDLE Event OPTIONAL, - IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, - IN PVOID ApcContext OPTIONAL, - OUT PIO_STATUS_BLOCK IoStatusBlock, - IN ULONG IoControlCode, - IN PVOID InputBuffer OPTIONAL, - IN ULONG InputBufferLength, - OUT PVOID OutputBuffer OPTIONAL, - IN ULONG OutputBufferLength); - - - -#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ - - -#if (NTDDI_VERSION >= NTDDI_WIN7) - -NTSTATUS -NTAPI -ZwSetTimerEx( - IN HANDLE TimerHandle, - IN TIMER_SET_INFORMATION_CLASS TimerSetInformationClass, - IN OUT PVOID TimerSetInformation, - IN ULONG TimerSetInformationLength); - - -#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ - - - -/* UNSORTED */ - -#define VER_SET_CONDITION(ConditionMask, TypeBitMask, ComparisonType) \ - ((ConditionMask) = VerSetConditionMask((ConditionMask), \ - (TypeBitMask), (ComparisonType))) - -#if (NTDDI_VERSION >= NTDDI_WIN2K) -NTSYSAPI -ULONGLONG -NTAPI -VerSetConditionMask( - IN ULONGLONG ConditionMask, - IN ULONG TypeMask, - IN UCHAR Condition); #endif -typedef struct _KERNEL_USER_TIMES { - LARGE_INTEGER CreateTime; - LARGE_INTEGER ExitTime; - LARGE_INTEGER KernelTime; - LARGE_INTEGER UserTime; -} KERNEL_USER_TIMES, *PKERNEL_USER_TIMES; - -/* NtXxx Functions */ - -typedef enum _SYSTEM_FIRMWARE_TABLE_ACTION { - SystemFirmwareTable_Enumerate, - SystemFirmwareTable_Get -} SYSTEM_FIRMWARE_TABLE_ACTION; - -typedef struct _SYSTEM_FIRMWARE_TABLE_INFORMATION { - ULONG ProviderSignature; - SYSTEM_FIRMWARE_TABLE_ACTION Action; - ULONG TableID; - ULONG TableBufferLength; - UCHAR TableBuffer[ANYSIZE_ARRAY]; -} SYSTEM_FIRMWARE_TABLE_INFORMATION, *PSYSTEM_FIRMWARE_TABLE_INFORMATION; - -typedef NTSTATUS -(__cdecl *PFNFTH)( - IN OUT PSYSTEM_FIRMWARE_TABLE_INFORMATION SystemFirmwareTableInfo); - -typedef struct _SYSTEM_FIRMWARE_TABLE_HANDLER { - ULONG ProviderSignature; - BOOLEAN Register; - PFNFTH FirmwareTableHandler; - PVOID DriverObject; -} SYSTEM_FIRMWARE_TABLE_HANDLER, *PSYSTEM_FIRMWARE_TABLE_HANDLER; - -typedef ULONG_PTR -(NTAPI *PDRIVER_VERIFIER_THUNK_ROUTINE)( - IN PVOID Context); - -typedef struct _DRIVER_VERIFIER_THUNK_PAIRS { - PDRIVER_VERIFIER_THUNK_ROUTINE PristineRoutine; - PDRIVER_VERIFIER_THUNK_ROUTINE NewRoutine; -} DRIVER_VERIFIER_THUNK_PAIRS, *PDRIVER_VERIFIER_THUNK_PAIRS; - -#define DRIVER_VERIFIER_SPECIAL_POOLING 0x0001 -#define DRIVER_VERIFIER_FORCE_IRQL_CHECKING 0x0002 -#define DRIVER_VERIFIER_INJECT_ALLOCATION_FAILURES 0x0004 -#define DRIVER_VERIFIER_TRACK_POOL_ALLOCATIONS 0x0008 -#define DRIVER_VERIFIER_IO_CHECKING 0x0010 - -#define SHARED_GLOBAL_FLAGS_ERROR_PORT_V 0x0 -#define SHARED_GLOBAL_FLAGS_ERROR_PORT (1UL << SHARED_GLOBAL_FLAGS_ERROR_PORT_V) - -#define SHARED_GLOBAL_FLAGS_ELEVATION_ENABLED_V 0x1 -#define SHARED_GLOBAL_FLAGS_ELEVATION_ENABLED (1UL << SHARED_GLOBAL_FLAGS_ELEVATION_ENABLED_V) - -#define SHARED_GLOBAL_FLAGS_VIRT_ENABLED_V 0x2 -#define SHARED_GLOBAL_FLAGS_VIRT_ENABLED (1UL << SHARED_GLOBAL_FLAGS_VIRT_ENABLED_V) - -#define SHARED_GLOBAL_FLAGS_INSTALLER_DETECT_ENABLED_V 0x3 -#define SHARED_GLOBAL_FLAGS_INSTALLER_DETECT_ENABLED \ - (1UL << SHARED_GLOBAL_FLAGS_INSTALLER_DETECT_ENABLED_V) - -#define SHARED_GLOBAL_FLAGS_SPARE_V 0x4 -#define SHARED_GLOBAL_FLAGS_SPARE \ - (1UL << SHARED_GLOBAL_FLAGS_SPARE_V) - -#define SHARED_GLOBAL_FLAGS_DYNAMIC_PROC_ENABLED_V 0x5 -#define SHARED_GLOBAL_FLAGS_DYNAMIC_PROC_ENABLED \ - (1UL << SHARED_GLOBAL_FLAGS_DYNAMIC_PROC_ENABLED_V) - -#define SHARED_GLOBAL_FLAGS_SEH_VALIDATION_ENABLED_V 0x6 -#define SHARED_GLOBAL_FLAGS_SEH_VALIDATION_ENABLED \ - (1UL << SHARED_GLOBAL_FLAGS_SEH_VALIDATION_ENABLED_V) - -#define EX_INIT_BITS(Flags, Bit) \ - *((Flags)) |= (Bit) // Safe to use before concurrently accessible - -#define EX_TEST_SET_BIT(Flags, Bit) \ - InterlockedBitTestAndSet ((PLONG)(Flags), (Bit)) - -#define EX_TEST_CLEAR_BIT(Flags, Bit) \ - InterlockedBitTestAndReset ((PLONG)(Flags), (Bit)) - -#define PCCARD_MAP_ERROR 0x01 -#define PCCARD_DEVICE_PCI 0x10 - -#define PCCARD_SCAN_DISABLED 0x01 -#define PCCARD_MAP_ZERO 0x02 -#define PCCARD_NO_TIMER 0x03 -#define PCCARD_NO_PIC 0x04 -#define PCCARD_NO_LEGACY_BASE 0x05 -#define PCCARD_DUP_LEGACY_BASE 0x06 -#define PCCARD_NO_CONTROLLERS 0x07 - -#define MAXIMUM_EXPANSION_SIZE (KERNEL_LARGE_STACK_SIZE - (PAGE_SIZE / 2)) - -/* Filesystem runtime library routines */ - -#if (NTDDI_VERSION >= NTDDI_WIN2K) -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlIsTotalDeviceFailure( - IN NTSTATUS Status); -#endif - -/* FIXME : These definitions below doesn't belong to NTDDK */ #ifdef __cplusplus } #endif + + +#endif /* _NTDDK_ */ diff --git a/reactos/include/ddk/ntifs.h b/reactos/include/ddk/ntifs.h index 15bace86764..87d0470888c 100644 --- a/reactos/include/ddk/ntifs.h +++ b/reactos/include/ddk/ntifs.h @@ -25,10 +25,32 @@ #define _NTIFS_INCLUDED_ #define _GNU_NTIFS_ +/* Helper macro to enable gcc's extension. */ +#ifndef __GNU_EXTENSION +#ifdef __GNUC__ +#define __GNU_EXTENSION __extension__ +#else +#define __GNU_EXTENSION +#endif +#endif + #ifdef __cplusplus extern "C" { #endif +#if !defined(_NTHALDLL_) && !defined(_BLDR_) +#define NTHALAPI DECLSPEC_IMPORT +#else +#define NTHALAPI +#endif + +/* For ReactOS */ +#if !defined(_NTOSKRNL_) && !defined(_BLDR_) +#define NTKERNELAPI DECLSPEC_IMPORT +#else +#define NTKERNELAPI +#endif + /* Dependencies */ #include #include @@ -54,6 +76,16 @@ extern "C" { #define ClearFlag(_F,_SF) ((_F) &= ~(_SF)) #endif +#define PsGetCurrentProcess IoGetCurrentProcess + +#if (NTDDI_VERSION >= NTDDI_VISTA) +extern NTSYSAPI volatile CCHAR KeNumberProcessors; +#elif (NTDDI_VERSION >= NTDDI_WINXP) +extern NTSYSAPI CCHAR KeNumberProcessors; +#else +extern PCCHAR KeNumberProcessors; +#endif + typedef UNICODE_STRING LSA_UNICODE_STRING, *PLSA_UNICODE_STRING; typedef STRING LSA_STRING, *PLSA_STRING; typedef OBJECT_ATTRIBUTES LSA_OBJECT_ATTRIBUTES, *PLSA_OBJECT_ATTRIBUTES; @@ -719,6 +751,8 @@ typedef enum _OBJECT_INFORMATION_CLASS { MaxObjectInfoClass /* FIXME, not in WDK */ } OBJECT_INFORMATION_CLASS; +#if (NTDDI_VERSION >= NTDDI_NT4) + NTSYSCALLAPI NTSTATUS NTAPI @@ -729,6 +763,8 @@ NtQueryObject( IN ULONG ObjectInformationLength, OUT PULONG ReturnLength OPTIONAL); +#endif + #if (NTDDI_VERSION >= NTDDI_WIN2K) NTSYSCALLAPI @@ -2378,11 +2414,95 @@ extern const PRTL_REALLOCATE_STRING_ROUTINE RtlReallocateStringRoutine; #define RTL_SYSTEM_VOLUME_INFORMATION_FOLDER L"System Volume Information" +#define DEVICE_TYPE ULONG + +#define FILE_DEVICE_BEEP 0x00000001 +#define FILE_DEVICE_CD_ROM 0x00000002 +#define FILE_DEVICE_CD_ROM_FILE_SYSTEM 0x00000003 +#define FILE_DEVICE_CONTROLLER 0x00000004 +#define FILE_DEVICE_DATALINK 0x00000005 +#define FILE_DEVICE_DFS 0x00000006 +#define FILE_DEVICE_DISK 0x00000007 +#define FILE_DEVICE_DISK_FILE_SYSTEM 0x00000008 +#define FILE_DEVICE_FILE_SYSTEM 0x00000009 +#define FILE_DEVICE_INPORT_PORT 0x0000000a +#define FILE_DEVICE_KEYBOARD 0x0000000b +#define FILE_DEVICE_MAILSLOT 0x0000000c +#define FILE_DEVICE_MIDI_IN 0x0000000d +#define FILE_DEVICE_MIDI_OUT 0x0000000e +#define FILE_DEVICE_MOUSE 0x0000000f +#define FILE_DEVICE_MULTI_UNC_PROVIDER 0x00000010 +#define FILE_DEVICE_NAMED_PIPE 0x00000011 +#define FILE_DEVICE_NETWORK 0x00000012 +#define FILE_DEVICE_NETWORK_BROWSER 0x00000013 +#define FILE_DEVICE_NETWORK_FILE_SYSTEM 0x00000014 +#define FILE_DEVICE_NULL 0x00000015 +#define FILE_DEVICE_PARALLEL_PORT 0x00000016 +#define FILE_DEVICE_PHYSICAL_NETCARD 0x00000017 +#define FILE_DEVICE_PRINTER 0x00000018 +#define FILE_DEVICE_SCANNER 0x00000019 +#define FILE_DEVICE_SERIAL_MOUSE_PORT 0x0000001a +#define FILE_DEVICE_SERIAL_PORT 0x0000001b +#define FILE_DEVICE_SCREEN 0x0000001c +#define FILE_DEVICE_SOUND 0x0000001d +#define FILE_DEVICE_STREAMS 0x0000001e +#define FILE_DEVICE_TAPE 0x0000001f +#define FILE_DEVICE_TAPE_FILE_SYSTEM 0x00000020 +#define FILE_DEVICE_TRANSPORT 0x00000021 +#define FILE_DEVICE_UNKNOWN 0x00000022 +#define FILE_DEVICE_VIDEO 0x00000023 +#define FILE_DEVICE_VIRTUAL_DISK 0x00000024 +#define FILE_DEVICE_WAVE_IN 0x00000025 +#define FILE_DEVICE_WAVE_OUT 0x00000026 +#define FILE_DEVICE_8042_PORT 0x00000027 +#define FILE_DEVICE_NETWORK_REDIRECTOR 0x00000028 +#define FILE_DEVICE_BATTERY 0x00000029 +#define FILE_DEVICE_BUS_EXTENDER 0x0000002a +#define FILE_DEVICE_MODEM 0x0000002b +#define FILE_DEVICE_VDM 0x0000002c +#define FILE_DEVICE_MASS_STORAGE 0x0000002d +#define FILE_DEVICE_SMB 0x0000002e +#define FILE_DEVICE_KS 0x0000002f +#define FILE_DEVICE_CHANGER 0x00000030 +#define FILE_DEVICE_SMARTCARD 0x00000031 +#define FILE_DEVICE_ACPI 0x00000032 +#define FILE_DEVICE_DVD 0x00000033 +#define FILE_DEVICE_FULLSCREEN_VIDEO 0x00000034 +#define FILE_DEVICE_DFS_FILE_SYSTEM 0x00000035 +#define FILE_DEVICE_DFS_VOLUME 0x00000036 +#define FILE_DEVICE_SERENUM 0x00000037 +#define FILE_DEVICE_TERMSRV 0x00000038 +#define FILE_DEVICE_KSEC 0x00000039 +#define FILE_DEVICE_FIPS 0x0000003A +#define FILE_DEVICE_INFINIBAND 0x0000003B +#define FILE_DEVICE_VMBUS 0x0000003E +#define FILE_DEVICE_CRYPT_PROVIDER 0x0000003F +#define FILE_DEVICE_WPD 0x00000040 +#define FILE_DEVICE_BLUETOOTH 0x00000041 +#define FILE_DEVICE_MT_COMPOSITE 0x00000042 +#define FILE_DEVICE_MT_TRANSPORT 0x00000043 +#define FILE_DEVICE_BIOMETRIC 0x00000044 +#define FILE_DEVICE_PMI 0x00000045 + +#define CTL_CODE(DeviceType, Function, Method, Access) \ + (((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method)) + +#define DEVICE_TYPE_FROM_CTL_CODE(ctl) (((ULONG) (ctl & 0xffff0000)) >> 16) + #define METHOD_FROM_CTL_CODE(ctrlCode) ((ULONG)(ctrlCode & 3)) +#define METHOD_BUFFERED 0 +#define METHOD_IN_DIRECT 1 +#define METHOD_OUT_DIRECT 2 +#define METHOD_NEITHER 3 #define METHOD_DIRECT_TO_HARDWARE METHOD_IN_DIRECT #define METHOD_DIRECT_FROM_HARDWARE METHOD_OUT_DIRECT +#define FILE_ANY_ACCESS 0x00000000 +#define FILE_SPECIAL_ACCESS FILE_ANY_ACCESS +#define FILE_READ_ACCESS 0x00000001 +#define FILE_WRITE_ACCESS 0x00000002 + typedef ULONG LSA_OPERATIONAL_MODE, *PLSA_OPERATIONAL_MODE; typedef enum _SECURITY_LOGON_TYPE { @@ -4553,8 +4673,6 @@ typedef struct _KAPC_STATE { #define KAPC_STATE_ACTUAL_LENGTH (FIELD_OFFSET(KAPC_STATE, UserApcPending) + sizeof(BOOLEAN)) -#define ASSERT_QUEUE(Q) ASSERT(((Q)->Header.Type & KOBJECT_TYPE_MASK) == QueueObject); - typedef struct _KQUEUE { DISPATCHER_HEADER Header; LIST_ENTRY EntryListHead; @@ -4689,7 +4807,7 @@ FASTCALL KeAcquireQueuedSpinLock( IN OUT KSPIN_LOCK_QUEUE_NUMBER Number); -_DECL_HAL_KE_IMPORT +NTHALAPI VOID FASTCALL KeReleaseQueuedSpinLock( @@ -4904,6 +5022,24 @@ typedef NTSTATUS #if (NTDDI_VERSION >= NTDDI_WIN2K) +NTKERNELAPI +VOID +NTAPI +SeCaptureSubjectContext( + OUT PSECURITY_SUBJECT_CONTEXT SubjectContext); + +NTKERNELAPI +VOID +NTAPI +SeLockSubjectContext( + IN PSECURITY_SUBJECT_CONTEXT SubjectContext); + +NTKERNELAPI +VOID +NTAPI +SeUnlockSubjectContext( + IN PSECURITY_SUBJECT_CONTEXT SubjectContext); + NTKERNELAPI VOID NTAPI @@ -5317,6 +5453,18 @@ SeLocateProcessImageName( extern NTKERNELAPI PSE_EXPORTS SeExports; +#if !defined(_PSGETCURRENTTHREAD_) +#define _PSGETCURRENTTHREAD_ + +FORCEINLINE +PETHREAD +PsGetCurrentThread( + VOID) +{ + return (PETHREAD)KeGetCurrentThread(); +} +#endif + #if (NTDDI_VERSION >= NTDDI_WIN2K) NTKERNELAPI @@ -5386,20 +5534,7 @@ PsReturnPoolQuota( IN POOL_TYPE PoolType, IN ULONG_PTR Amount); -NTKERNELAPI -NTSTATUS -NTAPI -PsAssignImpersonationToken( - IN PETHREAD Thread, - IN HANDLE Token OPTIONAL); - -NTKERNELAPI -HANDLE -NTAPI -PsReferencePrimaryToken( - IN OUT PEPROCESS Process); - -#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ +#endif #if (NTDDI_VERSION >= NTDDI_WINXP) @@ -5688,6 +5823,18 @@ IoPageRead( IN PKEVENT Event, OUT PIO_STATUS_BLOCK IoStatusBlock); +NTKERNELAPI +PDEVICE_OBJECT +NTAPI +IoGetAttachedDevice( + IN PDEVICE_OBJECT DeviceObject); + +NTKERNELAPI +PDEVICE_OBJECT +NTAPI +IoGetAttachedDeviceReference( + IN PDEVICE_OBJECT DeviceObject); + NTKERNELAPI PDEVICE_OBJECT NTAPI @@ -5804,6 +5951,42 @@ NTAPI IoSetTopLevelIrp( IN PIRP Irp OPTIONAL); +NTKERNELAPI +VOID +NTAPI +IoStartNextPacket( + IN PDEVICE_OBJECT DeviceObject, + IN BOOLEAN Cancelable); + +NTKERNELAPI +VOID +NTAPI +IoStartNextPacketByKey( + IN PDEVICE_OBJECT DeviceObject, + IN BOOLEAN Cancelable, + IN ULONG Key); + +NTKERNELAPI +VOID +NTAPI +IoStartPacket( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + IN PULONG Key OPTIONAL, + IN PDRIVER_CANCEL CancelFunction OPTIONAL); + +NTKERNELAPI +VOID +NTAPI +IoStartTimer( + IN PDEVICE_OBJECT DeviceObject); + +NTKERNELAPI +VOID +NTAPI +IoStopTimer( + IN PDEVICE_OBJECT DeviceObject); + NTKERNELAPI NTSTATUS NTAPI @@ -5840,6 +6023,12 @@ IoVerifyVolume( IN PDEVICE_OBJECT DeviceObject, IN BOOLEAN AllowRawMount); +NTKERNELAPI +VOID +NTAPI +IoWriteErrorLogEntry( + IN PVOID ElEntry); + NTKERNELAPI NTSTATUS NTAPI @@ -5866,6 +6055,13 @@ IoQueryFileDosDeviceName( IN PFILE_OBJECT FileObject, OUT POBJECT_NAME_INFORMATION *ObjectNameInformation); +VOID +NTAPI +IoSetStartIoAttributes( + IN PDEVICE_OBJECT DeviceObject, + IN BOOLEAN DeferredStartIo, + IN BOOLEAN NonCancelable); + NTKERNELAPI NTSTATUS NTAPI @@ -5964,6 +6160,53 @@ typedef struct _IO_PRIORITY_INFO { #define PO_CB_LID_SWITCH_STATE 4 #define PO_CB_PROCESSOR_POWER_POLICY 5 +#if (NTDDI_VERSION >= NTDDI_WIN2K) + +NTKERNELAPI +PVOID +NTAPI +PoRegisterSystemState( + IN OUT PVOID StateHandle OPTIONAL, + IN EXECUTION_STATE Flags); + +NTKERNELAPI +VOID +NTAPI +PoUnregisterSystemState( + IN OUT PVOID StateHandle); + +NTKERNELAPI +POWER_STATE +NTAPI +PoSetPowerState( + IN PDEVICE_OBJECT DeviceObject, + IN POWER_STATE_TYPE Type, + IN POWER_STATE State); + +NTKERNELAPI +NTSTATUS +NTAPI +PoCallDriver( + IN PDEVICE_OBJECT DeviceObject, + IN OUT PIRP Irp); + +NTKERNELAPI +VOID +NTAPI +PoStartNextPowerIrp( + IN OUT PIRP Irp); + +NTKERNELAPI +PULONG +NTAPI +PoRegisterDeviceForIdleDetection( + IN PDEVICE_OBJECT DeviceObject, + IN ULONG ConservationIdleTime, + IN ULONG PerformanceIdleTime, + IN DEVICE_POWER_STATE State); + +#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ + #if (NTDDI_VERSION >= NTDDI_WINXP) NTKERNELAPI NTSTATUS @@ -5972,6 +6215,84 @@ PoQueueShutdownWorkItem( IN OUT PWORK_QUEUE_ITEM WorkItem); #endif +#if (NTDDI_VERSION >= NTDDI_VISTA) + +NTKERNELAPI +NTSTATUS +NTAPI +PoRegisterPowerSettingCallback( + IN PDEVICE_OBJECT DeviceObject OPTIONAL, + IN LPCGUID SettingGuid, + IN PPOWER_SETTING_CALLBACK Callback, + IN PVOID Context OPTIONAL, + OUT PVOID *Handle); + +NTKERNELAPI +NTSTATUS +PoUnregisterPowerSettingCallback( + IN OUT PVOID Handle); + +#endif + +#if (NTDDI_VERSION >= NTDDI_WIN6SP1) +NTKERNELAPI +VOID +NTAPI +PoSetDeviceBusyEx( + IN OUT PULONG IdlePointer); +#endif + +#if (NTDDI_VERSION >= NTDDI_WIN7) + +NTKERNELAPI +NTSTATUS +NTAPI +PoCreatePowerRequest( + OUT PVOID *PowerRequest, + IN PDEVICE_OBJECT DeviceObject, + IN PCOUNTED_REASON_CONTEXT Context); + +NTKERNELAPI +NTSTATUS +NTAPI +PoSetPowerRequest( + IN OUT PVOID PowerRequest, + IN POWER_REQUEST_TYPE Type); + +NTKERNELAPI +NTSTATUS +NTAPI +PoClearPowerRequest( + IN OUT PVOID PowerRequest, + IN POWER_REQUEST_TYPE Type); + +NTKERNELAPI +VOID +NTAPI +PoDeletePowerRequest( + IN OUT PVOID PowerRequest); + +NTKERNELAPI +VOID +NTAPI +PoStartDeviceBusy( + IN OUT PULONG IdlePointer); + +NTKERNELAPI +VOID +NTAPI +PoEndDeviceBusy( + IN OUT PULONG IdlePointer); + +NTKERNELAPI +BOOLEAN +NTAPI +PoQueryWatchdogTime( + IN PDEVICE_OBJECT Pdo, + OUT PULONG SecondsRemaining); + +#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ + #if defined(_IA64_) #if (NTDDI_VERSION >= NTDDI_WIN2K) //DECLSPEC_DEPRECATED_DDK @@ -6247,188 +6568,6 @@ typedef struct _FILE_LOCK { LONG volatile LockRequestsInProgress; } FILE_LOCK, *PFILE_LOCK; -typedef struct _TUNNEL { - FAST_MUTEX Mutex; - PRTL_SPLAY_LINKS Cache; - LIST_ENTRY TimerQueue; - USHORT NumEntries; -} TUNNEL, *PTUNNEL; - -typedef enum _FSRTL_COMPARISON_RESULT { - LessThan = -1, - EqualTo = 0, - GreaterThan = 1 -} FSRTL_COMPARISON_RESULT; - -#define FSRTL_FAT_LEGAL 0x01 -#define FSRTL_HPFS_LEGAL 0x02 -#define FSRTL_NTFS_LEGAL 0x04 -#define FSRTL_WILD_CHARACTER 0x08 -#define FSRTL_OLE_LEGAL 0x10 -#define FSRTL_NTFS_STREAM_LEGAL (FSRTL_NTFS_LEGAL | FSRTL_OLE_LEGAL) - -typedef struct _BASE_MCB { - ULONG MaximumPairCount; - ULONG PairCount; - USHORT PoolType; - USHORT Flags; - PVOID Mapping; -} BASE_MCB, *PBASE_MCB; - -typedef struct _LARGE_MCB { - PKGUARDED_MUTEX GuardedMutex; - BASE_MCB BaseMcb; -} LARGE_MCB, *PLARGE_MCB; - -#define MCB_FLAG_RAISE_ON_ALLOCATION_FAILURE 1 - -typedef struct _MCB { - LARGE_MCB DummyFieldThatSizesThisStructureCorrectly; -} MCB, *PMCB; - -typedef PVOID OPLOCK, *POPLOCK; - -typedef VOID -(NTAPI *POPLOCK_WAIT_COMPLETE_ROUTINE) ( - IN PVOID Context, - IN PIRP Irp); - -typedef VOID -(NTAPI *POPLOCK_FS_PREPOST_IRP) ( - IN PVOID Context, - IN PIRP Irp); - -#if (NTDDI_VERSION >= NTDDI_VISTASP1) -#define OPLOCK_FLAG_COMPLETE_IF_OPLOCKED 0x00000001 -#endif - -#if (NTDDI_VERSION >= NTDDI_WIN7) -#define OPLOCK_FLAG_OPLOCK_KEY_CHECK_ONLY 0x00000002 -#define OPLOCK_FLAG_BACK_OUT_ATOMIC_OPLOCK 0x00000004 -#define OPLOCK_FLAG_IGNORE_OPLOCK_KEYS 0x00000008 -#define OPLOCK_FSCTRL_FLAG_ALL_KEYS_MATCH 0x00000001 -#endif - -#if (NTDDI_VERSION >= NTDDI_WIN7) - -typedef struct _OPLOCK_KEY_ECP_CONTEXT { - GUID OplockKey; - ULONG Reserved; -} OPLOCK_KEY_ECP_CONTEXT, *POPLOCK_KEY_ECP_CONTEXT; - -DEFINE_GUID( GUID_ECP_OPLOCK_KEY, 0x48850596, 0x3050, 0x4be7, 0x98, 0x63, 0xfe, 0xc3, 0x50, 0xce, 0x8d, 0x7f ); - -#endif - -#define FSRTL_VOLUME_DISMOUNT 1 -#define FSRTL_VOLUME_DISMOUNT_FAILED 2 -#define FSRTL_VOLUME_LOCK 3 -#define FSRTL_VOLUME_LOCK_FAILED 4 -#define FSRTL_VOLUME_UNLOCK 5 -#define FSRTL_VOLUME_MOUNT 6 -#define FSRTL_VOLUME_NEEDS_CHKDSK 7 -#define FSRTL_VOLUME_WORM_NEAR_FULL 8 -#define FSRTL_VOLUME_WEARING_OUT 9 -#define FSRTL_VOLUME_FORCED_CLOSED 10 -#define FSRTL_VOLUME_INFO_MAKE_COMPAT 11 -#define FSRTL_VOLUME_PREPARING_EJECT 12 -#define FSRTL_VOLUME_CHANGE_SIZE 13 -#define FSRTL_VOLUME_BACKGROUND_FORMAT 14 - -typedef PVOID PNOTIFY_SYNC; - -typedef BOOLEAN -(NTAPI *PCHECK_FOR_TRAVERSE_ACCESS) ( - IN PVOID NotifyContext, - IN PVOID TargetContext OPTIONAL, - IN PSECURITY_SUBJECT_CONTEXT SubjectContext); - -typedef BOOLEAN -(NTAPI *PFILTER_REPORT_CHANGE) ( - IN PVOID NotifyContext, - IN PVOID FilterContext); - -typedef VOID -(NTAPI *PFSRTL_STACK_OVERFLOW_ROUTINE) ( - IN PVOID Context, - IN PKEVENT Event); - -#if (NTDDI_VERSION >= NTDDI_VISTA) - -#define FSRTL_UNC_PROVIDER_FLAGS_MAILSLOTS_SUPPORTED 0x00000001 -#define FSRTL_UNC_PROVIDER_FLAGS_CSC_ENABLED 0x00000002 -#define FSRTL_UNC_PROVIDER_FLAGS_DOMAIN_SVC_AWARE 0x00000004 - -#define FSRTL_ALLOCATE_ECPLIST_FLAG_CHARGE_QUOTA 0x00000001 - -#define FSRTL_ALLOCATE_ECP_FLAG_CHARGE_QUOTA 0x00000001 -#define FSRTL_ALLOCATE_ECP_FLAG_NONPAGED_POOL 0x00000002 - -#define FSRTL_ECP_LOOKASIDE_FLAG_NONPAGED_POOL 0x00000002 - -#define FSRTL_VIRTDISK_FULLY_ALLOCATED 0x00000001 -#define FSRTL_VIRTDISK_NO_DRIVE_LETTER 0x00000002 - -typedef struct _FSRTL_MUP_PROVIDER_INFO_LEVEL_1 { - ULONG32 ProviderId; -} FSRTL_MUP_PROVIDER_INFO_LEVEL_1, *PFSRTL_MUP_PROVIDER_INFO_LEVEL_1; - -typedef struct _FSRTL_MUP_PROVIDER_INFO_LEVEL_2 { - ULONG32 ProviderId; - UNICODE_STRING ProviderName; -} FSRTL_MUP_PROVIDER_INFO_LEVEL_2, *PFSRTL_MUP_PROVIDER_INFO_LEVEL_2; - -typedef VOID -(*PFSRTL_EXTRA_CREATE_PARAMETER_CLEANUP_CALLBACK) ( - IN OUT PVOID EcpContext, - IN LPCGUID EcpType); - -typedef struct _ECP_LIST ECP_LIST, *PECP_LIST; - -typedef ULONG FSRTL_ALLOCATE_ECPLIST_FLAGS; -typedef ULONG FSRTL_ALLOCATE_ECP_FLAGS; -typedef ULONG FSRTL_ECP_LOOKASIDE_FLAGS; - -typedef enum _FSRTL_CHANGE_BACKING_TYPE { - ChangeDataControlArea, - ChangeImageControlArea, - ChangeSharedCacheMap -} FSRTL_CHANGE_BACKING_TYPE, *PFSRTL_CHANGE_BACKING_TYPE; - -#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ - -typedef struct _FSRTL_PER_FILE_CONTEXT { - LIST_ENTRY Links; - PVOID OwnerId; - PVOID InstanceId; - PFREE_FUNCTION FreeCallback; -} FSRTL_PER_FILE_CONTEXT, *PFSRTL_PER_FILE_CONTEXT; - -typedef struct _FSRTL_PER_STREAM_CONTEXT { - LIST_ENTRY Links; - PVOID OwnerId; - PVOID InstanceId; - PFREE_FUNCTION FreeCallback; -} FSRTL_PER_STREAM_CONTEXT, *PFSRTL_PER_STREAM_CONTEXT; - -#if (NTDDI_VERSION >= NTDDI_WIN2K) -typedef VOID -(*PFN_FSRTLTEARDOWNPERSTREAMCONTEXTS) ( - IN PFSRTL_ADVANCED_FCB_HEADER AdvancedHeader); -#endif - -typedef struct _FSRTL_PER_FILEOBJECT_CONTEXT { - LIST_ENTRY Links; - PVOID OwnerId; - PVOID InstanceId; -} FSRTL_PER_FILEOBJECT_CONTEXT, *PFSRTL_PER_FILEOBJECT_CONTEXT; - -#define FsRtlEnterFileSystem KeEnterCriticalRegion -#define FsRtlExitFileSystem KeLeaveCriticalRegion - -#define FSRTL_CC_FLUSH_ERROR_FLAG_NO_HARD_ERROR 0x1 -#define FSRTL_CC_FLUSH_ERROR_FLAG_NO_LOG_ENTRY 0x2 - #if (NTDDI_VERSION >= NTDDI_WIN2K) NTKERNELAPI @@ -6706,2181 +6845,15 @@ FsRtlPrivateLock( IN PVOID Context, IN BOOLEAN AlreadySynchronized); -NTKERNELAPI -VOID -NTAPI -FsRtlInitializeTunnelCache( - IN PTUNNEL Cache); - -NTKERNELAPI -VOID -NTAPI -FsRtlAddToTunnelCache( - IN PTUNNEL Cache, - IN ULONGLONG DirectoryKey, - IN PUNICODE_STRING ShortName, - IN PUNICODE_STRING LongName, - IN BOOLEAN KeyByShortName, - IN ULONG DataLength, - IN PVOID Data); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlFindInTunnelCache( - IN PTUNNEL Cache, - IN ULONGLONG DirectoryKey, - IN PUNICODE_STRING Name, - OUT PUNICODE_STRING ShortName, - OUT PUNICODE_STRING LongName, - IN OUT PULONG DataLength, - OUT PVOID Data); - -NTKERNELAPI -VOID -NTAPI -FsRtlDeleteKeyFromTunnelCache( - IN PTUNNEL Cache, - IN ULONGLONG DirectoryKey); - -NTKERNELAPI -VOID -NTAPI -FsRtlDeleteTunnelCache( - IN PTUNNEL Cache); - -NTKERNELAPI -VOID -NTAPI -FsRtlDissectDbcs( - IN ANSI_STRING Name, - OUT PANSI_STRING FirstPart, - OUT PANSI_STRING RemainingPart); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlDoesDbcsContainWildCards( - IN PANSI_STRING Name); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlIsDbcsInExpression( - IN PANSI_STRING Expression, - IN PANSI_STRING Name); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlIsFatDbcsLegal( - IN ANSI_STRING DbcsName, - IN BOOLEAN WildCardsPermissible, - IN BOOLEAN PathNamePermissible, - IN BOOLEAN LeadingBackslashPermissible); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlIsHpfsDbcsLegal( - IN ANSI_STRING DbcsName, - IN BOOLEAN WildCardsPermissible, - IN BOOLEAN PathNamePermissible, - IN BOOLEAN LeadingBackslashPermissible); - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlNormalizeNtstatus( - IN NTSTATUS Exception, - IN NTSTATUS GenericException); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlIsNtstatusExpected( - IN NTSTATUS Ntstatus); - -NTKERNELAPI -PERESOURCE -NTAPI -FsRtlAllocateResource( - VOID); - -NTKERNELAPI -VOID -NTAPI -FsRtlInitializeLargeMcb( - IN PLARGE_MCB Mcb, - IN POOL_TYPE PoolType); - -NTKERNELAPI -VOID -NTAPI -FsRtlUninitializeLargeMcb( - IN PLARGE_MCB Mcb); - -NTKERNELAPI -VOID -NTAPI -FsRtlResetLargeMcb( - IN PLARGE_MCB Mcb, - IN BOOLEAN SelfSynchronized); - -NTKERNELAPI -VOID -NTAPI -FsRtlTruncateLargeMcb( - IN PLARGE_MCB Mcb, - IN LONGLONG Vbn); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlAddLargeMcbEntry( - IN PLARGE_MCB Mcb, - IN LONGLONG Vbn, - IN LONGLONG Lbn, - IN LONGLONG SectorCount); - -NTKERNELAPI -VOID -NTAPI -FsRtlRemoveLargeMcbEntry( - IN PLARGE_MCB Mcb, - IN LONGLONG Vbn, - IN LONGLONG SectorCount); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlLookupLargeMcbEntry( - IN PLARGE_MCB Mcb, - IN LONGLONG Vbn, - OUT PLONGLONG Lbn OPTIONAL, - OUT PLONGLONG SectorCountFromLbn OPTIONAL, - OUT PLONGLONG StartingLbn OPTIONAL, - OUT PLONGLONG SectorCountFromStartingLbn OPTIONAL, - OUT PULONG Index OPTIONAL); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlLookupLastLargeMcbEntry( - IN PLARGE_MCB Mcb, - OUT PLONGLONG Vbn, - OUT PLONGLONG Lbn); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlLookupLastLargeMcbEntryAndIndex( - IN PLARGE_MCB OpaqueMcb, - OUT PLONGLONG LargeVbn, - OUT PLONGLONG LargeLbn, - OUT PULONG Index); - -NTKERNELAPI -ULONG -NTAPI -FsRtlNumberOfRunsInLargeMcb( - IN PLARGE_MCB Mcb); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlGetNextLargeMcbEntry( - IN PLARGE_MCB Mcb, - IN ULONG RunIndex, - OUT PLONGLONG Vbn, - OUT PLONGLONG Lbn, - OUT PLONGLONG SectorCount); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlSplitLargeMcb( - IN PLARGE_MCB Mcb, - IN LONGLONG Vbn, - IN LONGLONG Amount); - -NTKERNELAPI -VOID -NTAPI -FsRtlInitializeMcb( - IN PMCB Mcb, - IN POOL_TYPE PoolType); - -NTKERNELAPI -VOID -NTAPI -FsRtlUninitializeMcb( - IN PMCB Mcb); - -NTKERNELAPI -VOID -NTAPI -FsRtlTruncateMcb( - IN PMCB Mcb, - IN VBN Vbn); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlAddMcbEntry( - IN PMCB Mcb, - IN VBN Vbn, - IN LBN Lbn, - IN ULONG SectorCount); - -NTKERNELAPI -VOID -NTAPI -FsRtlRemoveMcbEntry( - IN PMCB Mcb, - IN VBN Vbn, - IN ULONG SectorCount); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlLookupMcbEntry( - IN PMCB Mcb, - IN VBN Vbn, - OUT PLBN Lbn, - OUT PULONG SectorCount OPTIONAL, - OUT PULONG Index); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlLookupLastMcbEntry( - IN PMCB Mcb, - OUT PVBN Vbn, - OUT PLBN Lbn); - -NTKERNELAPI -ULONG -NTAPI -FsRtlNumberOfRunsInMcb( - IN PMCB Mcb); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlGetNextMcbEntry( - IN PMCB Mcb, - IN ULONG RunIndex, - OUT PVBN Vbn, - OUT PLBN Lbn, - OUT PULONG SectorCount); - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlBalanceReads( - IN PDEVICE_OBJECT TargetDevice); - -NTKERNELAPI -VOID -NTAPI -FsRtlInitializeOplock( - IN OUT POPLOCK Oplock); - -NTKERNELAPI -VOID -NTAPI -FsRtlUninitializeOplock( - IN OUT POPLOCK Oplock); - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlOplockFsctrl( - IN POPLOCK Oplock, - IN PIRP Irp, - IN ULONG OpenCount); - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlCheckOplock( - IN POPLOCK Oplock, - IN PIRP Irp, - IN PVOID Context, - IN POPLOCK_WAIT_COMPLETE_ROUTINE CompletionRoutine OPTIONAL, - IN POPLOCK_FS_PREPOST_IRP PostIrpRoutine OPTIONAL); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlOplockIsFastIoPossible( - IN POPLOCK Oplock); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlCurrentBatchOplock( - IN POPLOCK Oplock); - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlNotifyVolumeEvent( - IN PFILE_OBJECT FileObject, - IN ULONG EventCode); - -NTKERNELAPI -VOID -NTAPI -FsRtlNotifyInitializeSync( - IN PNOTIFY_SYNC *NotifySync); - -NTKERNELAPI -VOID -NTAPI -FsRtlNotifyUninitializeSync( - IN PNOTIFY_SYNC *NotifySync); - -NTKERNELAPI -VOID -NTAPI -FsRtlNotifyFullChangeDirectory( - IN PNOTIFY_SYNC NotifySync, - IN PLIST_ENTRY NotifyList, - IN PVOID FsContext, - IN PSTRING FullDirectoryName, - IN BOOLEAN WatchTree, - IN BOOLEAN IgnoreBuffer, - IN ULONG CompletionFilter, - IN PIRP NotifyIrp OPTIONAL, - IN PCHECK_FOR_TRAVERSE_ACCESS TraverseCallback OPTIONAL, - IN PSECURITY_SUBJECT_CONTEXT SubjectContext OPTIONAL); - -NTKERNELAPI -VOID -NTAPI -FsRtlNotifyFilterReportChange( - IN PNOTIFY_SYNC NotifySync, - IN PLIST_ENTRY NotifyList, - IN PSTRING FullTargetName, - IN USHORT TargetNameOffset, - IN PSTRING StreamName OPTIONAL, - IN PSTRING NormalizedParentName OPTIONAL, - IN ULONG FilterMatch, - IN ULONG Action, - IN PVOID TargetContext OPTIONAL, - IN PVOID FilterContext OPTIONAL); - -NTKERNELAPI -VOID -NTAPI -FsRtlNotifyFullReportChange( - IN PNOTIFY_SYNC NotifySync, - IN PLIST_ENTRY NotifyList, - IN PSTRING FullTargetName, - IN USHORT TargetNameOffset, - IN PSTRING StreamName OPTIONAL, - IN PSTRING NormalizedParentName OPTIONAL, - IN ULONG FilterMatch, - IN ULONG Action, - IN PVOID TargetContext OPTIONAL); - -NTKERNELAPI -VOID -NTAPI -FsRtlNotifyCleanup( - IN PNOTIFY_SYNC NotifySync, - IN PLIST_ENTRY NotifyList, - IN PVOID FsContext); - -NTKERNELAPI -VOID -NTAPI -FsRtlDissectName( - IN UNICODE_STRING Name, - OUT PUNICODE_STRING FirstPart, - OUT PUNICODE_STRING RemainingPart); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlDoesNameContainWildCards( - IN PUNICODE_STRING Name); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlAreNamesEqual( - IN PCUNICODE_STRING Name1, - IN PCUNICODE_STRING Name2, - IN BOOLEAN IgnoreCase, - IN PCWCH UpcaseTable OPTIONAL); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlIsNameInExpression( - IN PUNICODE_STRING Expression, - IN PUNICODE_STRING Name, - IN BOOLEAN IgnoreCase, - IN PWCHAR UpcaseTable OPTIONAL); - -NTKERNELAPI -VOID -NTAPI -FsRtlPostPagingFileStackOverflow( - IN PVOID Context, - IN PKEVENT Event, - IN PFSRTL_STACK_OVERFLOW_ROUTINE StackOverflowRoutine); - -NTKERNELAPI -VOID -NTAPI -FsRtlPostStackOverflow ( - IN PVOID Context, - IN PKEVENT Event, - IN PFSRTL_STACK_OVERFLOW_ROUTINE StackOverflowRoutine); - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlRegisterUncProvider( - OUT PHANDLE MupHandle, - IN PUNICODE_STRING RedirectorDeviceName, - IN BOOLEAN MailslotsSupported); - -NTKERNELAPI -VOID -NTAPI -FsRtlDeregisterUncProvider( - IN HANDLE Handle); - -NTKERNELAPI -VOID -NTAPI -FsRtlTeardownPerStreamContexts( - IN PFSRTL_ADVANCED_FCB_HEADER AdvancedHeader); - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlCreateSectionForDataScan( - OUT PHANDLE SectionHandle, - OUT PVOID *SectionObject, - OUT PLARGE_INTEGER SectionFileSize OPTIONAL, - IN PFILE_OBJECT FileObject, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, - IN PLARGE_INTEGER MaximumSize OPTIONAL, - IN ULONG SectionPageProtection, - IN ULONG AllocationAttributes, - IN ULONG Flags); - #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ -#if (NTDDI_VERSION >= NTDDI_WINXP) - -NTKERNELAPI -VOID -NTAPI -FsRtlNotifyFilterChangeDirectory( - IN PNOTIFY_SYNC NotifySync, - IN PLIST_ENTRY NotifyList, - IN PVOID FsContext, - IN PSTRING FullDirectoryName, - IN BOOLEAN WatchTree, - IN BOOLEAN IgnoreBuffer, - IN ULONG CompletionFilter, - IN PIRP NotifyIrp OPTIONAL, - IN PCHECK_FOR_TRAVERSE_ACCESS TraverseCallback OPTIONAL, - IN PSECURITY_SUBJECT_CONTEXT SubjectContext OPTIONAL, - IN PFILTER_REPORT_CHANGE FilterCallback OPTIONAL); - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlInsertPerStreamContext( - IN PFSRTL_ADVANCED_FCB_HEADER PerStreamContext, - IN PFSRTL_PER_STREAM_CONTEXT Ptr); - -NTKERNELAPI -PFSRTL_PER_STREAM_CONTEXT -NTAPI -FsRtlLookupPerStreamContextInternal( - IN PFSRTL_ADVANCED_FCB_HEADER StreamContext, - IN PVOID OwnerId OPTIONAL, - IN PVOID InstanceId OPTIONAL); - -NTKERNELAPI -PFSRTL_PER_STREAM_CONTEXT -NTAPI -FsRtlRemovePerStreamContext( - IN PFSRTL_ADVANCED_FCB_HEADER StreamContext, - IN PVOID OwnerId OPTIONAL, - IN PVOID InstanceId OPTIONAL); - -NTKERNELAPI -VOID -NTAPI -FsRtlIncrementCcFastReadNotPossible( - VOID); - -NTKERNELAPI -VOID -NTAPI -FsRtlIncrementCcFastReadWait( - VOID); - -NTKERNELAPI -VOID -NTAPI -FsRtlIncrementCcFastReadNoWait( - VOID); - -NTKERNELAPI -VOID -NTAPI -FsRtlIncrementCcFastReadResourceMiss( - VOID); - -NTKERNELAPI -LOGICAL -NTAPI -FsRtlIsPagingFile( - IN PFILE_OBJECT FileObject); - -#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ - -#if (NTDDI_VERSION >= NTDDI_WS03) - -NTKERNELAPI - VOID -NTAPI -FsRtlInitializeBaseMcb( - IN PBASE_MCB Mcb, - IN POOL_TYPE PoolType); - -NTKERNELAPI -VOID -NTAPI -FsRtlUninitializeBaseMcb( - IN PBASE_MCB Mcb); - -NTKERNELAPI -VOID -NTAPI -FsRtlResetBaseMcb( - IN PBASE_MCB Mcb); - -NTKERNELAPI -VOID -NTAPI -FsRtlTruncateBaseMcb( - IN PBASE_MCB Mcb, - IN LONGLONG Vbn); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlAddBaseMcbEntry( - IN PBASE_MCB Mcb, - IN LONGLONG Vbn, - IN LONGLONG Lbn, - IN LONGLONG SectorCount); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlRemoveBaseMcbEntry( - IN PBASE_MCB Mcb, - IN LONGLONG Vbn, - IN LONGLONG SectorCount); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlLookupBaseMcbEntry( - IN PBASE_MCB Mcb, - IN LONGLONG Vbn, - OUT PLONGLONG Lbn OPTIONAL, - OUT PLONGLONG SectorCountFromLbn OPTIONAL, - OUT PLONGLONG StartingLbn OPTIONAL, - OUT PLONGLONG SectorCountFromStartingLbn OPTIONAL, - OUT PULONG Index OPTIONAL); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlLookupLastBaseMcbEntry( - IN PBASE_MCB Mcb, - OUT PLONGLONG Vbn, - OUT PLONGLONG Lbn); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlLookupLastBaseMcbEntryAndIndex( - IN PBASE_MCB OpaqueMcb, - IN OUT PLONGLONG LargeVbn, - IN OUT PLONGLONG LargeLbn, - IN OUT PULONG Index); - -NTKERNELAPI -ULONG -NTAPI -FsRtlNumberOfRunsInBaseMcb( - IN PBASE_MCB Mcb); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlGetNextBaseMcbEntry( - IN PBASE_MCB Mcb, - IN ULONG RunIndex, - OUT PLONGLONG Vbn, - OUT PLONGLONG Lbn, - OUT PLONGLONG SectorCount); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlSplitBaseMcb( - IN PBASE_MCB Mcb, - IN LONGLONG Vbn, - IN LONGLONG Amount); - -#endif /* (NTDDI_VERSION >= NTDDI_WS03) */ - -#if (NTDDI_VERSION >= NTDDI_VISTA) - -BOOLEAN -NTAPI -FsRtlInitializeBaseMcbEx( - IN PBASE_MCB Mcb, - IN POOL_TYPE PoolType, - IN USHORT Flags); - -NTSTATUS -NTAPI -FsRtlAddBaseMcbEntryEx( - IN PBASE_MCB Mcb, - IN LONGLONG Vbn, - IN LONGLONG Lbn, - IN LONGLONG SectorCount); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlCurrentOplock( - IN POPLOCK Oplock); - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlOplockBreakToNone( - IN OUT POPLOCK Oplock, - IN PIO_STACK_LOCATION IrpSp OPTIONAL, - IN PIRP Irp, - IN PVOID Context OPTIONAL, - IN POPLOCK_WAIT_COMPLETE_ROUTINE CompletionRoutine OPTIONAL, - IN POPLOCK_FS_PREPOST_IRP PostIrpRoutine OPTIONAL); - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlNotifyVolumeEventEx( - IN PFILE_OBJECT FileObject, - IN ULONG EventCode, - IN PTARGET_DEVICE_CUSTOM_NOTIFICATION Event); - -NTKERNELAPI -VOID -NTAPI -FsRtlNotifyCleanupAll( - IN PNOTIFY_SYNC NotifySync, - IN PLIST_ENTRY NotifyList); - -NTSTATUS -NTAPI -FsRtlRegisterUncProviderEx( - OUT PHANDLE MupHandle, - IN PUNICODE_STRING RedirDevName, - IN PDEVICE_OBJECT DeviceObject, - IN ULONG Flags); - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlCancellableWaitForSingleObject( - IN PVOID Object, - IN PLARGE_INTEGER Timeout OPTIONAL, - IN PIRP Irp OPTIONAL); - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlCancellableWaitForMultipleObjects( - IN ULONG Count, - IN PVOID ObjectArray[], - IN WAIT_TYPE WaitType, - IN PLARGE_INTEGER Timeout OPTIONAL, - IN PKWAIT_BLOCK WaitBlockArray OPTIONAL, - IN PIRP Irp OPTIONAL); - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlMupGetProviderInfoFromFileObject( - IN PFILE_OBJECT pFileObject, - IN ULONG Level, - OUT PVOID pBuffer, - IN OUT PULONG pBufferSize); - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlMupGetProviderIdFromName( - IN PUNICODE_STRING pProviderName, - OUT PULONG32 pProviderId); - -NTKERNELAPI -VOID -NTAPI -FsRtlIncrementCcFastMdlReadWait( - VOID); - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlValidateReparsePointBuffer( - IN ULONG BufferLength, - IN PREPARSE_DATA_BUFFER ReparseBuffer); - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlRemoveDotsFromPath( - IN OUT PWSTR OriginalString, - IN USHORT PathLength, - OUT USHORT *NewLength); - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlAllocateExtraCreateParameterList( - IN FSRTL_ALLOCATE_ECPLIST_FLAGS Flags, - OUT PECP_LIST *EcpList); - -NTKERNELAPI -VOID -NTAPI -FsRtlFreeExtraCreateParameterList( - IN PECP_LIST EcpList); - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlAllocateExtraCreateParameter( - IN LPCGUID EcpType, - IN ULONG SizeOfContext, - IN FSRTL_ALLOCATE_ECP_FLAGS Flags, - IN PFSRTL_EXTRA_CREATE_PARAMETER_CLEANUP_CALLBACK CleanupCallback OPTIONAL, - IN ULONG PoolTag, - OUT PVOID *EcpContext); - -NTKERNELAPI -VOID -NTAPI -FsRtlFreeExtraCreateParameter( - IN PVOID EcpContext); - -NTKERNELAPI -VOID -NTAPI -FsRtlInitExtraCreateParameterLookasideList( - IN OUT PVOID Lookaside, - IN FSRTL_ECP_LOOKASIDE_FLAGS Flags, - IN SIZE_T Size, - IN ULONG Tag); - -VOID -NTAPI -FsRtlDeleteExtraCreateParameterLookasideList( - IN OUT PVOID Lookaside, - IN FSRTL_ECP_LOOKASIDE_FLAGS Flags); - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlAllocateExtraCreateParameterFromLookasideList( - IN LPCGUID EcpType, - IN ULONG SizeOfContext, - IN FSRTL_ALLOCATE_ECP_FLAGS Flags, - IN PFSRTL_EXTRA_CREATE_PARAMETER_CLEANUP_CALLBACK CleanupCallback OPTIONAL, - IN OUT PVOID LookasideList, - OUT PVOID *EcpContext); - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlInsertExtraCreateParameter( - IN OUT PECP_LIST EcpList, - IN OUT PVOID EcpContext); - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlFindExtraCreateParameter( - IN PECP_LIST EcpList, - IN LPCGUID EcpType, - OUT PVOID *EcpContext OPTIONAL, - OUT ULONG *EcpContextSize OPTIONAL); - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlRemoveExtraCreateParameter( - IN OUT PECP_LIST EcpList, - IN LPCGUID EcpType, - OUT PVOID *EcpContext, - OUT ULONG *EcpContextSize OPTIONAL); - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlGetEcpListFromIrp( - IN PIRP Irp, - OUT PECP_LIST *EcpList OPTIONAL); - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlSetEcpListIntoIrp( - IN OUT PIRP Irp, - IN PECP_LIST EcpList); - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlGetNextExtraCreateParameter( - IN PECP_LIST EcpList, - IN PVOID CurrentEcpContext OPTIONAL, - OUT LPGUID NextEcpType OPTIONAL, - OUT PVOID *NextEcpContext OPTIONAL, - OUT ULONG *NextEcpContextSize OPTIONAL); - -NTKERNELAPI -VOID -NTAPI -FsRtlAcknowledgeEcp( - IN PVOID EcpContext); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlIsEcpAcknowledged( - IN PVOID EcpContext); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlIsEcpFromUserMode( - IN PVOID EcpContext); - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlChangeBackingFileObject( - IN PFILE_OBJECT CurrentFileObject OPTIONAL, - IN PFILE_OBJECT NewFileObject, - IN FSRTL_CHANGE_BACKING_TYPE ChangeBackingType, - IN ULONG Flags); - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlLogCcFlushError( - IN PUNICODE_STRING FileName, - IN PDEVICE_OBJECT DeviceObject, - IN PSECTION_OBJECT_POINTERS SectionObjectPointer, - IN NTSTATUS FlushError, - IN ULONG Flags); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlAreVolumeStartupApplicationsComplete( - VOID); - -NTKERNELAPI -ULONG -NTAPI -FsRtlQueryMaximumVirtualDiskNestingLevel( - VOID); - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlGetVirtualDiskNestingLevel( - IN PDEVICE_OBJECT DeviceObject, - OUT PULONG NestingLevel, - OUT PULONG NestingFlags OPTIONAL); - -#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ - -#if (NTDDI_VERSION >= NTDDI_VISTASP1) -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlCheckOplockEx( - IN POPLOCK Oplock, - IN PIRP Irp, - IN ULONG Flags, - IN PVOID Context OPTIONAL, - IN POPLOCK_WAIT_COMPLETE_ROUTINE CompletionRoutine OPTIONAL, - IN POPLOCK_FS_PREPOST_IRP PostIrpRoutine OPTIONAL); - -#endif - #if (NTDDI_VERSION >= NTDDI_WIN7) - NTKERNELAPI BOOLEAN NTAPI FsRtlAreThereCurrentOrInProgressFileLocks( IN PFILE_LOCK FileLock); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlOplockIsSharedRequest( - IN PIRP Irp); - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlOplockBreakH( - IN POPLOCK Oplock, - IN PIRP Irp, - IN ULONG Flags, - IN PVOID Context OPTIONAL, - IN POPLOCK_WAIT_COMPLETE_ROUTINE CompletionRoutine OPTIONAL, - IN POPLOCK_FS_PREPOST_IRP PostIrpRoutine OPTIONAL); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlCurrentOplockH( - IN POPLOCK Oplock); - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlOplockBreakToNoneEx( - IN OUT POPLOCK Oplock, - IN PIRP Irp, - IN ULONG Flags, - IN PVOID Context OPTIONAL, - IN POPLOCK_WAIT_COMPLETE_ROUTINE CompletionRoutine OPTIONAL, - IN POPLOCK_FS_PREPOST_IRP PostIrpRoutine OPTIONAL); - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlOplockFsctrlEx( - IN POPLOCK Oplock, - IN PIRP Irp, - IN ULONG OpenCount, - IN ULONG Flags); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlOplockKeysEqual( - IN PFILE_OBJECT Fo1 OPTIONAL, - IN PFILE_OBJECT Fo2 OPTIONAL); - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlInitializeExtraCreateParameterList( - IN OUT PECP_LIST EcpList); - -NTKERNELAPI -VOID -NTAPI -FsRtlInitializeExtraCreateParameter( - IN PECP_HEADER Ecp, - IN ULONG EcpFlags, - IN PFSRTL_EXTRA_CREATE_PARAMETER_CLEANUP_CALLBACK CleanupCallback OPTIONAL, - IN ULONG TotalSize, - IN LPCGUID EcpType, - IN PVOID ListAllocatedFrom OPTIONAL); - -#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlInsertPerFileContext( - IN PVOID* PerFileContextPointer, - IN PFSRTL_PER_FILE_CONTEXT Ptr); - -NTKERNELAPI -PFSRTL_PER_FILE_CONTEXT -NTAPI -FsRtlLookupPerFileContext( - IN PVOID* PerFileContextPointer, - IN PVOID OwnerId OPTIONAL, - IN PVOID InstanceId OPTIONAL); - -NTKERNELAPI -PFSRTL_PER_FILE_CONTEXT -NTAPI -FsRtlRemovePerFileContext( - IN PVOID* PerFileContextPointer, - IN PVOID OwnerId OPTIONAL, - IN PVOID InstanceId OPTIONAL); - -NTKERNELAPI -VOID -NTAPI -FsRtlTeardownPerFileContexts( - IN PVOID* PerFileContextPointer); - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlInsertPerFileObjectContext( - IN PFILE_OBJECT FileObject, - IN PFSRTL_PER_FILEOBJECT_CONTEXT Ptr); - -NTKERNELAPI -PFSRTL_PER_FILEOBJECT_CONTEXT -NTAPI -FsRtlLookupPerFileObjectContext( - IN PFILE_OBJECT FileObject, - IN PVOID OwnerId OPTIONAL, - IN PVOID InstanceId OPTIONAL); - -NTKERNELAPI -PFSRTL_PER_FILEOBJECT_CONTEXT -NTAPI -FsRtlRemovePerFileObjectContext( - IN PFILE_OBJECT FileObject, - IN PVOID OwnerId OPTIONAL, - IN PVOID InstanceId OPTIONAL); - -#define FsRtlFastLock(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11) ( \ - FsRtlPrivateLock(A1, A2, A3, A4, A5, A6, A7, A8, A9, NULL, A10, A11) \ -) - -#define FsRtlAreThereCurrentFileLocks(FL) ( \ - ((FL)->FastIoIsQuestionable) \ -) - -#define FsRtlIncrementLockRequestsInProgress(FL) { \ - ASSERT( (FL)->LockRequestsInProgress >= 0 ); \ - (void) \ - (InterlockedIncrement((LONG volatile *)&((FL)->LockRequestsInProgress)));\ -} - -#define FsRtlDecrementLockRequestsInProgress(FL) { \ - ASSERT( (FL)->LockRequestsInProgress > 0 ); \ - (void) \ - (InterlockedDecrement((LONG volatile *)&((FL)->LockRequestsInProgress)));\ -} - -extern NTKERNELAPI PUSHORT NlsOemLeadByteInfo; -#define NLS_OEM_LEAD_BYTE_INFO NlsOemLeadByteInfo - -#ifdef NLS_MB_CODE_PAGE_TAG -#undef NLS_MB_CODE_PAGE_TAG #endif -#define NLS_MB_CODE_PAGE_TAG NlsMbOemCodePageTag - -/* GCC compatible definition, MS one is retarded */ -extern NTKERNELAPI const UCHAR * const FsRtlLegalAnsiCharacterArray; -#define LEGAL_ANSI_CHARACTER_ARRAY FsRtlLegalAnsiCharacterArray - -#define FsRtlIsAnsiCharacterWild(C) ( \ - FlagOn(FsRtlLegalAnsiCharacterArray[(UCHAR)(C)], FSRTL_WILD_CHARACTER ) \ -) - -#define FsRtlIsAnsiCharacterLegalFat(C, WILD) ( \ - FlagOn(FsRtlLegalAnsiCharacterArray[(UCHAR)(C)], (FSRTL_FAT_LEGAL) | \ - ((WILD) ? FSRTL_WILD_CHARACTER : 0 )) \ -) - -#define FsRtlIsAnsiCharacterLegalHpfs(C, WILD) ( \ - FlagOn(FsRtlLegalAnsiCharacterArray[(UCHAR)(C)], (FSRTL_HPFS_LEGAL) | \ - ((WILD) ? FSRTL_WILD_CHARACTER : 0 )) \ -) - -#define FsRtlIsAnsiCharacterLegalNtfs(C, WILD) ( \ - FlagOn(FsRtlLegalAnsiCharacterArray[(UCHAR)(C)], (FSRTL_NTFS_LEGAL) | \ - ((WILD) ? FSRTL_WILD_CHARACTER : 0 )) \ -) - -#define FsRtlIsAnsiCharacterLegalNtfsStream(C,WILD_OK) ( \ - FsRtlTestAnsiCharacter((C), TRUE, (WILD_OK), FSRTL_NTFS_STREAM_LEGAL) \ -) - -#define FsRtlIsAnsiCharacterLegal(C,FLAGS) ( \ - FsRtlTestAnsiCharacter((C), TRUE, FALSE, (FLAGS)) \ -) - -#define FsRtlTestAnsiCharacter(C, DEFAULT_RET, WILD_OK, FLAGS) ( \ - ((SCHAR)(C) < 0) ? DEFAULT_RET : \ - FlagOn( LEGAL_ANSI_CHARACTER_ARRAY[(C)], \ - (FLAGS) | \ - ((WILD_OK) ? FSRTL_WILD_CHARACTER : 0) ) \ -) - -#define FsRtlIsLeadDbcsCharacter(DBCS_CHAR) ( \ - (BOOLEAN)((UCHAR)(DBCS_CHAR) < 0x80 ? FALSE : \ - (NLS_MB_CODE_PAGE_TAG && \ - (NLS_OEM_LEAD_BYTE_INFO[(UCHAR)(DBCS_CHAR)] != 0))) \ -) - -#define FsRtlIsUnicodeCharacterWild(C) ( \ - (((C) >= 0x40) ? \ - FALSE : \ - FlagOn(FsRtlLegalAnsiCharacterArray[(C)], FSRTL_WILD_CHARACTER )) \ -) - -#define FsRtlInitPerFileContext( _fc, _owner, _inst, _cb) \ - ((_fc)->OwnerId = (_owner), \ - (_fc)->InstanceId = (_inst), \ - (_fc)->FreeCallback = (_cb)) - -#define FsRtlGetPerFileContextPointer(_fo) \ - (FsRtlSupportsPerFileContexts(_fo) ? \ - FsRtlGetPerStreamContextPointer(_fo)->FileContextSupportPointer : \ - NULL) - -#define FsRtlSupportsPerFileContexts(_fo) \ - ((FsRtlGetPerStreamContextPointer(_fo) != NULL) && \ - (FsRtlGetPerStreamContextPointer(_fo)->Version >= FSRTL_FCB_HEADER_V1) && \ - (FsRtlGetPerStreamContextPointer(_fo)->FileContextSupportPointer != NULL)) - -#define FsRtlSetupAdvancedHeaderEx( _advhdr, _fmutx, _fctxptr ) \ -{ \ - FsRtlSetupAdvancedHeader( _advhdr, _fmutx ); \ - if ((_fctxptr) != NULL) { \ - (_advhdr)->FileContextSupportPointer = (_fctxptr); \ - } \ -} - -#define FsRtlGetPerStreamContextPointer(FO) ( \ - (PFSRTL_ADVANCED_FCB_HEADER)(FO)->FsContext \ -) - -#define FsRtlInitPerStreamContext(PSC, O, I, FC) ( \ - (PSC)->OwnerId = (O), \ - (PSC)->InstanceId = (I), \ - (PSC)->FreeCallback = (FC) \ -) - -#define FsRtlSupportsPerStreamContexts(FO) ( \ - (BOOLEAN)((NULL != FsRtlGetPerStreamContextPointer(FO) && \ - FlagOn(FsRtlGetPerStreamContextPointer(FO)->Flags2, \ - FSRTL_FLAG2_SUPPORTS_FILTER_CONTEXTS)) \ -) - -#define FsRtlLookupPerStreamContext(_sc, _oid, _iid) \ - (((NULL != (_sc)) && \ - FlagOn((_sc)->Flags2,FSRTL_FLAG2_SUPPORTS_FILTER_CONTEXTS) && \ - !IsListEmpty(&(_sc)->FilterContexts)) ? \ - FsRtlLookupPerStreamContextInternal((_sc), (_oid), (_iid)) : \ - NULL) - -VOID -FORCEINLINE -NTAPI -FsRtlSetupAdvancedHeader( - IN PVOID AdvHdr, - IN PFAST_MUTEX FMutex ) -{ - PFSRTL_ADVANCED_FCB_HEADER localAdvHdr = (PFSRTL_ADVANCED_FCB_HEADER)AdvHdr; - - localAdvHdr->Flags |= FSRTL_FLAG_ADVANCED_HEADER; - localAdvHdr->Flags2 |= FSRTL_FLAG2_SUPPORTS_FILTER_CONTEXTS; -#if (NTDDI_VERSION >= NTDDI_VISTA) - localAdvHdr->Version = FSRTL_FCB_HEADER_V1; -#else - localAdvHdr->Version = FSRTL_FCB_HEADER_V0; -#endif - InitializeListHead( &localAdvHdr->FilterContexts ); - if (FMutex != NULL) { - localAdvHdr->FastMutex = FMutex; - } -#if (NTDDI_VERSION >= NTDDI_VISTA) - *((PULONG_PTR)(&localAdvHdr->PushLock)) = 0; - localAdvHdr->FileContextSupportPointer = NULL; -#endif -} - -#define FsRtlInitPerFileObjectContext(_fc, _owner, _inst) \ - ((_fc)->OwnerId = (_owner), (_fc)->InstanceId = (_inst)) - -#define FsRtlCompleteRequest(IRP,STATUS) { \ - (IRP)->IoStatus.Status = (STATUS); \ - IoCompleteRequest( (IRP), IO_DISK_INCREMENT ); \ -} - -#if (NTDDI_VERSION >= NTDDI_WIN7) -typedef struct _ECP_HEADER ECP_HEADER, *PECP_HEADER; -#endif - -#if (NTDDI_VERSION >= NTDDI_VISTA) - -typedef enum _NETWORK_OPEN_LOCATION_QUALIFIER { - NetworkOpenLocationAny, - NetworkOpenLocationRemote, - NetworkOpenLocationLoopback -} NETWORK_OPEN_LOCATION_QUALIFIER; - -typedef enum _NETWORK_OPEN_INTEGRITY_QUALIFIER { - NetworkOpenIntegrityAny, - NetworkOpenIntegrityNone, - NetworkOpenIntegritySigned, - NetworkOpenIntegrityEncrypted, - NetworkOpenIntegrityMaximum -} NETWORK_OPEN_INTEGRITY_QUALIFIER; - -#if (NTDDI_VERSION >= NTDDI_WIN7) - -#define NETWORK_OPEN_ECP_IN_FLAG_DISABLE_HANDLE_COLLAPSING 0x1 -#define NETWORK_OPEN_ECP_IN_FLAG_DISABLE_HANDLE_DURABILITY 0x2 -#define NETWORK_OPEN_ECP_IN_FLAG_FORCE_BUFFERED_SYNCHRONOUS_IO_HACK 0x80000000 - -typedef struct _NETWORK_OPEN_ECP_CONTEXT { - USHORT Size; - USHORT Reserved; - struct { - struct { - NETWORK_OPEN_LOCATION_QUALIFIER Location; - NETWORK_OPEN_INTEGRITY_QUALIFIER Integrity; - ULONG Flags; - } in; - struct { - NETWORK_OPEN_LOCATION_QUALIFIER Location; - NETWORK_OPEN_INTEGRITY_QUALIFIER Integrity; - ULONG Flags; - } out; - } DUMMYSTRUCTNAME; -} NETWORK_OPEN_ECP_CONTEXT, *PNETWORK_OPEN_ECP_CONTEXT; - -typedef struct _NETWORK_OPEN_ECP_CONTEXT_V0 { - USHORT Size; - USHORT Reserved; - struct { - struct { - NETWORK_OPEN_LOCATION_QUALIFIER Location; - NETWORK_OPEN_INTEGRITY_QUALIFIER Integrity; - } in; - struct { - NETWORK_OPEN_LOCATION_QUALIFIER Location; - NETWORK_OPEN_INTEGRITY_QUALIFIER Integrity; - } out; - } DUMMYSTRUCTNAME; -} NETWORK_OPEN_ECP_CONTEXT_V0, *PNETWORK_OPEN_ECP_CONTEXT_V0; - -#elif (NTDDI_VERSION >= NTDDI_VISTA) -typedef struct _NETWORK_OPEN_ECP_CONTEXT { - USHORT Size; - USHORT Reserved; - struct { - struct { - NETWORK_OPEN_LOCATION_QUALIFIER Location; - NETWORK_OPEN_INTEGRITY_QUALIFIER Integrity; - } in; - struct { - NETWORK_OPEN_LOCATION_QUALIFIER Location; - NETWORK_OPEN_INTEGRITY_QUALIFIER Integrity; - } out; - } DUMMYSTRUCTNAME; -} NETWORK_OPEN_ECP_CONTEXT, *PNETWORK_OPEN_ECP_CONTEXT; -#endif - -DEFINE_GUID(GUID_ECP_NETWORK_OPEN_CONTEXT, 0xc584edbf, 0x00df, 0x4d28, 0xb8, 0x84, 0x35, 0xba, 0xca, 0x89, 0x11, 0xe8 ); - -#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ - - -#if (NTDDI_VERSION >= NTDDI_VISTA) - -typedef struct _PREFETCH_OPEN_ECP_CONTEXT { - PVOID Context; -} PREFETCH_OPEN_ECP_CONTEXT, *PPREFETCH_OPEN_ECP_CONTEXT; - -DEFINE_GUID(GUID_ECP_PREFETCH_OPEN, 0xe1777b21, 0x847e, 0x4837, 0xaa, 0x45, 0x64, 0x16, 0x1d, 0x28, 0x6, 0x55 ); - -#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ - -#if (NTDDI_VERSION >= NTDDI_WIN7) - -DEFINE_GUID (GUID_ECP_NFS_OPEN, 0xf326d30c, 0xe5f8, 0x4fe7, 0xab, 0x74, 0xf5, 0xa3, 0x19, 0x6d, 0x92, 0xdb); -DEFINE_GUID(GUID_ECP_SRV_OPEN, 0xbebfaebc, 0xaabf, 0x489d, 0x9d, 0x2c, 0xe9, 0xe3, 0x61, 0x10, 0x28, 0x53 ); - -typedef struct sockaddr_storage *PSOCKADDR_STORAGE_NFS; - -typedef struct _NFS_OPEN_ECP_CONTEXT { - PUNICODE_STRING ExportAlias; - PSOCKADDR_STORAGE_NFS ClientSocketAddress; -} NFS_OPEN_ECP_CONTEXT, *PNFS_OPEN_ECP_CONTEXT, **PPNFS_OPEN_ECP_CONTEXT; - -typedef struct _SRV_OPEN_ECP_CONTEXT { - PUNICODE_STRING ShareName; - PSOCKADDR_STORAGE_NFS SocketAddress; - BOOLEAN OplockBlockState; - BOOLEAN OplockAppState; - BOOLEAN OplockFinalState; -} SRV_OPEN_ECP_CONTEXT, *PSRV_OPEN_ECP_CONTEXT; - -#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ - -#define VACB_MAPPING_GRANULARITY (0x40000) -#define VACB_OFFSET_SHIFT (18) - -typedef struct _PUBLIC_BCB { - CSHORT NodeTypeCode; - CSHORT NodeByteSize; - ULONG MappedLength; - LARGE_INTEGER MappedFileOffset; -} PUBLIC_BCB, *PPUBLIC_BCB; - -typedef struct _CC_FILE_SIZES { - LARGE_INTEGER AllocationSize; - LARGE_INTEGER FileSize; - LARGE_INTEGER ValidDataLength; -} CC_FILE_SIZES, *PCC_FILE_SIZES; - -typedef BOOLEAN -(NTAPI *PACQUIRE_FOR_LAZY_WRITE) ( - IN PVOID Context, - IN BOOLEAN Wait); - -typedef VOID -(NTAPI *PRELEASE_FROM_LAZY_WRITE) ( - IN PVOID Context); - -typedef BOOLEAN -(NTAPI *PACQUIRE_FOR_READ_AHEAD) ( - IN PVOID Context, - IN BOOLEAN Wait); - -typedef VOID -(NTAPI *PRELEASE_FROM_READ_AHEAD) ( - IN PVOID Context); - -typedef struct _CACHE_MANAGER_CALLBACKS { - PACQUIRE_FOR_LAZY_WRITE AcquireForLazyWrite; - PRELEASE_FROM_LAZY_WRITE ReleaseFromLazyWrite; - PACQUIRE_FOR_READ_AHEAD AcquireForReadAhead; - PRELEASE_FROM_READ_AHEAD ReleaseFromReadAhead; -} CACHE_MANAGER_CALLBACKS, *PCACHE_MANAGER_CALLBACKS; - -typedef struct _CACHE_UNINITIALIZE_EVENT { - struct _CACHE_UNINITIALIZE_EVENT *Next; - KEVENT Event; -} CACHE_UNINITIALIZE_EVENT, *PCACHE_UNINITIALIZE_EVENT; - -typedef VOID -(NTAPI *PDIRTY_PAGE_ROUTINE) ( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN PLARGE_INTEGER OldestLsn, - IN PLARGE_INTEGER NewestLsn, - IN PVOID Context1, - IN PVOID Context2); - -typedef VOID -(NTAPI *PFLUSH_TO_LSN) ( - IN PVOID LogHandle, - IN LARGE_INTEGER Lsn); - -typedef VOID -(NTAPI *PCC_POST_DEFERRED_WRITE) ( - IN PVOID Context1, - IN PVOID Context2); - -#define CcIsFileCached(FO) ( \ - ((FO)->SectionObjectPointer != NULL) && \ - (((PSECTION_OBJECT_POINTERS)(FO)->SectionObjectPointer)->SharedCacheMap != NULL) \ -) - -extern ULONG CcFastMdlReadWait; - -#if (NTDDI_VERSION >= NTDDI_WIN2K) - -NTKERNELAPI -VOID -NTAPI -CcInitializeCacheMap( - IN PFILE_OBJECT FileObject, - IN PCC_FILE_SIZES FileSizes, - IN BOOLEAN PinAccess, - IN PCACHE_MANAGER_CALLBACKS Callbacks, - IN PVOID LazyWriteContext); - -NTKERNELAPI -BOOLEAN -NTAPI -CcUninitializeCacheMap( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER TruncateSize OPTIONAL, - IN PCACHE_UNINITIALIZE_EVENT UninitializeCompleteEvent OPTIONAL); - -NTKERNELAPI -VOID -NTAPI -CcSetFileSizes( - IN PFILE_OBJECT FileObject, - IN PCC_FILE_SIZES FileSizes); - -NTKERNELAPI -VOID -NTAPI -CcSetDirtyPageThreshold( - IN PFILE_OBJECT FileObject, - IN ULONG DirtyPageThreshold); - -NTKERNELAPI -VOID -NTAPI -CcFlushCache( - IN PSECTION_OBJECT_POINTERS SectionObjectPointer, - IN PLARGE_INTEGER FileOffset OPTIONAL, - IN ULONG Length, - OUT PIO_STATUS_BLOCK IoStatus OPTIONAL); - -NTKERNELAPI -LARGE_INTEGER -NTAPI -CcGetFlushedValidData( - IN PSECTION_OBJECT_POINTERS SectionObjectPointer, - IN BOOLEAN BcbListHeld); - -NTKERNELAPI -BOOLEAN -NTAPI -CcZeroData( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER StartOffset, - IN PLARGE_INTEGER EndOffset, - IN BOOLEAN Wait); - -NTKERNELAPI -PVOID -NTAPI -CcRemapBcb( - IN PVOID Bcb); - -NTKERNELAPI -VOID -NTAPI -CcRepinBcb( - IN PVOID Bcb); - -NTKERNELAPI -VOID -NTAPI -CcUnpinRepinnedBcb( - IN PVOID Bcb, - IN BOOLEAN WriteThrough, - OUT PIO_STATUS_BLOCK IoStatus); - -NTKERNELAPI -PFILE_OBJECT -NTAPI -CcGetFileObjectFromSectionPtrs( - IN PSECTION_OBJECT_POINTERS SectionObjectPointer); - -NTKERNELAPI -PFILE_OBJECT -NTAPI -CcGetFileObjectFromBcb( - IN PVOID Bcb); - -NTKERNELAPI -BOOLEAN -NTAPI -CcCanIWrite( - IN PFILE_OBJECT FileObject, - IN ULONG BytesToWrite, - IN BOOLEAN Wait, - IN BOOLEAN Retrying); - -NTKERNELAPI -VOID -NTAPI -CcDeferWrite( - IN PFILE_OBJECT FileObject, - IN PCC_POST_DEFERRED_WRITE PostRoutine, - IN PVOID Context1, - IN PVOID Context2, - IN ULONG BytesToWrite, - IN BOOLEAN Retrying); - -NTKERNELAPI -BOOLEAN -NTAPI -CcCopyRead( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN BOOLEAN Wait, - OUT PVOID Buffer, - OUT PIO_STATUS_BLOCK IoStatus); - -NTKERNELAPI -VOID -NTAPI -CcFastCopyRead( - IN PFILE_OBJECT FileObject, - IN ULONG FileOffset, - IN ULONG Length, - IN ULONG PageCount, - OUT PVOID Buffer, - OUT PIO_STATUS_BLOCK IoStatus); - -NTKERNELAPI -BOOLEAN -NTAPI -CcCopyWrite( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN BOOLEAN Wait, - IN PVOID Buffer); - -NTKERNELAPI -VOID -NTAPI -CcFastCopyWrite( - IN PFILE_OBJECT FileObject, - IN ULONG FileOffset, - IN ULONG Length, - IN PVOID Buffer); - -NTKERNELAPI -VOID -NTAPI -CcMdlRead( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - OUT PMDL *MdlChain, - OUT PIO_STATUS_BLOCK IoStatus); - -NTKERNELAPI -VOID -NTAPI -CcMdlReadComplete( - IN PFILE_OBJECT FileObject, - IN PMDL MdlChain); - -NTKERNELAPI -VOID -NTAPI -CcPrepareMdlWrite( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - OUT PMDL *MdlChain, - OUT PIO_STATUS_BLOCK IoStatus); - -NTKERNELAPI -VOID -NTAPI -CcMdlWriteComplete( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN PMDL MdlChain); - -NTKERNELAPI -VOID -NTAPI -CcScheduleReadAhead( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length); - -NTKERNELAPI -NTSTATUS -NTAPI -CcWaitForCurrentLazyWriterActivity( - VOID); - -NTKERNELAPI -VOID -NTAPI -CcSetReadAheadGranularity( - IN PFILE_OBJECT FileObject, - IN ULONG Granularity); - -NTKERNELAPI -BOOLEAN -NTAPI -CcPinRead( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN ULONG Flags, - OUT PVOID *Bcb, - OUT PVOID *Buffer); - -NTKERNELAPI -BOOLEAN -NTAPI -CcPinMappedData( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN ULONG Flags, - IN OUT PVOID *Bcb); - -NTKERNELAPI -BOOLEAN -NTAPI -CcPreparePinWrite( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN BOOLEAN Zero, - IN ULONG Flags, - OUT PVOID *Bcb, - OUT PVOID *Buffer); - -NTKERNELAPI -VOID -NTAPI -CcSetDirtyPinnedData( - IN PVOID BcbVoid, - IN PLARGE_INTEGER Lsn OPTIONAL); - -NTKERNELAPI -VOID -NTAPI -CcUnpinData( - IN PVOID Bcb); - -NTKERNELAPI -VOID -NTAPI -CcSetBcbOwnerPointer( - IN PVOID Bcb, - IN PVOID OwnerPointer); - -NTKERNELAPI -VOID -NTAPI -CcUnpinDataForThread( - IN PVOID Bcb, - IN ERESOURCE_THREAD ResourceThreadId); - -NTKERNELAPI -VOID -NTAPI -CcSetAdditionalCacheAttributes( - IN PFILE_OBJECT FileObject, - IN BOOLEAN DisableReadAhead, - IN BOOLEAN DisableWriteBehind); - -NTKERNELAPI -BOOLEAN -NTAPI -CcIsThereDirtyData( - IN PVPB Vpb); - -#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ - -#if (NTDDI_VERSION >= NTDDI_WINXP) - -NTKERNELAPI -VOID -NTAPI -CcMdlWriteAbort( - IN PFILE_OBJECT FileObject, - IN PMDL MdlChain); - -NTKERNELAPI -VOID -NTAPI -CcSetLogHandleForFile( - IN PFILE_OBJECT FileObject, - IN PVOID LogHandle, - IN PFLUSH_TO_LSN FlushToLsnRoutine); - -NTKERNELAPI -LARGE_INTEGER -NTAPI -CcGetDirtyPages( - IN PVOID LogHandle, - IN PDIRTY_PAGE_ROUTINE DirtyPageRoutine, - IN PVOID Context1, - IN PVOID Context2); - -#endif - -#if (NTDDI_VERSION >= NTDDI_WINXP) -NTKERNELAPI -BOOLEAN -NTAPI -CcMapData( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN ULONG Flags, - OUT PVOID *Bcb, - OUT PVOID *Buffer); -#elif (NTDDI_VERSION >= NTDDI_WIN2K) -NTKERNELAPI -BOOLEAN -NTAPI -CcMapData( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN BOOLEAN Wait, - OUT PVOID *Bcb, - OUT PVOID *Buffer); -#endif - -#if (NTDDI_VERSION >= NTDDI_VISTA) - -NTKERNELAPI -NTSTATUS -NTAPI -CcSetFileSizesEx( - IN PFILE_OBJECT FileObject, - IN PCC_FILE_SIZES FileSizes); - -NTKERNELAPI -PFILE_OBJECT -NTAPI -CcGetFileObjectFromSectionPtrsRef( - IN PSECTION_OBJECT_POINTERS SectionObjectPointer); - -NTKERNELAPI -VOID -NTAPI -CcSetParallelFlushFile( - IN PFILE_OBJECT FileObject, - IN BOOLEAN EnableParallelFlush); - -NTKERNELAPI -BOOLEAN -CcIsThereDirtyDataEx( - IN PVPB Vpb, - IN PULONG NumberOfDirtyPages OPTIONAL); - -#endif - -#if (NTDDI_VERSION >= NTDDI_WIN7) -NTKERNELAPI -VOID -NTAPI -CcCoherencyFlushAndPurgeCache( - IN PSECTION_OBJECT_POINTERS SectionObjectPointer, - IN PLARGE_INTEGER FileOffset OPTIONAL, - IN ULONG Length, - OUT PIO_STATUS_BLOCK IoStatus, - IN ULONG Flags OPTIONAL); -#endif - -#define CcGetFileSizePointer(FO) ( \ - ((PLARGE_INTEGER)((FO)->SectionObjectPointer->SharedCacheMap) + 1) \ -) - -#define UNINITIALIZE_CACHE_MAPS (1) -#define DO_NOT_RETRY_PURGE (2) -#define DO_NOT_PURGE_DIRTY_PAGES (0x4) - -#define CC_FLUSH_AND_PURGE_NO_PURGE (0x1) - -#if (NTDDI_VERSION >= NTDDI_VISTA) -NTKERNELAPI -BOOLEAN -NTAPI -CcPurgeCacheSection( - IN PSECTION_OBJECT_POINTERS SectionObjectPointer, - IN PLARGE_INTEGER FileOffset OPTIONAL, - IN ULONG Length, - IN ULONG Flags); -#elif (NTDDI_VERSION >= NTDDI_WIN2K) -NTKERNELAPI -BOOLEAN -NTAPI -CcPurgeCacheSection( - IN PSECTION_OBJECT_POINTERS SectionObjectPointer, - IN PLARGE_INTEGER FileOffset OPTIONAL, - IN ULONG Length, - IN BOOLEAN UninitializeCacheMaps); -#endif - -#if (NTDDI_VERSION >= NTDDI_WIN7) -NTKERNELAPI -BOOLEAN -NTAPI -CcCopyWriteWontFlush( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length); -#else -#define CcCopyWriteWontFlush(FO, FOFF, LEN) ((LEN) <= 0x10000) -#endif - -#define CcReadAhead(FO, FOFF, LEN) ( \ - if ((LEN) >= 256) { \ - CcScheduleReadAhead((FO), (FOFF), (LEN)); \ - } \ -) - -#define PIN_WAIT (1) -#define PIN_EXCLUSIVE (2) -#define PIN_NO_READ (4) -#define PIN_IF_BCB (8) -#define PIN_CALLER_TRACKS_DIRTY_DATA (32) -#define PIN_HIGH_PRIORITY (64) - -#define MAP_WAIT 1 -#define MAP_NO_READ (16) -#define MAP_HIGH_PRIORITY (64) - -#define IOCTL_REDIR_QUERY_PATH CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 99, METHOD_NEITHER, FILE_ANY_ACCESS) -#define IOCTL_REDIR_QUERY_PATH_EX CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 100, METHOD_NEITHER, FILE_ANY_ACCESS) - -typedef struct _QUERY_PATH_REQUEST { - ULONG PathNameLength; - PIO_SECURITY_CONTEXT SecurityContext; - WCHAR FilePathName[1]; -} QUERY_PATH_REQUEST, *PQUERY_PATH_REQUEST; - -typedef struct _QUERY_PATH_REQUEST_EX { - PIO_SECURITY_CONTEXT pSecurityContext; - ULONG EaLength; - PVOID pEaBuffer; - UNICODE_STRING PathName; - UNICODE_STRING DomainServiceName; - ULONG_PTR Reserved[ 3 ]; -} QUERY_PATH_REQUEST_EX, *PQUERY_PATH_REQUEST_EX; - -typedef struct _QUERY_PATH_RESPONSE { - ULONG LengthAccepted; -} QUERY_PATH_RESPONSE, *PQUERY_PATH_RESPONSE; - -#define VOLSNAPCONTROLTYPE 0x00000053 -#define IOCTL_VOLSNAP_FLUSH_AND_HOLD_WRITES CTL_CODE(VOLSNAPCONTROLTYPE, 0, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) - -#if (NTDDI_VERSION >= NTDDI_WIN2K) - -NTSYSAPI -NTSTATUS -NTAPI -ZwQueryObject( - IN HANDLE Handle OPTIONAL, - IN OBJECT_INFORMATION_CLASS ObjectInformationClass, - OUT PVOID ObjectInformation OPTIONAL, - IN ULONG ObjectInformationLength, - OUT PULONG ReturnLength OPTIONAL); - -NTSYSAPI -NTSTATUS -NTAPI -ZwNotifyChangeKey( - IN HANDLE KeyHandle, - IN HANDLE EventHandle OPTIONAL, - IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, - IN PVOID ApcContext OPTIONAL, - OUT PIO_STATUS_BLOCK IoStatusBlock, - IN ULONG NotifyFilter, - IN BOOLEAN WatchSubtree, - OUT PVOID Buffer, - IN ULONG BufferLength, - IN BOOLEAN Asynchronous); - -NTSYSAPI -NTSTATUS -NTAPI -ZwCreateEvent( - OUT PHANDLE EventHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, - IN EVENT_TYPE EventType, - IN BOOLEAN InitialState); - -NTSYSAPI -NTSTATUS -NTAPI -ZwDeleteFile( - IN POBJECT_ATTRIBUTES ObjectAttributes); - -NTSYSAPI -NTSTATUS -NTAPI -ZwQueryDirectoryFile( - IN HANDLE FileHandle, - IN HANDLE Event OPTIONAL, - IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, - IN PVOID ApcContext OPTIONAL, - OUT PIO_STATUS_BLOCK IoStatusBlock, - OUT PVOID FileInformation, - IN ULONG Length, - IN FILE_INFORMATION_CLASS FileInformationClass, - IN BOOLEAN ReturnSingleEntry, - IN PUNICODE_STRING FileName OPTIONAL, - IN BOOLEAN RestartScan); - -NTSYSAPI -NTSTATUS -NTAPI -ZwSetVolumeInformationFile( - IN HANDLE FileHandle, - OUT PIO_STATUS_BLOCK IoStatusBlock, - IN PVOID FsInformation, - IN ULONG Length, - IN FS_INFORMATION_CLASS FsInformationClass); - -NTSYSAPI -NTSTATUS -NTAPI -ZwFsControlFile( - IN HANDLE FileHandle, - IN HANDLE Event OPTIONAL, - IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, - IN PVOID ApcContext OPTIONAL, - OUT PIO_STATUS_BLOCK IoStatusBlock, - IN ULONG FsControlCode, - IN PVOID InputBuffer OPTIONAL, - IN ULONG InputBufferLength, - OUT PVOID OutputBuffer OPTIONAL, - IN ULONG OutputBufferLength); - -NTSYSAPI -NTSTATUS -NTAPI -ZwDuplicateObject( - IN HANDLE SourceProcessHandle, - IN HANDLE SourceHandle, - IN HANDLE TargetProcessHandle OPTIONAL, - OUT PHANDLE TargetHandle OPTIONAL, - IN ACCESS_MASK DesiredAccess, - IN ULONG HandleAttributes, - IN ULONG Options); - -NTSYSAPI -NTSTATUS -NTAPI -ZwOpenDirectoryObject( - OUT PHANDLE DirectoryHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes); - -NTSYSAPI -NTSTATUS -NTAPI -ZwAllocateVirtualMemory( - IN HANDLE ProcessHandle, - IN OUT PVOID *BaseAddress, - IN ULONG_PTR ZeroBits, - IN OUT PSIZE_T RegionSize, - IN ULONG AllocationType, - IN ULONG Protect); - -NTSYSAPI -NTSTATUS -NTAPI -ZwFreeVirtualMemory( - IN HANDLE ProcessHandle, - IN OUT PVOID *BaseAddress, - IN OUT PSIZE_T RegionSize, - IN ULONG FreeType); - -NTSYSAPI -NTSTATUS -NTAPI -ZwWaitForSingleObject( - IN HANDLE Handle, - IN BOOLEAN Alertable, - IN PLARGE_INTEGER Timeout OPTIONAL); - -NTSYSAPI -NTSTATUS -NTAPI -ZwSetEvent( - IN HANDLE EventHandle, - OUT PLONG PreviousState OPTIONAL); - -NTSYSAPI -NTSTATUS -NTAPI -ZwFlushVirtualMemory( - IN HANDLE ProcessHandle, - IN OUT PVOID *BaseAddress, - IN OUT PSIZE_T RegionSize, - OUT PIO_STATUS_BLOCK IoStatusBlock); - -NTSYSAPI -NTSTATUS -NTAPI -ZwQueryInformationToken( - IN HANDLE TokenHandle, - IN TOKEN_INFORMATION_CLASS TokenInformationClass, - OUT PVOID TokenInformation, - IN ULONG Length, - OUT PULONG ResultLength); - -NTSYSAPI -NTSTATUS -NTAPI -ZwSetSecurityObject( - IN HANDLE Handle, - IN SECURITY_INFORMATION SecurityInformation, - IN PSECURITY_DESCRIPTOR SecurityDescriptor); - -NTSYSAPI -NTSTATUS -NTAPI -ZwQuerySecurityObject( - IN HANDLE FileHandle, - IN SECURITY_INFORMATION SecurityInformation, - OUT PSECURITY_DESCRIPTOR SecurityDescriptor, - IN ULONG Length, - OUT PULONG ResultLength); - -#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ - -#if (NTDDI_VERSION >= NTDDI_WINXP) - -NTSYSAPI -NTSTATUS -NTAPI -ZwOpenProcessTokenEx( - IN HANDLE ProcessHandle, - IN ACCESS_MASK DesiredAccess, - IN ULONG HandleAttributes, - OUT PHANDLE TokenHandle); - -NTSYSAPI -NTSTATUS -NTAPI -ZwOpenThreadTokenEx( - IN HANDLE ThreadHandle, - IN ACCESS_MASK DesiredAccess, - IN BOOLEAN OpenAsSelf, - IN ULONG HandleAttributes, - OUT PHANDLE TokenHandle); - -#endif - -#if (NTDDI_VERSION >= NTDDI_VISTA) - -NTSYSAPI -NTSTATUS -NTAPI -ZwLockFile( - IN HANDLE FileHandle, - IN HANDLE Event OPTIONAL, - IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, - IN PVOID ApcContext OPTIONAL, - OUT PIO_STATUS_BLOCK IoStatusBlock, - IN PLARGE_INTEGER ByteOffset, - IN PLARGE_INTEGER Length, - IN ULONG Key, - IN BOOLEAN FailImmediately, - IN BOOLEAN ExclusiveLock); - -NTSYSAPI -NTSTATUS -NTAPI -ZwUnlockFile( - IN HANDLE FileHandle, - OUT PIO_STATUS_BLOCK IoStatusBlock, - IN PLARGE_INTEGER ByteOffset, - IN PLARGE_INTEGER Length, - IN ULONG Key); - -NTSYSAPI -NTSTATUS -NTAPI -ZwQueryQuotaInformationFile( - IN HANDLE FileHandle, - OUT PIO_STATUS_BLOCK IoStatusBlock, - OUT PVOID Buffer, - IN ULONG Length, - IN BOOLEAN ReturnSingleEntry, - IN PVOID SidList, - IN ULONG SidListLength, - IN PSID StartSid OPTIONAL, - IN BOOLEAN RestartScan); - -NTSYSAPI -NTSTATUS -NTAPI -ZwSetQuotaInformationFile( - IN HANDLE FileHandle, - OUT PIO_STATUS_BLOCK IoStatusBlock, - IN PVOID Buffer, - IN ULONG Length); - -NTSYSAPI -NTSTATUS -NTAPI -ZwFlushBuffersFile( - IN HANDLE FileHandle, - OUT PIO_STATUS_BLOCK IoStatusBlock); - -#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ - -#if (NTDDI_VERSION >= NTDDI_WIN7) -NTSYSAPI -NTSTATUS -NTAPI -ZwSetInformationToken( - IN HANDLE TokenHandle, - IN TOKEN_INFORMATION_CLASS TokenInformationClass, - IN PVOID TokenInformation, - IN ULONG TokenInformationLength); -#endif - -NTSYSAPI -NTSTATUS -NTAPI -ZwQueryEaFile( - IN HANDLE FileHandle, - OUT PIO_STATUS_BLOCK IoStatusBlock, - OUT PVOID Buffer, - IN ULONG Length, - IN BOOLEAN ReturnSingleEntry, - IN PVOID EaList OPTIONAL, - IN ULONG EaListLength, - IN PULONG EaIndex OPTIONAL, - IN BOOLEAN RestartScan); - -NTSYSAPI -NTSTATUS -NTAPI -ZwSetEaFile( - IN HANDLE FileHandle, - OUT PIO_STATUS_BLOCK IoStatusBlock, - OUT PVOID Buffer, - IN ULONG Length); - -NTSYSAPI -NTSTATUS -NTAPI -ZwDuplicateToken( - IN HANDLE ExistingTokenHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes, - IN BOOLEAN EffectiveOnly, - IN TOKEN_TYPE TokenType, - OUT PHANDLE NewTokenHandle); #pragma pack(push,4) @@ -8890,6 +6863,11 @@ ZwDuplicateToken( #include "csq.h" +#ifdef _NTOSKRNL_ +extern PUCHAR FsRtlLegalAnsiCharacterArray; +#else +extern DECLSPEC_IMPORT PUCHAR FsRtlLegalAnsiCharacterArray; +#endif extern PACL SePublicDefaultDacl; extern PACL SeSystemDefaultDacl; @@ -8912,11 +6890,30 @@ extern PACL SeSystemDefaultDacl; #define FILE_VC_QUOTAS_LOG_VIOLATIONS 0x00000004 +#define FSRTL_VOLUME_DISMOUNT 1 +#define FSRTL_VOLUME_DISMOUNT_FAILED 2 +#define FSRTL_VOLUME_LOCK 3 +#define FSRTL_VOLUME_LOCK_FAILED 4 +#define FSRTL_VOLUME_UNLOCK 5 +#define FSRTL_VOLUME_MOUNT 6 + +#define FSRTL_WILD_CHARACTER 0x08 + +#define FSRTL_FAT_LEGAL 0x01 +#define FSRTL_HPFS_LEGAL 0x02 +#define FSRTL_NTFS_LEGAL 0x04 +#define FSRTL_WILD_CHARACTER 0x08 +#define FSRTL_OLE_LEGAL 0x10 +#define FSRTL_NTFS_STREAM_LEGAL 0x14 + #ifdef _X86_ #define HARDWARE_PTE HARDWARE_PTE_X86 #define PHARDWARE_PTE PHARDWARE_PTE_X86 #endif +#define IO_CHECK_CREATE_PARAMETERS 0x0200 +#define IO_ATTACH_DEVICE 0x0400 + #define IO_ATTACH_DEVICE_API 0x80000000 #define IO_TYPE_APC 18 @@ -8935,6 +6932,8 @@ extern PACL SeSystemDefaultDacl; #define MEM_DOS_LIM 0x40000000 +#define MCB_FLAG_RAISE_ON_ALLOCATION_FAILURE 1 + #define OB_TYPE_TYPE 1 #define OB_TYPE_DIRECTORY 2 #define OB_TYPE_SYMBOLIC_LINK 3 @@ -8959,12 +6958,23 @@ extern PACL SeSystemDefaultDacl; #define OB_TYPE_IO_COMPLETION 22 #define OB_TYPE_FILE 23 +#define PIN_WAIT (1) +#define PIN_EXCLUSIVE (2) +#define PIN_NO_READ (4) +#define PIN_IF_BCB (8) + #define SEC_BASED 0x00200000 +#define SECURITY_WORLD_SID_AUTHORITY {0,0,0,0,0,1} +#define SECURITY_WORLD_RID (0x00000000L) + /* end winnt.h */ #define TOKEN_HAS_ADMIN_GROUP 0x08 +#define VACB_MAPPING_GRANULARITY (0x40000) +#define VACB_OFFSET_SHIFT (18) + #if (VER_PRODUCTBUILD >= 1381) #define FSCTL_GET_HFS_INFORMATION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 31, METHOD_BUFFERED, FILE_ANY_ACCESS) #endif /* (VER_PRODUCTBUILD >= 1381) */ @@ -8991,6 +7001,18 @@ extern PACL SeSystemDefaultDacl; #define FSCTL_NETWORK_SET_DOMAIN_NAME CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 120, METHOD_BUFFERED, FILE_ANY_ACCESS) #define FSCTL_NETWORK_REMOTE_BOOT_INIT_SCRT CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 250, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_REDIR_QUERY_PATH CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 99, METHOD_NEITHER, FILE_ANY_ACCESS) + +typedef PVOID OPLOCK, *POPLOCK; + +// +// Forwarders +// +struct _RTL_AVL_TABLE; +struct _RTL_GENERIC_TABLE; + +typedef PVOID PNOTIFY_SYNC; + typedef enum _FILE_STORAGE_TYPE { StorageTypeDefault = 1, StorageTypeDirectory, @@ -9026,6 +7048,17 @@ typedef struct _BITMAP_RANGE { PULONG Bitmap; } BITMAP_RANGE, *PBITMAP_RANGE; +typedef struct _CACHE_UNINITIALIZE_EVENT { + struct _CACHE_UNINITIALIZE_EVENT *Next; + KEVENT Event; +} CACHE_UNINITIALIZE_EVENT, *PCACHE_UNINITIALIZE_EVENT; + +typedef struct _CC_FILE_SIZES { + LARGE_INTEGER AllocationSize; + LARGE_INTEGER FileSize; + LARGE_INTEGER ValidDataLength; +} CC_FILE_SIZES, *PCC_FILE_SIZES; + typedef struct _FILE_COPY_ON_WRITE_INFORMATION { BOOLEAN ReplaceIfExists; HANDLE RootDirectory; @@ -9048,6 +7081,49 @@ typedef struct _FILE_FULL_DIRECTORY_INFORMATION { WCHAR FileName[ANYSIZE_ARRAY]; } FILE_FULL_DIRECTORY_INFORMATION, *PFILE_FULL_DIRECTORY_INFORMATION; +typedef struct _FILE_FS_FULL_SIZE_INFORMATION { + LARGE_INTEGER TotalAllocationUnits; + LARGE_INTEGER CallerAvailableAllocationUnits; + LARGE_INTEGER ActualAvailableAllocationUnits; + ULONG SectorsPerAllocationUnit; + ULONG BytesPerSector; +} FILE_FS_FULL_SIZE_INFORMATION, *PFILE_FS_FULL_SIZE_INFORMATION; + +typedef struct _FILE_FS_LABEL_INFORMATION { + ULONG VolumeLabelLength; + WCHAR VolumeLabel[1]; +} FILE_FS_LABEL_INFORMATION, *PFILE_FS_LABEL_INFORMATION; + +#if (VER_PRODUCTBUILD >= 2195) + +typedef struct _FILE_FS_OBJECT_ID_INFORMATION { + UCHAR ObjectId[16]; + UCHAR ExtendedInfo[48]; +} FILE_FS_OBJECT_ID_INFORMATION, *PFILE_FS_OBJECT_ID_INFORMATION; + +#endif /* (VER_PRODUCTBUILD >= 2195) */ + +typedef struct _FILE_FS_SIZE_INFORMATION { + LARGE_INTEGER TotalAllocationUnits; + LARGE_INTEGER AvailableAllocationUnits; + ULONG SectorsPerAllocationUnit; + ULONG BytesPerSector; +} FILE_FS_SIZE_INFORMATION, *PFILE_FS_SIZE_INFORMATION; + +typedef struct _FILE_FS_VOLUME_INFORMATION { + LARGE_INTEGER VolumeCreationTime; + ULONG VolumeSerialNumber; + ULONG VolumeLabelLength; + BOOLEAN SupportsObjects; + WCHAR VolumeLabel[1]; +} FILE_FS_VOLUME_INFORMATION, *PFILE_FS_VOLUME_INFORMATION; + +typedef struct _FILE_FS_OBJECTID_INFORMATION +{ + UCHAR ObjectId[16]; + UCHAR ExtendedInfo[48]; +} FILE_FS_OBJECTID_INFORMATION, *PFILE_FS_OBJECTID_INFORMATION; + /* raw internal file lock struct returned from FsRtlGetNextFileLock */ typedef struct _FILE_SHARED_LOCK_ENTRY { PVOID Unknown1; @@ -9132,6 +7208,51 @@ typedef struct _FILE_OLE_STATE_BITS_INFORMATION { ULONG StateBitsMask; } FILE_OLE_STATE_BITS_INFORMATION, *PFILE_OLE_STATE_BITS_INFORMATION; +typedef enum _FSRTL_COMPARISON_RESULT +{ + LessThan = -1, + EqualTo = 0, + GreaterThan = 1 +} FSRTL_COMPARISON_RESULT; + +#if (VER_PRODUCTBUILD >= 2600) + +typedef struct _FSRTL_PER_STREAM_CONTEXT { + LIST_ENTRY Links; + PVOID OwnerId; + PVOID InstanceId; + PFREE_FUNCTION FreeCallback; +} FSRTL_PER_STREAM_CONTEXT, *PFSRTL_PER_STREAM_CONTEXT; + +typedef struct _FSRTL_PER_FILEOBJECT_CONTEXT +{ + LIST_ENTRY Links; + PVOID OwnerId; + PVOID InstanceId; +} FSRTL_PER_FILEOBJECT_CONTEXT, *PFSRTL_PER_FILEOBJECT_CONTEXT; + +#endif /* (VER_PRODUCTBUILD >= 2600) */ + +typedef struct _BASE_MCB +{ + ULONG MaximumPairCount; + ULONG PairCount; + USHORT PoolType; + USHORT Flags; + PVOID Mapping; +} BASE_MCB, *PBASE_MCB; + +typedef struct _LARGE_MCB +{ + PKGUARDED_MUTEX GuardedMutex; + BASE_MCB BaseMcb; +} LARGE_MCB, *PLARGE_MCB; + +typedef struct _MCB +{ + LARGE_MCB DummyFieldThatSizesThisStructureCorrectly; +} MCB, *PMCB; + typedef struct _MAPPING_PAIR { ULONGLONG Vcn; ULONGLONG Lcn; @@ -9143,6 +7264,8 @@ typedef struct _GET_RETRIEVAL_DESCRIPTOR { MAPPING_PAIR Pair[1]; } GET_RETRIEVAL_DESCRIPTOR, *PGET_RETRIEVAL_DESCRIPTOR; +#define ASSERT_QUEUE(Q) ASSERT(((Q)->Header.Type & KOBJECT_TYPE_MASK) == QueueObject); + typedef struct _MBCB { CSHORT NodeTypeCode; CSHORT NodeIsInZone; @@ -9205,6 +7328,189 @@ typedef struct _OBJECT_ALL_TYPES_INFO { OBJECT_TYPE_INFO ObjectsTypeInfo[1]; } OBJECT_ALL_TYPES_INFO, *POBJECT_ALL_TYPES_INFO; +typedef enum _RTL_GENERIC_COMPARE_RESULTS +{ + GenericLessThan, + GenericGreaterThan, + GenericEqual +} RTL_GENERIC_COMPARE_RESULTS; + +typedef enum _TABLE_SEARCH_RESULT +{ + TableEmptyTree, + TableFoundNode, + TableInsertAsLeft, + TableInsertAsRight +} TABLE_SEARCH_RESULT; + +typedef NTSTATUS +(NTAPI *PRTL_AVL_MATCH_FUNCTION)( + struct _RTL_AVL_TABLE *Table, + PVOID UserData, + PVOID MatchData +); + +typedef RTL_GENERIC_COMPARE_RESULTS +(NTAPI *PRTL_AVL_COMPARE_ROUTINE) ( + struct _RTL_AVL_TABLE *Table, + PVOID FirstStruct, + PVOID SecondStruct +); + +typedef RTL_GENERIC_COMPARE_RESULTS +(NTAPI *PRTL_GENERIC_COMPARE_ROUTINE) ( + struct _RTL_GENERIC_TABLE *Table, + PVOID FirstStruct, + PVOID SecondStruct +); + +typedef PVOID +(NTAPI *PRTL_GENERIC_ALLOCATE_ROUTINE) ( + struct _RTL_GENERIC_TABLE *Table, + CLONG ByteSize +); + +typedef VOID +(NTAPI *PRTL_GENERIC_FREE_ROUTINE) ( + struct _RTL_GENERIC_TABLE *Table, + PVOID Buffer +); + +typedef PVOID +(NTAPI *PRTL_AVL_ALLOCATE_ROUTINE) ( + struct _RTL_AVL_TABLE *Table, + CLONG ByteSize +); + +typedef VOID +(NTAPI *PRTL_AVL_FREE_ROUTINE) ( + struct _RTL_AVL_TABLE *Table, + PVOID Buffer +); + +typedef struct _PUBLIC_BCB { + CSHORT NodeTypeCode; + CSHORT NodeByteSize; + ULONG MappedLength; + LARGE_INTEGER MappedFileOffset; +} PUBLIC_BCB, *PPUBLIC_BCB; + +typedef struct _QUERY_PATH_REQUEST { + ULONG PathNameLength; + PIO_SECURITY_CONTEXT SecurityContext; + WCHAR FilePathName[1]; +} QUERY_PATH_REQUEST, *PQUERY_PATH_REQUEST; + +typedef struct _QUERY_PATH_RESPONSE { + ULONG LengthAccepted; +} QUERY_PATH_RESPONSE, *PQUERY_PATH_RESPONSE; + +typedef struct _RTL_BALANCED_LINKS +{ + struct _RTL_BALANCED_LINKS *Parent; + struct _RTL_BALANCED_LINKS *LeftChild; + struct _RTL_BALANCED_LINKS *RightChild; + CHAR Balance; + UCHAR Reserved[3]; +} RTL_BALANCED_LINKS, *PRTL_BALANCED_LINKS; + +typedef struct _RTL_GENERIC_TABLE +{ + PRTL_SPLAY_LINKS TableRoot; + LIST_ENTRY InsertOrderList; + PLIST_ENTRY OrderedPointer; + ULONG WhichOrderedElement; + ULONG NumberGenericTableElements; + PRTL_GENERIC_COMPARE_ROUTINE CompareRoutine; + PRTL_GENERIC_ALLOCATE_ROUTINE AllocateRoutine; + PRTL_GENERIC_FREE_ROUTINE FreeRoutine; + PVOID TableContext; +} RTL_GENERIC_TABLE, *PRTL_GENERIC_TABLE; + +#undef PRTL_GENERIC_COMPARE_ROUTINE +#undef PRTL_GENERIC_ALLOCATE_ROUTINE +#undef PRTL_GENERIC_FREE_ROUTINE +#undef RTL_GENERIC_TABLE +#undef PRTL_GENERIC_TABLE + +#define PRTL_GENERIC_COMPARE_ROUTINE PRTL_AVL_COMPARE_ROUTINE +#define PRTL_GENERIC_ALLOCATE_ROUTINE PRTL_AVL_ALLOCATE_ROUTINE +#define PRTL_GENERIC_FREE_ROUTINE PRTL_AVL_FREE_ROUTINE +#define RTL_GENERIC_TABLE RTL_AVL_TABLE +#define PRTL_GENERIC_TABLE PRTL_AVL_TABLE + +#define RtlInitializeGenericTable RtlInitializeGenericTableAvl +#define RtlInsertElementGenericTable RtlInsertElementGenericTableAvl +#define RtlInsertElementGenericTableFull RtlInsertElementGenericTableFullAvl +#define RtlDeleteElementGenericTable RtlDeleteElementGenericTableAvl +#define RtlLookupElementGenericTable RtlLookupElementGenericTableAvl +#define RtlLookupElementGenericTableFull RtlLookupElementGenericTableFullAvl +#define RtlEnumerateGenericTable RtlEnumerateGenericTableAvl +#define RtlEnumerateGenericTableWithoutSplaying RtlEnumerateGenericTableWithoutSplayingAvl +#define RtlGetElementGenericTable RtlGetElementGenericTableAvl +#define RtlNumberGenericTableElements RtlNumberGenericTableElementsAvl +#define RtlIsGenericTableEmpty RtlIsGenericTableEmptyAvl + +typedef struct _RTL_AVL_TABLE +{ + RTL_BALANCED_LINKS BalancedRoot; + PVOID OrderedPointer; + ULONG WhichOrderedElement; + ULONG NumberGenericTableElements; + ULONG DepthOfTree; + PRTL_BALANCED_LINKS RestartKey; + ULONG DeleteCount; + PRTL_AVL_COMPARE_ROUTINE CompareRoutine; + PRTL_AVL_ALLOCATE_ROUTINE AllocateRoutine; + PRTL_AVL_FREE_ROUTINE FreeRoutine; + PVOID TableContext; +} RTL_AVL_TABLE, *PRTL_AVL_TABLE; + +NTSYSAPI +VOID +NTAPI +RtlInitializeGenericTableAvl( + PRTL_AVL_TABLE Table, + PRTL_AVL_COMPARE_ROUTINE CompareRoutine, + PRTL_AVL_ALLOCATE_ROUTINE AllocateRoutine, + PRTL_AVL_FREE_ROUTINE FreeRoutine, + PVOID TableContext +); + +NTSYSAPI +PVOID +NTAPI +RtlInsertElementGenericTableAvl ( + PRTL_AVL_TABLE Table, + PVOID Buffer, + CLONG BufferSize, + PBOOLEAN NewElement OPTIONAL + ); + +NTSYSAPI +BOOLEAN +NTAPI +RtlDeleteElementGenericTableAvl ( + PRTL_AVL_TABLE Table, + PVOID Buffer + ); + +NTSYSAPI +PVOID +NTAPI +RtlLookupElementGenericTableAvl ( + PRTL_AVL_TABLE Table, + PVOID Buffer + ); + +NTSYSAPI +PVOID +NTAPI +RtlEnumerateGenericTableWithoutSplayingAvl ( + PRTL_AVL_TABLE Table, + PVOID *RestartKey + ); + #if defined(USE_LPC6432) #define LPC_CLIENT_ID CLIENT_ID64 #define LPC_SIZE_T ULONGLONG @@ -9269,6 +7575,13 @@ typedef struct _REMOTE_PORT_VIEW LPC_PVOID ViewBase; } REMOTE_PORT_VIEW, *PREMOTE_PORT_VIEW; +typedef struct _TUNNEL { + FAST_MUTEX Mutex; + PRTL_SPLAY_LINKS Cache; + LIST_ENTRY TimerQueue; + USHORT NumEntries; +} TUNNEL, *PTUNNEL; + typedef struct _VAD_HEADER { PVOID StartVPN; PVOID EndVPN; @@ -9283,6 +7596,150 @@ typedef struct _VAD_HEADER { LIST_ENTRY Secured; } VAD_HEADER, *PVAD_HEADER; +#if (VER_PRODUCTBUILD >= 2600) + +typedef BOOLEAN +(NTAPI *PFILTER_REPORT_CHANGE) ( + IN PVOID NotifyContext, + IN PVOID FilterContext +); + +#endif + +NTKERNELAPI +BOOLEAN +NTAPI +CcCanIWrite ( + IN PFILE_OBJECT FileObject, + IN ULONG BytesToWrite, + IN BOOLEAN Wait, + IN BOOLEAN Retrying +); + +NTKERNELAPI +BOOLEAN +NTAPI +CcCopyRead ( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + IN BOOLEAN Wait, + OUT PVOID Buffer, + OUT PIO_STATUS_BLOCK IoStatus +); + +NTKERNELAPI +BOOLEAN +NTAPI +CcCopyWrite ( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + IN BOOLEAN Wait, + IN PVOID Buffer +); + +#define CcCopyWriteWontFlush(FO, FOFF, LEN) ((LEN) <= 0x10000) + +typedef VOID (NTAPI *PCC_POST_DEFERRED_WRITE) ( + IN PVOID Context1, + IN PVOID Context2 +); + +NTKERNELAPI +VOID +NTAPI +CcDeferWrite ( + IN PFILE_OBJECT FileObject, + IN PCC_POST_DEFERRED_WRITE PostRoutine, + IN PVOID Context1, + IN PVOID Context2, + IN ULONG BytesToWrite, + IN BOOLEAN Retrying +); + +NTKERNELAPI +VOID +NTAPI +CcFastCopyRead ( + IN PFILE_OBJECT FileObject, + IN ULONG FileOffset, + IN ULONG Length, + IN ULONG PageCount, + OUT PVOID Buffer, + OUT PIO_STATUS_BLOCK IoStatus +); + +NTKERNELAPI +VOID +NTAPI +CcFastCopyWrite ( + IN PFILE_OBJECT FileObject, + IN ULONG FileOffset, + IN ULONG Length, + IN PVOID Buffer +); + +NTKERNELAPI +VOID +NTAPI +CcFlushCache ( + IN PSECTION_OBJECT_POINTERS SectionObjectPointer, + IN PLARGE_INTEGER FileOffset OPTIONAL, + IN ULONG Length, + OUT PIO_STATUS_BLOCK IoStatus OPTIONAL +); + +typedef VOID (NTAPI *PDIRTY_PAGE_ROUTINE) ( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + IN PLARGE_INTEGER OldestLsn, + IN PLARGE_INTEGER NewestLsn, + IN PVOID Context1, + IN PVOID Context2 +); + +NTKERNELAPI +LARGE_INTEGER +NTAPI +CcGetDirtyPages ( + IN PVOID LogHandle, + IN PDIRTY_PAGE_ROUTINE DirtyPageRoutine, + IN PVOID Context1, + IN PVOID Context2 +); + +NTKERNELAPI +PFILE_OBJECT +NTAPI +CcGetFileObjectFromBcb ( + IN PVOID Bcb +); + +NTKERNELAPI +PFILE_OBJECT +NTAPI +CcGetFileObjectFromSectionPtrs ( + IN PSECTION_OBJECT_POINTERS SectionObjectPointer +); + +#define CcGetFileSizePointer(FO) ( \ + ((PLARGE_INTEGER)((FO)->SectionObjectPointer->SharedCacheMap) + 1) \ +) + +#if (VER_PRODUCTBUILD >= 2195) + +NTKERNELAPI +LARGE_INTEGER +NTAPI +CcGetFlushedValidData ( + IN PSECTION_OBJECT_POINTERS SectionObjectPointer, + IN BOOLEAN BcbListHeld +); + +#endif /* (VER_PRODUCTBUILD >= 2195) */ + NTKERNELAPI LARGE_INTEGER NTAPI @@ -9291,6 +7748,428 @@ CcGetLsnForFileObject ( OUT PLARGE_INTEGER OldestLsn OPTIONAL ); +typedef BOOLEAN (NTAPI *PACQUIRE_FOR_LAZY_WRITE) ( + IN PVOID Context, + IN BOOLEAN Wait +); + +typedef VOID (NTAPI *PRELEASE_FROM_LAZY_WRITE) ( + IN PVOID Context +); + +typedef BOOLEAN (NTAPI *PACQUIRE_FOR_READ_AHEAD) ( + IN PVOID Context, + IN BOOLEAN Wait +); + +typedef VOID (NTAPI *PRELEASE_FROM_READ_AHEAD) ( + IN PVOID Context +); + +typedef struct _CACHE_MANAGER_CALLBACKS { + PACQUIRE_FOR_LAZY_WRITE AcquireForLazyWrite; + PRELEASE_FROM_LAZY_WRITE ReleaseFromLazyWrite; + PACQUIRE_FOR_READ_AHEAD AcquireForReadAhead; + PRELEASE_FROM_READ_AHEAD ReleaseFromReadAhead; +} CACHE_MANAGER_CALLBACKS, *PCACHE_MANAGER_CALLBACKS; + +NTKERNELAPI +VOID +NTAPI +CcInitializeCacheMap ( + IN PFILE_OBJECT FileObject, + IN PCC_FILE_SIZES FileSizes, + IN BOOLEAN PinAccess, + IN PCACHE_MANAGER_CALLBACKS Callbacks, + IN PVOID LazyWriteContext +); + +#define CcIsFileCached(FO) ( \ + ((FO)->SectionObjectPointer != NULL) && \ + (((PSECTION_OBJECT_POINTERS)(FO)->SectionObjectPointer)->SharedCacheMap != NULL) \ +) + +extern ULONG CcFastMdlReadWait; + +NTKERNELAPI +BOOLEAN +NTAPI +CcIsThereDirtyData ( + IN PVPB Vpb +); + +NTKERNELAPI +BOOLEAN +NTAPI +CcMapData ( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + IN ULONG Flags, + OUT PVOID *Bcb, + OUT PVOID *Buffer +); + +NTKERNELAPI +VOID +NTAPI +CcMdlRead ( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + OUT PMDL *MdlChain, + OUT PIO_STATUS_BLOCK IoStatus +); + +NTKERNELAPI +VOID +NTAPI +CcMdlReadComplete ( + IN PFILE_OBJECT FileObject, + IN PMDL MdlChain +); + +NTKERNELAPI +VOID +NTAPI +CcMdlWriteComplete ( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN PMDL MdlChain +); + +#define MAP_WAIT 1 + +NTKERNELAPI +BOOLEAN +NTAPI +CcPinMappedData ( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + IN ULONG Flags, + IN OUT PVOID *Bcb +); + +NTKERNELAPI +BOOLEAN +NTAPI +CcPinRead ( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + IN ULONG Flags, + OUT PVOID *Bcb, + OUT PVOID *Buffer +); + +NTKERNELAPI +VOID +NTAPI +CcPrepareMdlWrite ( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + OUT PMDL *MdlChain, + OUT PIO_STATUS_BLOCK IoStatus +); + +NTKERNELAPI +BOOLEAN +NTAPI +CcPreparePinWrite ( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + IN BOOLEAN Zero, + IN ULONG Flags, + OUT PVOID *Bcb, + OUT PVOID *Buffer +); + +NTKERNELAPI +BOOLEAN +NTAPI +CcPurgeCacheSection ( + IN PSECTION_OBJECT_POINTERS SectionObjectPointer, + IN PLARGE_INTEGER FileOffset OPTIONAL, + IN ULONG Length, + IN BOOLEAN UninitializeCacheMaps +); + +#define CcReadAhead(FO, FOFF, LEN) ( \ + if ((LEN) >= 256) { \ + CcScheduleReadAhead((FO), (FOFF), (LEN)); \ + } \ +) + +#if (VER_PRODUCTBUILD >= 2195) + +NTKERNELAPI +PVOID +NTAPI +CcRemapBcb ( + IN PVOID Bcb +); + +#endif /* (VER_PRODUCTBUILD >= 2195) */ + +NTKERNELAPI +VOID +NTAPI +CcRepinBcb ( + IN PVOID Bcb +); + +NTKERNELAPI +VOID +NTAPI +CcScheduleReadAhead ( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length +); + +NTKERNELAPI +VOID +NTAPI +CcSetAdditionalCacheAttributes ( + IN PFILE_OBJECT FileObject, + IN BOOLEAN DisableReadAhead, + IN BOOLEAN DisableWriteBehind +); + +NTKERNELAPI +VOID +NTAPI +CcSetBcbOwnerPointer ( + IN PVOID Bcb, + IN PVOID OwnerPointer +); + +NTKERNELAPI +VOID +NTAPI +CcSetDirtyPageThreshold ( + IN PFILE_OBJECT FileObject, + IN ULONG DirtyPageThreshold +); + +NTKERNELAPI +VOID +NTAPI +CcSetDirtyPinnedData ( + IN PVOID BcbVoid, + IN PLARGE_INTEGER Lsn OPTIONAL +); + +NTKERNELAPI +VOID +NTAPI +CcSetFileSizes ( + IN PFILE_OBJECT FileObject, + IN PCC_FILE_SIZES FileSizes +); + +typedef VOID (NTAPI *PFLUSH_TO_LSN) ( + IN PVOID LogHandle, + IN LARGE_INTEGER Lsn +); + +NTKERNELAPI +VOID +NTAPI +CcSetLogHandleForFile ( + IN PFILE_OBJECT FileObject, + IN PVOID LogHandle, + IN PFLUSH_TO_LSN FlushToLsnRoutine +); + +NTKERNELAPI +VOID +NTAPI +CcSetReadAheadGranularity ( + IN PFILE_OBJECT FileObject, + IN ULONG Granularity /* default: PAGE_SIZE */ + /* allowed: 2^n * PAGE_SIZE */ +); + +NTKERNELAPI +BOOLEAN +NTAPI +CcUninitializeCacheMap ( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER TruncateSize OPTIONAL, + IN PCACHE_UNINITIALIZE_EVENT UninitializeCompleteEvent OPTIONAL +); + +NTKERNELAPI +VOID +NTAPI +CcUnpinData ( + IN PVOID Bcb +); + +NTKERNELAPI +VOID +NTAPI +CcUnpinDataForThread ( + IN PVOID Bcb, + IN ERESOURCE_THREAD ResourceThreadId +); + +NTKERNELAPI +VOID +NTAPI +CcUnpinRepinnedBcb ( + IN PVOID Bcb, + IN BOOLEAN WriteThrough, + OUT PIO_STATUS_BLOCK IoStatus +); + +#if (VER_PRODUCTBUILD >= 2195) + +NTKERNELAPI +NTSTATUS +NTAPI +CcWaitForCurrentLazyWriterActivity ( + VOID +); + +#endif /* (VER_PRODUCTBUILD >= 2195) */ + +NTKERNELAPI +BOOLEAN +NTAPI +CcZeroData ( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER StartOffset, + IN PLARGE_INTEGER EndOffset, + IN BOOLEAN Wait +); + +#if (VER_PRODUCTBUILD >= 2600) + +#ifndef __NTOSKRNL__ +NTKERNELAPI +VOID +FASTCALL +ExInitializeRundownProtection ( + IN PEX_RUNDOWN_REF RunRef +); + +NTKERNELAPI +VOID +FASTCALL +ExReInitializeRundownProtection ( + IN PEX_RUNDOWN_REF RunRef +); + +NTKERNELAPI +BOOLEAN +FASTCALL +ExAcquireRundownProtection ( + IN PEX_RUNDOWN_REF RunRef +); + +NTKERNELAPI +BOOLEAN +FASTCALL +ExAcquireRundownProtectionEx ( + IN PEX_RUNDOWN_REF RunRef, + IN ULONG Count +); + +NTKERNELAPI +VOID +FASTCALL +ExReleaseRundownProtection ( + IN PEX_RUNDOWN_REF RunRef +); + +NTKERNELAPI +VOID +FASTCALL +ExReleaseRundownProtectionEx ( + IN PEX_RUNDOWN_REF RunRef, + IN ULONG Count +); + +NTKERNELAPI +VOID +FASTCALL +ExRundownCompleted ( + IN PEX_RUNDOWN_REF RunRef +); + +NTKERNELAPI +VOID +FASTCALL +ExWaitForRundownProtectionRelease ( + IN PEX_RUNDOWN_REF RunRef +); + +#endif +#endif /* (VER_PRODUCTBUILD >= 2600) */ + + +#define FsRtlSetupAdvancedHeader( _advhdr, _fmutx ) \ +{ \ + SetFlag( (_advhdr)->Flags, FSRTL_FLAG_ADVANCED_HEADER ); \ + SetFlag( (_advhdr)->Flags2, FSRTL_FLAG2_SUPPORTS_FILTER_CONTEXTS ); \ + (_advhdr)->Version = FSRTL_FCB_HEADER_V1; \ + InitializeListHead( &(_advhdr)->FilterContexts ); \ + if ((_fmutx) != NULL) { \ + (_advhdr)->FastMutex = (_fmutx); \ + } \ + *((PULONG_PTR)(&(_advhdr)->PushLock)) = 0; \ + /*ExInitializePushLock( &(_advhdr)->PushLock ); API Not avaliable downlevel*/\ + (_advhdr)->FileContextSupportPointer = NULL; \ +} + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlAddBaseMcbEntry ( + IN PBASE_MCB Mcb, + IN LONGLONG Vbn, + IN LONGLONG Lbn, + IN LONGLONG SectorCount +); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlAddLargeMcbEntry ( + IN PLARGE_MCB Mcb, + IN LONGLONG Vbn, + IN LONGLONG Lbn, + IN LONGLONG SectorCount +); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlAddMcbEntry ( + IN PMCB Mcb, + IN VBN Vbn, + IN LBN Lbn, + IN ULONG SectorCount +); + +NTKERNELAPI +VOID +NTAPI +FsRtlAddToTunnelCache ( + IN PTUNNEL Cache, + IN ULONGLONG DirectoryKey, + IN PUNICODE_STRING ShortName, + IN PUNICODE_STRING LongName, + IN BOOLEAN KeyByShortName, + IN ULONG DataLength, + IN PVOID Data +); + NTKERNELAPI PVOID NTAPI @@ -9325,6 +8204,251 @@ FsRtlAllocatePoolWithTag ( IN ULONG Tag ); +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlAreNamesEqual ( + IN PCUNICODE_STRING Name1, + IN PCUNICODE_STRING Name2, + IN BOOLEAN IgnoreCase, + IN PCWCH UpcaseTable OPTIONAL +); + +#define FsRtlAreThereCurrentFileLocks(FL) ( \ + ((FL)->FastIoIsQuestionable) \ +) + +typedef +VOID +(NTAPI*POPLOCK_WAIT_COMPLETE_ROUTINE) ( + IN PVOID Context, + IN PIRP Irp +); + +typedef +VOID +(NTAPI*POPLOCK_FS_PREPOST_IRP) ( + IN PVOID Context, + IN PIRP Irp +); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlCheckOplock ( + IN POPLOCK Oplock, + IN PIRP Irp, + IN PVOID Context, + IN POPLOCK_WAIT_COMPLETE_ROUTINE CompletionRoutine OPTIONAL, + IN POPLOCK_FS_PREPOST_IRP PostIrpRoutine OPTIONAL +); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlCurrentBatchOplock ( + IN POPLOCK Oplock +); + +NTKERNELAPI +VOID +NTAPI +FsRtlDeleteKeyFromTunnelCache ( + IN PTUNNEL Cache, + IN ULONGLONG DirectoryKey +); + +NTKERNELAPI +VOID +NTAPI +FsRtlDeleteTunnelCache ( + IN PTUNNEL Cache +); + +NTKERNELAPI +VOID +NTAPI +FsRtlDeregisterUncProvider ( + IN HANDLE Handle +); + +NTKERNELAPI +VOID +NTAPI +FsRtlDissectDbcs ( + IN ANSI_STRING Name, + OUT PANSI_STRING FirstPart, + OUT PANSI_STRING RemainingPart +); + +NTKERNELAPI +VOID +NTAPI +FsRtlDissectName ( + IN UNICODE_STRING Name, + OUT PUNICODE_STRING FirstPart, + OUT PUNICODE_STRING RemainingPart +); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlDoesDbcsContainWildCards ( + IN PANSI_STRING Name +); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlDoesNameContainWildCards ( + IN PUNICODE_STRING Name +); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlIsFatDbcsLegal ( + IN ANSI_STRING DbcsName, + IN BOOLEAN WildCardsPermissible, + IN BOOLEAN PathNamePermissible, + IN BOOLEAN LeadingBackslashPermissible + ); + + +#define FsRtlCompleteRequest(IRP,STATUS) { \ + (IRP)->IoStatus.Status = (STATUS); \ + IoCompleteRequest( (IRP), IO_DISK_INCREMENT ); \ +} + +#define FsRtlEnterFileSystem KeEnterCriticalRegion + +#define FsRtlExitFileSystem KeLeaveCriticalRegion + +#define FsRtlFastLock(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11) ( \ + FsRtlPrivateLock(A1, A2, A3, A4, A5, A6, A7, A8, A9, NULL, A10, A11) \ +) + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlFindInTunnelCache ( + IN PTUNNEL Cache, + IN ULONGLONG DirectoryKey, + IN PUNICODE_STRING Name, + OUT PUNICODE_STRING ShortName, + OUT PUNICODE_STRING LongName, + IN OUT PULONG DataLength, + OUT PVOID Data +); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlGetNextBaseMcbEntry ( + IN PBASE_MCB Mcb, + IN ULONG RunIndex, + OUT PLONGLONG Vbn, + OUT PLONGLONG Lbn, + OUT PLONGLONG SectorCount +); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlGetNextLargeMcbEntry ( + IN PLARGE_MCB Mcb, + IN ULONG RunIndex, + OUT PLONGLONG Vbn, + OUT PLONGLONG Lbn, + OUT PLONGLONG SectorCount +); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlGetNextMcbEntry ( + IN PMCB Mcb, + IN ULONG RunIndex, + OUT PVBN Vbn, + OUT PLBN Lbn, + OUT PULONG SectorCount +); + +#define FsRtlGetPerStreamContextPointer(FO) ( \ + (PFSRTL_ADVANCED_FCB_HEADER)(FO)->FsContext \ +) + +NTKERNELAPI +VOID +NTAPI +FsRtlInitializeBaseMcb ( + IN PBASE_MCB Mcb, + IN POOL_TYPE PoolType +); + +NTKERNELAPI +VOID +NTAPI +FsRtlInitializeLargeMcb ( + IN PLARGE_MCB Mcb, + IN POOL_TYPE PoolType +); + +NTKERNELAPI +VOID +NTAPI +FsRtlInitializeMcb ( + IN PMCB Mcb, + IN POOL_TYPE PoolType +); + +NTKERNELAPI +VOID +NTAPI +FsRtlInitializeOplock ( + IN OUT POPLOCK Oplock +); + +NTKERNELAPI +VOID +NTAPI +FsRtlInitializeTunnelCache ( + IN PTUNNEL Cache +); + +#define FsRtlInitPerStreamContext(PSC, O, I, FC) ( \ + (PSC)->OwnerId = (O), \ + (PSC)->InstanceId = (I), \ + (PSC)->FreeCallback = (FC) \ +) + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlInsertPerStreamContext ( + IN PFSRTL_ADVANCED_FCB_HEADER PerStreamContext, + IN PFSRTL_PER_STREAM_CONTEXT Ptr +); + +#define FsRtlIsAnsiCharacterLegalFat(C, WILD) ( \ + FlagOn(FsRtlLegalAnsiCharacterArray[(UCHAR)(C)], (FSRTL_FAT_LEGAL) | \ + ((WILD) ? FSRTL_WILD_CHARACTER : 0 )) \ +) + +#define FsRtlIsAnsiCharacterLegalHpfs(C, WILD) ( \ + FlagOn(FsRtlLegalAnsiCharacterArray[(UCHAR)(C)], (FSRTL_HPFS_LEGAL) | \ + ((WILD) ? FSRTL_WILD_CHARACTER : 0 )) \ +) + +#define FsRtlIsAnsiCharacterLegalNtfs(C, WILD) ( \ + FlagOn(FsRtlLegalAnsiCharacterArray[(UCHAR)(C)], (FSRTL_NTFS_LEGAL) | \ + ((WILD) ? FSRTL_WILD_CHARACTER : 0 )) \ +) + +#define FsRtlIsAnsiCharacterWild(C) ( \ + FlagOn(FsRtlLegalAnsiCharacterArray[(UCHAR)(C)], FSRTL_WILD_CHARACTER ) \ +) + NTKERNELAPI BOOLEAN NTAPI @@ -9335,6 +8459,142 @@ FsRtlIsFatDbcsLegal ( IN BOOLEAN LeadingBackslashPermissible ); +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlIsHpfsDbcsLegal ( + IN ANSI_STRING DbcsName, + IN BOOLEAN WildCardsPermissible, + IN BOOLEAN PathNamePermissible, + IN BOOLEAN LeadingBackslashPermissible +); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlIsNameInExpression ( + IN PUNICODE_STRING Expression, + IN PUNICODE_STRING Name, + IN BOOLEAN IgnoreCase, + IN PWCHAR UpcaseTable OPTIONAL +); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlIsNtstatusExpected ( + IN NTSTATUS Ntstatus +); + +#define NLS_OEM_LEAD_BYTE_INFO NlsOemLeadByteInfo + +extern PUSHORT NlsOemLeadByteInfo; + +#define FsRtlIsLeadDbcsCharacter(DBCS_CHAR) ( \ + (BOOLEAN)((UCHAR)(DBCS_CHAR) < 0x80 ? FALSE : \ + (NLS_MB_CODE_PAGE_TAG && \ + (NLS_OEM_LEAD_BYTE_INFO[(UCHAR)(DBCS_CHAR)] != 0))) \ +) + +#define FsRtlIsUnicodeCharacterWild(C) ( \ + (((C) >= 0x40) ? \ + FALSE : \ + FlagOn(FsRtlLegalAnsiCharacterArray[(C)], FSRTL_WILD_CHARACTER )) \ +) + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlLookupBaseMcbEntry ( + IN PBASE_MCB Mcb, + IN LONGLONG Vbn, + OUT PLONGLONG Lbn OPTIONAL, + OUT PLONGLONG SectorCountFromLbn OPTIONAL, + OUT PLONGLONG StartingLbn OPTIONAL, + OUT PLONGLONG SectorCountFromStartingLbn OPTIONAL, + OUT PULONG Index OPTIONAL +); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlLookupLargeMcbEntry ( + IN PLARGE_MCB Mcb, + IN LONGLONG Vbn, + OUT PLONGLONG Lbn OPTIONAL, + OUT PLONGLONG SectorCountFromLbn OPTIONAL, + OUT PLONGLONG StartingLbn OPTIONAL, + OUT PLONGLONG SectorCountFromStartingLbn OPTIONAL, + OUT PULONG Index OPTIONAL +); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlLookupLastBaseMcbEntry ( + IN PBASE_MCB Mcb, + OUT PLONGLONG Vbn, + OUT PLONGLONG Lbn +); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlLookupLastLargeMcbEntry ( + IN PLARGE_MCB Mcb, + OUT PLONGLONG Vbn, + OUT PLONGLONG Lbn +); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlLookupLastMcbEntry ( + IN PMCB Mcb, + OUT PVBN Vbn, + OUT PLBN Lbn +); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlLookupLastBaseMcbEntryAndIndex ( + IN PBASE_MCB OpaqueMcb, + IN OUT PLONGLONG LargeVbn, + IN OUT PLONGLONG LargeLbn, + IN OUT PULONG Index +); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlLookupLastLargeMcbEntryAndIndex ( + IN PLARGE_MCB OpaqueMcb, + OUT PLONGLONG LargeVbn, + OUT PLONGLONG LargeLbn, + OUT PULONG Index +); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlLookupMcbEntry ( + IN PMCB Mcb, + IN VBN Vbn, + OUT PLBN Lbn, + OUT PULONG SectorCount OPTIONAL, + OUT PULONG Index +); + +NTKERNELAPI +PFSRTL_PER_STREAM_CONTEXT +NTAPI +FsRtlLookupPerStreamContextInternal ( + IN PFSRTL_ADVANCED_FCB_HEADER StreamContext, + IN PVOID OwnerId OPTIONAL, + IN PVOID InstanceId OPTIONAL +); + NTKERNELAPI BOOLEAN NTAPI @@ -9352,6 +8612,14 @@ FsRtlMdlWriteComplete ( IN PMDL MdlChain ); +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlNormalizeNtstatus ( + IN NTSTATUS Exception, + IN NTSTATUS GenericException +); + NTKERNELAPI VOID NTAPI @@ -9365,6 +8633,306 @@ FsRtlNotifyChangeDirectory ( IN PIRP NotifyIrp ); +NTKERNELAPI +VOID +NTAPI +FsRtlNotifyCleanup ( + IN PNOTIFY_SYNC NotifySync, + IN PLIST_ENTRY NotifyList, + IN PVOID FsContext +); + +typedef BOOLEAN (NTAPI *PCHECK_FOR_TRAVERSE_ACCESS) ( + IN PVOID NotifyContext, + IN PVOID TargetContext, + IN PSECURITY_SUBJECT_CONTEXT SubjectContext +); + +NTKERNELAPI +VOID +NTAPI +FsRtlNotifyFilterChangeDirectory ( + IN PNOTIFY_SYNC NotifySync, + IN PLIST_ENTRY NotifyList, + IN PVOID FsContext, + IN PSTRING FullDirectoryName, + IN BOOLEAN WatchTree, + IN BOOLEAN IgnoreBuffer, + IN ULONG CompletionFilter, + IN PIRP NotifyIrp, + IN PCHECK_FOR_TRAVERSE_ACCESS TraverseCallback OPTIONAL, + IN PSECURITY_SUBJECT_CONTEXT SubjectContext OPTIONAL, + IN PFILTER_REPORT_CHANGE FilterCallback OPTIONAL); + +NTKERNELAPI +VOID +NTAPI +FsRtlNotifyFilterReportChange ( + IN PNOTIFY_SYNC NotifySync, + IN PLIST_ENTRY NotifyList, + IN PSTRING FullTargetName, + IN USHORT TargetNameOffset, + IN PSTRING StreamName OPTIONAL, + IN PSTRING NormalizedParentName OPTIONAL, + IN ULONG FilterMatch, + IN ULONG Action, + IN PVOID TargetContext, + IN PVOID FilterContext); + +NTKERNELAPI +VOID +NTAPI +FsRtlNotifyFullChangeDirectory ( + IN PNOTIFY_SYNC NotifySync, + IN PLIST_ENTRY NotifyList, + IN PVOID FsContext, + IN PSTRING FullDirectoryName, + IN BOOLEAN WatchTree, + IN BOOLEAN IgnoreBuffer, + IN ULONG CompletionFilter, + IN PIRP NotifyIrp, + IN PCHECK_FOR_TRAVERSE_ACCESS TraverseCallback OPTIONAL, + IN PSECURITY_SUBJECT_CONTEXT SubjectContext OPTIONAL +); + +NTKERNELAPI +VOID +NTAPI +FsRtlNotifyFullReportChange ( + IN PNOTIFY_SYNC NotifySync, + IN PLIST_ENTRY NotifyList, + IN PSTRING FullTargetName, + IN USHORT TargetNameOffset, + IN PSTRING StreamName OPTIONAL, + IN PSTRING NormalizedParentName OPTIONAL, + IN ULONG FilterMatch, + IN ULONG Action, + IN PVOID TargetContext +); + +NTKERNELAPI +VOID +NTAPI +FsRtlNotifyInitializeSync ( + IN PNOTIFY_SYNC *NotifySync +); + +NTKERNELAPI +VOID +NTAPI +FsRtlNotifyUninitializeSync ( + IN PNOTIFY_SYNC *NotifySync +); + +#if (VER_PRODUCTBUILD >= 2195) + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlNotifyVolumeEvent ( + IN PFILE_OBJECT FileObject, + IN ULONG EventCode +); + +#endif /* (VER_PRODUCTBUILD >= 2195) */ + +NTKERNELAPI +ULONG +NTAPI +FsRtlNumberOfRunsInBaseMcb ( + IN PBASE_MCB Mcb +); + +NTKERNELAPI +ULONG +NTAPI +FsRtlNumberOfRunsInLargeMcb ( + IN PLARGE_MCB Mcb +); + +NTKERNELAPI +ULONG +NTAPI +FsRtlNumberOfRunsInMcb ( + IN PMCB Mcb +); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlOplockFsctrl ( + IN POPLOCK Oplock, + IN PIRP Irp, + IN ULONG OpenCount +); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlOplockIsFastIoPossible ( + IN POPLOCK Oplock +); + +typedef VOID +(NTAPI *PFSRTL_STACK_OVERFLOW_ROUTINE) ( + IN PVOID Context, + IN PKEVENT Event +); + +NTKERNELAPI +VOID +NTAPI +FsRtlPostPagingFileStackOverflow ( + IN PVOID Context, + IN PKEVENT Event, + IN PFSRTL_STACK_OVERFLOW_ROUTINE StackOverflowRoutine +); + +NTKERNELAPI +VOID +NTAPI +FsRtlPostStackOverflow ( + IN PVOID Context, + IN PKEVENT Event, + IN PFSRTL_STACK_OVERFLOW_ROUTINE StackOverflowRoutine +); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlRegisterUncProvider ( + IN OUT PHANDLE MupHandle, + IN PUNICODE_STRING RedirectorDeviceName, + IN BOOLEAN MailslotsSupported +); + +NTKERNELAPI +VOID +NTAPI +FsRtlRemoveBaseMcbEntry ( + IN PBASE_MCB Mcb, + IN LONGLONG Vbn, + IN LONGLONG SectorCount +); + +NTKERNELAPI +VOID +NTAPI +FsRtlRemoveLargeMcbEntry ( + IN PLARGE_MCB Mcb, + IN LONGLONG Vbn, + IN LONGLONG SectorCount +); + +NTKERNELAPI +VOID +NTAPI +FsRtlRemoveMcbEntry ( + IN PMCB Mcb, + IN VBN Vbn, + IN ULONG SectorCount +); + +NTKERNELAPI +PFSRTL_PER_STREAM_CONTEXT +NTAPI +FsRtlRemovePerStreamContext ( + IN PFSRTL_ADVANCED_FCB_HEADER StreamContext, + IN PVOID OwnerId OPTIONAL, + IN PVOID InstanceId OPTIONAL +); + +NTKERNELAPI +VOID +NTAPI +FsRtlResetBaseMcb ( + IN PBASE_MCB Mcb +); + +NTKERNELAPI +VOID +NTAPI +FsRtlResetLargeMcb ( + IN PLARGE_MCB Mcb, + IN BOOLEAN SelfSynchronized +); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlSplitBaseMcb ( + IN PBASE_MCB Mcb, + IN LONGLONG Vbn, + IN LONGLONG Amount +); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlSplitLargeMcb ( + IN PLARGE_MCB Mcb, + IN LONGLONG Vbn, + IN LONGLONG Amount +); + +#define FsRtlSupportsPerStreamContexts(FO) ( \ + (BOOLEAN)((NULL != FsRtlGetPerStreamContextPointer(FO) && \ + FlagOn(FsRtlGetPerStreamContextPointer(FO)->Flags2, \ + FSRTL_FLAG2_SUPPORTS_FILTER_CONTEXTS)) \ +) + +NTKERNELAPI +VOID +NTAPI +FsRtlTruncateBaseMcb ( + IN PBASE_MCB Mcb, + IN LONGLONG Vbn +); + +NTKERNELAPI +VOID +NTAPI +FsRtlTruncateLargeMcb ( + IN PLARGE_MCB Mcb, + IN LONGLONG Vbn +); + +NTKERNELAPI +VOID +NTAPI +FsRtlTruncateMcb ( + IN PMCB Mcb, + IN VBN Vbn +); + +NTKERNELAPI +VOID +NTAPI +FsRtlUninitializeBaseMcb ( + IN PBASE_MCB Mcb +); + +NTKERNELAPI +VOID +NTAPI +FsRtlUninitializeLargeMcb ( + IN PLARGE_MCB Mcb +); + +NTKERNELAPI +VOID +NTAPI +FsRtlUninitializeMcb ( + IN PMCB Mcb +); + +NTKERNELAPI +VOID +NTAPI +FsRtlUninitializeOplock ( + IN OUT POPLOCK Oplock +); + NTKERNELAPI NTSTATUS NTAPI @@ -9401,6 +8969,23 @@ ObReferenceObjectByName ( OUT PVOID *Object ); +#if (NTDDI_VERSION >= NTDDI_WIN2K) + +NTKERNELAPI +NTSTATUS +NTAPI +PsAssignImpersonationToken( + IN PETHREAD Thread, + IN HANDLE Token OPTIONAL); + +NTKERNELAPI +HANDLE +NTAPI +PsReferencePrimaryToken( + IN OUT PEPROCESS Process); + +#endif + #define PsDereferenceImpersonationToken(T) \ {if (ARGUMENT_PRESENT(T)) { \ (ObDereferenceObject((T))); \ @@ -9418,6 +9003,14 @@ PsLookupProcessThreadByCid ( OUT PETHREAD *Thread ); +NTSYSAPI +VOID +NTAPI +RtlSecondsSince1970ToTime ( + IN ULONG SecondsSince1970, + OUT PLARGE_INTEGER Time +); + NTSYSAPI NTSTATUS NTAPI @@ -9428,6 +9021,105 @@ RtlSetSaclSecurityDescriptor ( IN BOOLEAN SaclDefaulted ); +NTSYSAPI +NTSTATUS +NTAPI +RtlUnicodeStringToCountedOemString ( + IN OUT POEM_STRING DestinationString, + IN PCUNICODE_STRING SourceString, + IN BOOLEAN AllocateDestinationString +); + +/* RTL Splay Tree Functions */ +NTSYSAPI +PRTL_SPLAY_LINKS +NTAPI +RtlSplay(PRTL_SPLAY_LINKS Links); + +NTSYSAPI +PRTL_SPLAY_LINKS +NTAPI +RtlDelete(PRTL_SPLAY_LINKS Links); + +NTSYSAPI +VOID +NTAPI +RtlDeleteNoSplay( + PRTL_SPLAY_LINKS Links, + PRTL_SPLAY_LINKS *Root +); + +NTSYSAPI +PRTL_SPLAY_LINKS +NTAPI +RtlSubtreeSuccessor(PRTL_SPLAY_LINKS Links); + +NTSYSAPI +PRTL_SPLAY_LINKS +NTAPI +RtlSubtreePredecessor(PRTL_SPLAY_LINKS Links); + +NTSYSAPI +PRTL_SPLAY_LINKS +NTAPI +RtlRealSuccessor(PRTL_SPLAY_LINKS Links); + +NTSYSAPI +PRTL_SPLAY_LINKS +NTAPI +RtlRealPredecessor(PRTL_SPLAY_LINKS Links); + +#define RtlIsLeftChild(Links) \ + (RtlLeftChild(RtlParent(Links)) == (PRTL_SPLAY_LINKS)(Links)) + +#define RtlIsRightChild(Links) \ + (RtlRightChild(RtlParent(Links)) == (PRTL_SPLAY_LINKS)(Links)) + +#define RtlRightChild(Links) \ + ((PRTL_SPLAY_LINKS)(Links))->RightChild + +#define RtlIsRoot(Links) \ + (RtlParent(Links) == (PRTL_SPLAY_LINKS)(Links)) + +#define RtlLeftChild(Links) \ + ((PRTL_SPLAY_LINKS)(Links))->LeftChild + +#define RtlParent(Links) \ + ((PRTL_SPLAY_LINKS)(Links))->Parent + +#define RtlInitializeSplayLinks(Links) \ + { \ + PRTL_SPLAY_LINKS _SplayLinks; \ + _SplayLinks = (PRTL_SPLAY_LINKS)(Links); \ + _SplayLinks->Parent = _SplayLinks; \ + _SplayLinks->LeftChild = NULL; \ + _SplayLinks->RightChild = NULL; \ + } + +#define RtlInsertAsLeftChild(ParentLinks,ChildLinks) \ + { \ + PRTL_SPLAY_LINKS _SplayParent; \ + PRTL_SPLAY_LINKS _SplayChild; \ + _SplayParent = (PRTL_SPLAY_LINKS)(ParentLinks); \ + _SplayChild = (PRTL_SPLAY_LINKS)(ChildLinks); \ + _SplayParent->LeftChild = _SplayChild; \ + _SplayChild->Parent = _SplayParent; \ + } + +#define RtlInsertAsRightChild(ParentLinks,ChildLinks) \ + { \ + PRTL_SPLAY_LINKS _SplayParent; \ + PRTL_SPLAY_LINKS _SplayChild; \ + _SplayParent = (PRTL_SPLAY_LINKS)(ParentLinks); \ + _SplayChild = (PRTL_SPLAY_LINKS)(ChildLinks); \ + _SplayParent->RightChild = _SplayChild; \ + _SplayChild->Parent = _SplayParent; \ + } + +// +// RTL time functions +// + #define SeEnableAccessToExports() SeExports = *(PSE_EXPORTS *)SeExports; #if (VER_PRODUCTBUILD >= 2195) @@ -9453,6 +9145,18 @@ ZwAlertThread ( IN HANDLE ThreadHandle ); +NTSYSAPI +NTSTATUS +NTAPI +ZwAllocateVirtualMemory ( + IN HANDLE ProcessHandle, + IN OUT PVOID *BaseAddress, + IN ULONG_PTR ZeroBits, + IN OUT PSIZE_T RegionSize, + IN ULONG AllocationType, + IN ULONG Protect +); + NTSYSAPI NTSTATUS NTAPI @@ -9498,6 +9202,19 @@ ZwCloseObjectAuditAlarm ( IN BOOLEAN GenerateOnClose ); +NTSYSAPI +NTSTATUS +NTAPI +ZwCreateSection ( + OUT PHANDLE SectionHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, + IN PLARGE_INTEGER MaximumSize OPTIONAL, + IN ULONG SectionPageProtection, + IN ULONG AllocationAttributes, + IN HANDLE FileHandle OPTIONAL +); + NTSYSAPI NTSTATUS NTAPI @@ -9508,6 +9225,71 @@ ZwCreateSymbolicLinkObject ( IN PUNICODE_STRING TargetName ); +NTSYSAPI +NTSTATUS +NTAPI +ZwDeleteFile ( + IN POBJECT_ATTRIBUTES ObjectAttributes +); + +NTSYSAPI +NTSTATUS +NTAPI +ZwDeleteValueKey ( + IN HANDLE Handle, + IN PUNICODE_STRING Name +); + + +#if (NTDDI_VERSION >= NTDDI_WIN2K) +NTSYSAPI +NTSTATUS +NTAPI +ZwDeviceIoControlFile ( + IN HANDLE FileHandle, + IN HANDLE Event OPTIONAL, + IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, + IN PVOID ApcContext OPTIONAL, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN ULONG IoControlCode, + IN PVOID InputBuffer OPTIONAL, + IN ULONG InputBufferLength, + OUT PVOID OutputBuffer OPTIONAL, + IN ULONG OutputBufferLength); +#endif + +NTSYSAPI +NTSTATUS +NTAPI +ZwDisplayString ( + IN PUNICODE_STRING String +); + +NTSYSAPI +NTSTATUS +NTAPI +ZwDuplicateObject ( + IN HANDLE SourceProcessHandle, + IN HANDLE SourceHandle, + IN HANDLE TargetProcessHandle OPTIONAL, + OUT PHANDLE TargetHandle OPTIONAL, + IN ACCESS_MASK DesiredAccess, + IN ULONG HandleAttributes, + IN ULONG Options +); + +NTSYSAPI +NTSTATUS +NTAPI +ZwDuplicateToken ( + IN HANDLE ExistingTokenHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes, + IN BOOLEAN EffectiveOnly, + IN TOKEN_TYPE TokenType, + OUT PHANDLE NewTokenHandle +); + NTSYSAPI NTSTATUS NTAPI @@ -9527,6 +9309,46 @@ ZwFlushBuffersFile( #if (VER_PRODUCTBUILD >= 2195) +NTSYSAPI +NTSTATUS +NTAPI +ZwFlushVirtualMemory ( + IN HANDLE ProcessHandle, + IN OUT PVOID *BaseAddress, + IN OUT PULONG FlushSize, + OUT PIO_STATUS_BLOCK IoStatusBlock +); + +#endif /* (VER_PRODUCTBUILD >= 2195) */ + +NTSYSAPI +NTSTATUS +NTAPI +ZwFreeVirtualMemory ( + IN HANDLE ProcessHandle, + IN OUT PVOID *BaseAddress, + IN OUT PSIZE_T RegionSize, + IN ULONG FreeType +); + +NTSYSAPI +NTSTATUS +NTAPI +ZwFsControlFile ( + IN HANDLE FileHandle, + IN HANDLE Event OPTIONAL, + IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, + IN PVOID ApcContext OPTIONAL, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN ULONG FsControlCode, + IN PVOID InputBuffer OPTIONAL, + IN ULONG InputBufferLength, + OUT PVOID OutputBuffer OPTIONAL, + IN ULONG OutputBufferLength +); + +#if (VER_PRODUCTBUILD >= 2195) + NTSYSAPI NTSTATUS NTAPI @@ -9539,6 +9361,14 @@ ZwInitiatePowerAction ( #endif /* (VER_PRODUCTBUILD >= 2195) */ +NTSYSAPI +NTSTATUS +NTAPI +ZwLoadDriver ( + /* "\\Registry\\Machine\\System\\CurrentControlSet\\Services\\" */ + IN PUNICODE_STRING RegistryPath +); + NTSYSAPI NTSTATUS NTAPI @@ -9547,6 +9377,41 @@ ZwLoadKey ( IN POBJECT_ATTRIBUTES FileObjectAttributes ); +NTSYSAPI +NTSTATUS +NTAPI +ZwNotifyChangeKey ( + IN HANDLE KeyHandle, + IN HANDLE EventHandle OPTIONAL, + IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, + IN PVOID ApcContext OPTIONAL, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN ULONG NotifyFilter, + IN BOOLEAN WatchSubtree, + IN PVOID Buffer, + IN ULONG BufferLength, + IN BOOLEAN Asynchronous +); + +NTSYSAPI +NTSTATUS +NTAPI +ZwOpenDirectoryObject ( + OUT PHANDLE DirectoryHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes +); + +NTSYSAPI +NTSTATUS +NTAPI +ZwOpenProcess ( + OUT PHANDLE ProcessHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes, + IN PCLIENT_ID ClientId OPTIONAL +); + NTSYSAPI NTSTATUS NTAPI @@ -9576,6 +9441,21 @@ ZwOpenThreadToken ( OUT PHANDLE TokenHandle ); +#if (VER_PRODUCTBUILD >= 2195) + +NTSYSAPI +NTSTATUS +NTAPI +ZwPowerInformation ( + IN POWER_INFORMATION_LEVEL PowerInformationLevel, + IN PVOID InputBuffer OPTIONAL, + IN ULONG InputBufferLength, + OUT PVOID OutputBuffer OPTIONAL, + IN ULONG OutputBufferLength +); + +#endif /* (VER_PRODUCTBUILD >= 2195) */ + NTSYSAPI NTSTATUS NTAPI @@ -9592,6 +9472,23 @@ ZwQueryDefaultLocale ( OUT PLCID Locale ); +NTSYSAPI +NTSTATUS +NTAPI +ZwQueryDirectoryFile ( + IN HANDLE FileHandle, + IN HANDLE Event OPTIONAL, + IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, + IN PVOID ApcContext OPTIONAL, + OUT PIO_STATUS_BLOCK IoStatusBlock, + OUT PVOID FileInformation, + IN ULONG Length, + IN FILE_INFORMATION_CLASS FileInformationClass, + IN BOOLEAN ReturnSingleEntry, + IN PUNICODE_STRING FileName OPTIONAL, + IN BOOLEAN RestartScan +); + #if (VER_PRODUCTBUILD >= 2195) NTSYSAPI @@ -9607,6 +9504,21 @@ ZwQueryDirectoryObject ( OUT PULONG ReturnLength OPTIONAL ); +NTSYSAPI +NTSTATUS +NTAPI +ZwQueryEaFile ( + IN HANDLE FileHandle, + OUT PIO_STATUS_BLOCK IoStatusBlock, + OUT PVOID Buffer, + IN ULONG Length, + IN BOOLEAN ReturnSingleEntry, + IN PVOID EaList OPTIONAL, + IN ULONG EaListLength, + IN PULONG EaIndex OPTIONAL, + IN BOOLEAN RestartScan +); + #endif /* (VER_PRODUCTBUILD >= 2195) */ NTSYSAPI @@ -9620,6 +9532,39 @@ ZwQueryInformationProcess ( OUT PULONG ReturnLength OPTIONAL ); +NTSYSAPI +NTSTATUS +NTAPI +ZwQueryInformationToken ( + IN HANDLE TokenHandle, + IN TOKEN_INFORMATION_CLASS TokenInformationClass, + OUT PVOID TokenInformation, + IN ULONG Length, + OUT PULONG ResultLength +); + +NTSYSAPI +NTSTATUS +NTAPI +ZwQuerySecurityObject ( + IN HANDLE FileHandle, + IN SECURITY_INFORMATION SecurityInformation, + OUT PSECURITY_DESCRIPTOR SecurityDescriptor, + IN ULONG Length, + OUT PULONG ResultLength +); + +NTSYSAPI +NTSTATUS +NTAPI +ZwQueryVolumeInformationFile ( + IN HANDLE FileHandle, + OUT PIO_STATUS_BLOCK IoStatusBlock, + OUT PVOID FsInformation, + IN ULONG Length, + IN FS_INFORMATION_CLASS FsInformationClass +); + NTSYSAPI NTSTATUS NTAPI @@ -9675,8 +9620,26 @@ ZwSetDefaultUILanguage ( IN LANGID LanguageId ); +NTSYSAPI +NTSTATUS +NTAPI +ZwSetEaFile ( + IN HANDLE FileHandle, + OUT PIO_STATUS_BLOCK IoStatusBlock, + OUT PVOID Buffer, + IN ULONG Length +); + #endif /* (VER_PRODUCTBUILD >= 2195) */ +NTSYSAPI +NTSTATUS +NTAPI +ZwSetEvent ( + IN HANDLE EventHandle, + OUT PLONG PreviousState OPTIONAL +); + NTSYSAPI NTSTATUS NTAPI @@ -9687,6 +9650,19 @@ ZwSetInformationProcess ( IN ULONG ProcessInformationLength ); +#if (VER_PRODUCTBUILD >= 2195) + +NTSYSAPI +NTSTATUS +NTAPI +ZwSetSecurityObject ( + IN HANDLE Handle, + IN SECURITY_INFORMATION SecurityInformation, + IN PSECURITY_DESCRIPTOR SecurityDescriptor +); + +#endif /* (VER_PRODUCTBUILD >= 2195) */ + NTSYSAPI NTSTATUS NTAPI @@ -9695,6 +9671,37 @@ ZwSetSystemTime ( OUT PLARGE_INTEGER OldTime OPTIONAL ); +#if (VER_PRODUCTBUILD >= 2195) + +NTSYSAPI +NTSTATUS +NTAPI +ZwSetVolumeInformationFile ( + IN HANDLE FileHandle, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN PVOID FsInformation, + IN ULONG Length, + IN FS_INFORMATION_CLASS FsInformationClass +); + +#endif /* (VER_PRODUCTBUILD >= 2195) */ + +NTSYSAPI +NTSTATUS +NTAPI +ZwTerminateProcess ( + IN HANDLE ProcessHandle OPTIONAL, + IN NTSTATUS ExitStatus +); + +NTSYSAPI +NTSTATUS +NTAPI +ZwUnloadDriver ( + /* "\\Registry\\Machine\\System\\CurrentControlSet\\Services\\" */ + IN PUNICODE_STRING RegistryPath +); + NTSYSAPI NTSTATUS NTAPI @@ -9702,6 +9709,16 @@ ZwUnloadKey ( IN POBJECT_ATTRIBUTES KeyObjectAttributes ); +#if (NTDDI_VERSION >= NTDDI_WIN2K) +NTSYSAPI +NTSTATUS +NTAPI +ZwWaitForSingleObject ( + IN HANDLE Handle, + IN BOOLEAN Alertable, + IN PLARGE_INTEGER Timeout OPTIONAL); +#endif + NTSYSAPI NTSTATUS NTAPI diff --git a/reactos/include/ddk/ntimage.h b/reactos/include/ddk/ntimage.h index 8df984763f7..e008a2daa94 100644 --- a/reactos/include/ddk/ntimage.h +++ b/reactos/include/ddk/ntimage.h @@ -394,33 +394,22 @@ typedef struct _IMAGE_NT_HEADERS64 { ULONG Signature; IMAGE_FILE_HEADER FileHeader; IMAGE_OPTIONAL_HEADER64 OptionalHeader; -} IMAGE_NT_HEADERS64; +} IMAGE_NT_HEADERS64, *PIMAGE_NT_HEADERS64; typedef struct _IMAGE_NT_HEADERS { ULONG Signature; IMAGE_FILE_HEADER FileHeader; IMAGE_OPTIONAL_HEADER32 OptionalHeader; -} IMAGE_NT_HEADERS32; +} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32; #ifdef _WIN64 typedef IMAGE_NT_HEADERS64 IMAGE_NT_HEADERS; -#else -typedef IMAGE_NT_HEADERS32 IMAGE_NT_HEADERS; -#endif - -#ifndef _NTDDK_ - -typedef struct _IMAGE_NT_HEADERS *PIMAGE_NT_HEADERS32; -typedef struct _IMAGE_NT_HEADERS64 *PIMAGE_NT_HEADERS64; - -#ifdef _WIN64 typedef PIMAGE_NT_HEADERS64 PIMAGE_NT_HEADERS; #else +typedef IMAGE_NT_HEADERS32 IMAGE_NT_HEADERS; typedef PIMAGE_NT_HEADERS32 PIMAGE_NT_HEADERS; #endif -#endif /* _NTDDK_ */ - // // Retreives the first image section header from the Nt Header // diff --git a/reactos/include/ddk/wdm.h b/reactos/include/ddk/wdm.h index 3a523235742..ee2f034d5e1 100644 --- a/reactos/include/ddk/wdm.h +++ b/reactos/include/ddk/wdm.h @@ -38,26 +38,15 @@ #include #include #include -#include #ifndef GUID_DEFINED #include #endif -#ifdef _MAC -#ifndef _INC_STRING -#include -#endif /* _INC_STRING */ -#else -#include -#endif /* _MAC */ - #ifndef _KTMTYPES_ typedef GUID UOW, *PUOW; #endif -typedef GUID *PGUID; - #if (NTDDI_VERSION >= NTDDI_WINXP) #include #endif @@ -144,6 +133,8 @@ struct _IO_RESOURCE_DESCRIPTOR; typedef struct _OBJECT_TYPE *POBJECT_TYPE; typedef struct _HAL_DISPATCH_TABLE *PHAL_DISPATCH_TABLE; typedef struct _HAL_PRIVATE_DISPATCH_TABLE *PHAL_PRIVATE_DISPATCH_TABLE; +typedef struct _DEVICE_HANDLER_OBJECT *PDEVICE_HANDLER_OBJECT; +typedef struct _ADAPTER_OBJECT *PADAPTER_OBJECT; typedef struct _CALLBACK_OBJECT *PCALLBACK_OBJECT; typedef struct _EPROCESS *PEPROCESS; typedef struct _ETHREAD *PETHREAD; @@ -153,42 +144,6 @@ typedef struct _KPROCESS *PKPROCESS; typedef struct _KTHREAD *PKTHREAD, *PRKTHREAD; typedef struct _CONTEXT *PCONTEXT; -#if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && ( defined(_NTDDK_) || defined(_NTDRIVER_) || defined(_NTOSP_)) -typedef struct _DMA_ADAPTER *PADAPTER_OBJECT; -#elif defined(_WDM_INCLUDED_) -typedef struct _DMA_ADAPTER *PADAPTER_OBJECT; -#else -typedef struct _ADAPTER_OBJECT *PADAPTER_OBJECT; -#endif - -#ifndef DEFINE_GUIDEX -#ifdef _MSC_VER -#define DEFINE_GUIDEX(name) EXTERN_C const CDECL GUID name -#else -#define DEFINE_GUIDEX(name) EXTERN_C const GUID name -#endif -#endif /* DEFINE_GUIDEX */ - -#ifndef STATICGUIDOF -#define STATICGUIDOF(guid) STATIC_##guid -#endif - -/* GUID Comparison */ -#ifndef __IID_ALIGNED__ -#define __IID_ALIGNED__ -#ifdef __cplusplus -inline int IsEqualGUIDAligned(REFGUID guid1, REFGUID guid2) -{ - return ( (*(PLONGLONG)(&guid1) == *(PLONGLONG)(&guid2)) && - (*((PLONGLONG)(&guid1) + 1) == *((PLONGLONG)(&guid2) + 1)) ); -} -#else -#define IsEqualGUIDAligned(guid1, guid2) \ - ( (*(PLONGLONG)(guid1) == *(PLONGLONG)(guid2)) && \ - (*((PLONGLONG)(guid1) + 1) == *((PLONGLONG)(guid2) + 1)) ) -#endif /* __cplusplus */ -#endif /* !__IID_ALIGNED__ */ - /****************************************************************************** * INTERLOCKED Functions * @@ -527,29 +482,17 @@ typedef SLIST_HEADER SLIST_HEADER32, *PSLIST_HEADER32; #endif /* _SLIST_HEADER_ */ -/* MS definition is broken! */ -extern BOOLEAN NTSYSAPI NlsMbCodePageTag; -extern BOOLEAN NTSYSAPI NlsMbOemCodePageTag; + +/* HACK HACK HACK - GCC (or perhaps LD) is messing this up */ +#if defined(_NTSYSTEM_) || defined(__GNUC__) #define NLS_MB_CODE_PAGE_TAG NlsMbCodePageTag #define NLS_MB_OEM_CODE_PAGE_TAG NlsMbOemCodePageTag - -#define SHORT_LEAST_SIGNIFICANT_BIT 0 -#define SHORT_MOST_SIGNIFICANT_BIT 1 - -#define LONG_LEAST_SIGNIFICANT_BIT 0 -#define LONG_3RD_MOST_SIGNIFICANT_BIT 1 -#define LONG_2ND_MOST_SIGNIFICANT_BIT 2 -#define LONG_MOST_SIGNIFICANT_BIT 3 - -#define RTLVERLIB_DDI(x) Wdmlib##x - -typedef BOOLEAN -(*PFN_RTL_IS_NTDDI_VERSION_AVAILABLE)( - IN ULONG Version); - -typedef BOOLEAN -(*PFN_RTL_IS_SERVICE_PACK_VERSION_INSTALLED)( - IN ULONG Version); +#else +#define NLS_MB_CODE_PAGE_TAG (*NlsMbCodePageTag) +#define NLS_MB_OEM_CODE_PAGE_TAG (*NlsMbOemCodePageTag) +#endif /* _NT_SYSTEM */ +extern BOOLEAN NTSYSAPI NLS_MB_CODE_PAGE_TAG; +extern BOOLEAN NTSYSAPI NLS_MB_OEM_CODE_PAGE_TAG; /****************************************************************************** @@ -560,116 +503,18 @@ typedef UCHAR KIRQL, *PKIRQL; typedef CCHAR KPROCESSOR_MODE; typedef LONG KPRIORITY; +typedef ULONG EXECUTION_STATE; + typedef enum _MODE { KernelMode, UserMode, MaximumMode } MODE; -#define CACHE_FULLY_ASSOCIATIVE 0xFF -#define MAXIMUM_SUSPEND_COUNT MAXCHAR - -#define EVENT_QUERY_STATE (0x0001) -#define EVENT_MODIFY_STATE (0x0002) -#define EVENT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3) - -#define LTP_PC_SMT 0x1 - #if (NTDDI_VERSION < NTDDI_WIN7) || defined(_X86_) || !defined(NT_PROCESSOR_GROUPS) #define SINGLE_GROUP_LEGACY_API 1 #endif -#define SEMAPHORE_QUERY_STATE (0x0001) -#define SEMAPHORE_MODIFY_STATE (0x0002) -#define SEMAPHORE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3) - -typedef enum _LOGICAL_PROCESSOR_RELATIONSHIP { - RelationProcessorCore, - RelationNumaNode, - RelationCache, - RelationProcessorPackage, - RelationGroup, - RelationAll = 0xffff -} LOGICAL_PROCESSOR_RELATIONSHIP; - -typedef enum _PROCESSOR_CACHE_TYPE { - CacheUnified, - CacheInstruction, - CacheData, - CacheTrace -} PROCESSOR_CACHE_TYPE; - -typedef struct _CACHE_DESCRIPTOR { - UCHAR Level; - UCHAR Associativity; - USHORT LineSize; - ULONG Size; - PROCESSOR_CACHE_TYPE Type; -} CACHE_DESCRIPTOR, *PCACHE_DESCRIPTOR; - -typedef struct _SYSTEM_LOGICAL_PROCESSOR_INFORMATION { - ULONG_PTR ProcessorMask; - LOGICAL_PROCESSOR_RELATIONSHIP Relationship; - union { - struct { - UCHAR Flags; - } ProcessorCore; - struct { - ULONG NodeNumber; - } NumaNode; - CACHE_DESCRIPTOR Cache; - ULONGLONG Reserved[2]; - } DUMMYUNIONNAME; -} SYSTEM_LOGICAL_PROCESSOR_INFORMATION, *PSYSTEM_LOGICAL_PROCESSOR_INFORMATION; - -typedef struct _PROCESSOR_RELATIONSHIP { - UCHAR Flags; - UCHAR Reserved[21]; - USHORT GroupCount; - GROUP_AFFINITY GroupMask[ANYSIZE_ARRAY]; -} PROCESSOR_RELATIONSHIP, *PPROCESSOR_RELATIONSHIP; - -typedef struct _NUMA_NODE_RELATIONSHIP { - ULONG NodeNumber; - UCHAR Reserved[20]; - GROUP_AFFINITY GroupMask; -} NUMA_NODE_RELATIONSHIP, *PNUMA_NODE_RELATIONSHIP; - -typedef struct _CACHE_RELATIONSHIP { - UCHAR Level; - UCHAR Associativity; - USHORT LineSize; - ULONG CacheSize; - PROCESSOR_CACHE_TYPE Type; - UCHAR Reserved[20]; - GROUP_AFFINITY GroupMask; -} CACHE_RELATIONSHIP, *PCACHE_RELATIONSHIP; - -typedef struct _PROCESSOR_GROUP_INFO { - UCHAR MaximumProcessorCount; - UCHAR ActiveProcessorCount; - UCHAR Reserved[38]; - KAFFINITY ActiveProcessorMask; -} PROCESSOR_GROUP_INFO, *PPROCESSOR_GROUP_INFO; - -typedef struct _GROUP_RELATIONSHIP { - USHORT MaximumGroupCount; - USHORT ActiveGroupCount; - UCHAR Reserved[20]; - PROCESSOR_GROUP_INFO GroupInfo[ANYSIZE_ARRAY]; -} GROUP_RELATIONSHIP, *PGROUP_RELATIONSHIP; - -typedef struct _SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX { - LOGICAL_PROCESSOR_RELATIONSHIP Relationship; - ULONG Size; - union { - PROCESSOR_RELATIONSHIP Processor; - NUMA_NODE_RELATIONSHIP NumaNode; - CACHE_RELATIONSHIP Cache; - GROUP_RELATIONSHIP Group; - } DUMMYUNIONNAME; -} SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX, *PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX;; - /* Processor features */ #define PF_FLOATING_POINT_PRECISION_ERRATA 0 #define PF_FLOATING_POINT_EMULATED 1 @@ -690,6 +535,7 @@ typedef struct _SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX { #define PF_CHANNELS_ENABLED 16 #define PF_XSAVE_ENABLED 17 +#define MAXIMUM_SUPPORTED_EXTENSION 512 #define MAXIMUM_WAIT_OBJECTS 64 #define ASSERT_APC(Object) NT_ASSERT((Object)->Type == ApcObject) @@ -757,23 +603,6 @@ typedef struct _SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX { #define EXCEPTION_NONCONTINUABLE 1 #define EXCEPTION_MAXIMUM_PARAMETERS 15 -#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 - typedef struct _EXCEPTION_RECORD { NTSTATUS ExceptionCode; ULONG ExceptionFlags; @@ -825,42 +654,6 @@ typedef VOID IN ULONG ReasonSpecificDataLength); typedef KBUGCHECK_REASON_CALLBACK_ROUTINE *PKBUGCHECK_REASON_CALLBACK_ROUTINE; -typedef struct _KBUGCHECK_ADD_PAGES { - IN OUT PVOID Context; - IN OUT ULONG Flags; - IN ULONG BugCheckCode; - OUT ULONG_PTR Address; - OUT ULONG_PTR Count; -} KBUGCHECK_ADD_PAGES, *PKBUGCHECK_ADD_PAGES; - -typedef struct _KBUGCHECK_SECONDARY_DUMP_DATA { - IN PVOID InBuffer; - IN ULONG InBufferLength; - IN ULONG MaximumAllowed; - OUT GUID Guid; - OUT PVOID OutBuffer; - OUT ULONG OutBufferLength; -} KBUGCHECK_SECONDARY_DUMP_DATA, *PKBUGCHECK_SECONDARY_DUMP_DATA; - -typedef enum _KBUGCHECK_DUMP_IO_TYPE { - KbDumpIoInvalid, - KbDumpIoHeader, - KbDumpIoBody, - KbDumpIoSecondaryData, - KbDumpIoComplete -} KBUGCHECK_DUMP_IO_TYPE; - -typedef struct _KBUGCHECK_DUMP_IO { - IN ULONG64 Offset; - IN PVOID Buffer; - IN ULONG BufferLength; - IN KBUGCHECK_DUMP_IO_TYPE Type; -} KBUGCHECK_DUMP_IO, *PKBUGCHECK_DUMP_IO; - -#define KB_ADD_PAGES_FLAG_VIRTUAL_ADDRESS 0x00000001UL -#define KB_ADD_PAGES_FLAG_PHYSICAL_ADDRESS 0x00000002UL -#define KB_ADD_PAGES_FLAG_ADDITIONAL_RANGES_EXIST 0x80000000UL - typedef struct _KBUGCHECK_REASON_CALLBACK_RECORD { LIST_ENTRY Entry; PKBUGCHECK_REASON_CALLBACK_ROUTINE CallbackRoutine; @@ -900,31 +693,20 @@ typedef BOOLEAN IN BOOLEAN Handled); typedef NMI_CALLBACK *PNMI_CALLBACK; -typedef enum _KE_PROCESSOR_CHANGE_NOTIFY_STATE { - KeProcessorAddStartNotify = 0, - KeProcessorAddCompleteNotify, - KeProcessorAddFailureNotify -} KE_PROCESSOR_CHANGE_NOTIFY_STATE; - -typedef struct _KE_PROCESSOR_CHANGE_NOTIFY_CONTEXT { - KE_PROCESSOR_CHANGE_NOTIFY_STATE State; - ULONG NtNumber; - NTSTATUS Status; -#if (NTDDI_VERSION >= NTDDI_WIN7) - PROCESSOR_NUMBER ProcNumber; -#endif -} KE_PROCESSOR_CHANGE_NOTIFY_CONTEXT, *PKE_PROCESSOR_CHANGE_NOTIFY_CONTEXT; - -typedef VOID -(NTAPI PROCESSOR_CALLBACK_FUNCTION)( - IN PVOID CallbackContext, - IN PKE_PROCESSOR_CHANGE_NOTIFY_CONTEXT ChangeContext, - IN OUT PNTSTATUS OperationStatus); -typedef PROCESSOR_CALLBACK_FUNCTION *PPROCESSOR_CALLBACK_FUNCTION; - -#define KE_PROCESSOR_CHANGE_ADD_EXISTING 1 - -#define INVALID_PROCESSOR_INDEX 0xffffffff +typedef enum _TRACE_INFORMATION_CLASS { + TraceIdClass, + TraceHandleClass, + TraceEnableFlagsClass, + TraceEnableLevelClass, + GlobalLoggerHandleClass, + EventLoggerHandleClass, + AllLoggerHandlesClass, + TraceHandleByNameClass, + LoggerEventsLostClass, + TraceSessionSettingsClass, + LoggerEventsLoggedClass, + MaxTraceInformationClass +} TRACE_INFORMATION_CLASS; typedef enum _KINTERRUPT_POLARITY { InterruptPolarityUnknown, @@ -1021,32 +803,36 @@ typedef enum _KINTERRUPT_MODE { #define THREAD_WAIT_OBJECTS 3 -typedef VOID -(NTAPI KSTART_ROUTINE)( - IN PVOID StartContext); -typedef KSTART_ROUTINE *PKSTART_ROUTINE; - typedef VOID (NTAPI *PKINTERRUPT_ROUTINE)( VOID); -typedef BOOLEAN -(NTAPI KSERVICE_ROUTINE)( - IN struct _KINTERRUPT *Interrupt, - IN PVOID ServiceContext); -typedef KSERVICE_ROUTINE *PKSERVICE_ROUTINE; - -typedef BOOLEAN -(NTAPI KMESSAGE_SERVICE_ROUTINE)( - IN struct _KINTERRUPT *Interrupt, - IN PVOID ServiceContext, - IN ULONG MessageID); -typedef KMESSAGE_SERVICE_ROUTINE *PKMESSAGE_SERVICE_ROUTINE; - typedef enum _KD_OPTION { KD_OPTION_SET_BLOCK_ENABLE, } KD_OPTION; +typedef enum _INTERFACE_TYPE { + InterfaceTypeUndefined = -1, + Internal, + Isa, + Eisa, + MicroChannel, + TurboChannel, + PCIBus, + VMEBus, + NuBus, + PCMCIABus, + CBus, + MPIBus, + MPSABus, + ProcessorInternal, + InternalPowerBus, + PNPISABus, + PNPBus, + Vmcs, + MaximumInterfaceType +} INTERFACE_TYPE, *PINTERFACE_TYPE; + typedef VOID (NTAPI *PKNORMAL_ROUTINE)( IN PVOID NormalContext OPTIONAL, @@ -1084,14 +870,6 @@ typedef struct _KAPC { BOOLEAN Inserted; } KAPC, *PKAPC, *RESTRICTED_POINTER PRKAPC; -#define KAPC_OFFSET_TO_SPARE_BYTE0 FIELD_OFFSET(KAPC, SpareByte0) -#define KAPC_OFFSET_TO_SPARE_BYTE1 FIELD_OFFSET(KAPC, SpareByte1) -#define KAPC_OFFSET_TO_SPARE_LONG FIELD_OFFSET(KAPC, SpareLong0) -#define KAPC_OFFSET_TO_SYSTEMARGUMENT1 FIELD_OFFSET(KAPC, SystemArgument1) -#define KAPC_OFFSET_TO_SYSTEMARGUMENT2 FIELD_OFFSET(KAPC, SystemArgument2) -#define KAPC_OFFSET_TO_APCSTATEINDEX FIELD_OFFSET(KAPC, ApcStateIndex) -#define KAPC_ACTUAL_LENGTH (FIELD_OFFSET(KAPC, Inserted) + sizeof(BOOLEAN)) - typedef struct _KDEVICE_QUEUE_ENTRY { LIST_ENTRY DeviceListEntry; ULONG SortKey; @@ -1108,27 +886,10 @@ typedef VOID IN PVOID Parameter2 OPTIONAL, IN PVOID Parameter3 OPTIONAL); -typedef struct _KIPI_COUNTS { - ULONG Freeze; - ULONG Packet; - ULONG DPC; - ULONG APC; - ULONG FlushSingleTb; - ULONG FlushMultipleTb; - ULONG FlushEntireTb; - ULONG GenericCall; - ULONG ChangeColor; - ULONG SweepDcache; - ULONG SweepIcache; - ULONG SweepIcacheRange; - ULONG FlushIoBuffers; - ULONG GratuitousDPC; -} KIPI_COUNTS, *PKIPI_COUNTS; - -typedef ULONG_PTR -(NTAPI KIPI_BROADCAST_WORKER)( +typedef +ULONG_PTR +(NTAPI *PKIPI_BROADCAST_WORKER)( IN ULONG_PTR Argument); -typedef KIPI_BROADCAST_WORKER *PKIPI_BROADCAST_WORKER; typedef ULONG_PTR KSPIN_LOCK, *PKSPIN_LOCK; @@ -1327,8 +1088,6 @@ typedef struct _KSEMAPHORE { LONG Limit; } KSEMAPHORE, *PKSEMAPHORE, *RESTRICTED_POINTER PRKSEMAPHORE; -#define KSEMAPHORE_ACTUAL_LENGTH (FIELD_OFFSET(KSEMAPHORE, Limit) + sizeof(LONG)) - typedef struct _KGATE { DISPATCHER_HEADER Header; } KGATE, *PKGATE, *RESTRICTED_POINTER PRKGATE; @@ -1369,14 +1128,6 @@ typedef struct _KTIMER { ULONG Period; } KTIMER, *PKTIMER, *RESTRICTED_POINTER PRKTIMER; -typedef enum _LOCK_OPERATION { - IoReadAccess, - IoWriteAccess, - IoModifyAccess -} LOCK_OPERATION; - -#define KTIMER_ACTUAL_LENGTH (FIELD_OFFSET(KTIMER, Period) + sizeof(LONG)) - typedef BOOLEAN (NTAPI *PKSYNCHRONIZE_ROUTINE)( IN PVOID SynchronizeContext); @@ -1405,32 +1156,19 @@ typedef enum _ALTERNATIVE_ARCHITECTURE_TYPE { EndAlternatives } ALTERNATIVE_ARCHITECTURE_TYPE; -#ifndef _X86_ - -#ifndef IsNEC_98 -#define IsNEC_98 (FALSE) -#endif - -#ifndef IsNotNEC_98 -#define IsNotNEC_98 (TRUE) -#endif - -#ifndef SetNEC_98 -#define SetNEC_98 -#endif - -#ifndef SetNotNEC_98 -#define SetNotNEC_98 -#endif - -#endif - -typedef struct _KSYSTEM_TIME { +typedef struct _KSYSTEM_TIME +{ ULONG LowPart; LONG High1Time; LONG High2Time; } KSYSTEM_TIME, *PKSYSTEM_TIME; +typedef struct _PNP_BUS_INFORMATION { + GUID BusTypeGuid; + INTERFACE_TYPE LegacyBusType; + ULONG BusNumber; +} PNP_BUS_INFORMATION, *PPNP_BUS_INFORMATION; + typedef struct DECLSPEC_ALIGN(16) _M128A { ULONGLONG Low; LONGLONG High; @@ -1462,104 +1200,12 @@ typedef struct DECLSPEC_ALIGN(16) _XSAVE_FORMAT { #endif } XSAVE_FORMAT, *PXSAVE_FORMAT; -typedef struct DECLSPEC_ALIGN(8) _XSAVE_AREA_HEADER { - ULONG64 Mask; - ULONG64 Reserved[7]; -} XSAVE_AREA_HEADER, *PXSAVE_AREA_HEADER; - -typedef struct DECLSPEC_ALIGN(16) _XSAVE_AREA { - XSAVE_FORMAT LegacyState; - XSAVE_AREA_HEADER Header; -} XSAVE_AREA, *PXSAVE_AREA; - -typedef struct _XSTATE_CONTEXT { - ULONG64 Mask; - ULONG Length; - ULONG Reserved1; - PXSAVE_AREA Area; -#if defined(_X86_) - ULONG Reserved2; -#endif - PVOID Buffer; -#if defined(_X86_) - ULONG Reserved3; -#endif -} XSTATE_CONTEXT, *PXSTATE_CONTEXT; - -typedef struct _XSTATE_SAVE { -#if defined(_AMD64_) - struct _XSTATE_SAVE* Prev; - struct _KTHREAD* Thread; - UCHAR Level; - XSTATE_CONTEXT XStateContext; -#elif defined(_IA64_) - ULONG Dummy; -#elif defined(_X86_) - union { - struct { - LONG64 Reserved1; - ULONG Reserved2; - struct _XSTATE_SAVE* Prev; - PXSAVE_AREA Reserved3; - struct _KTHREAD* Thread; - PVOID Reserved4; - UCHAR Level; - }; - XSTATE_CONTEXT XStateContext; - }; -#endif -} XSTATE_SAVE, *PXSTATE_SAVE; - -#ifdef _X86_ - -#define MAXIMUM_SUPPORTED_EXTENSION 512 - -#if !defined(__midl) && !defined(MIDL_PASS) -C_ASSERT(sizeof(XSAVE_FORMAT) == MAXIMUM_SUPPORTED_EXTENSION); -#endif - -#endif /* _X86_ */ - -#define XSAVE_ALIGN 64 -#define MINIMAL_XSTATE_AREA_LENGTH sizeof(XSAVE_AREA) - -#if !defined(__midl) && !defined(MIDL_PASS) -C_ASSERT((sizeof(XSAVE_FORMAT) & (XSAVE_ALIGN - 1)) == 0); -C_ASSERT((FIELD_OFFSET(XSAVE_AREA, Header) & (XSAVE_ALIGN - 1)) == 0); -C_ASSERT(MINIMAL_XSTATE_AREA_LENGTH == 512 + 64); -#endif - -typedef struct _CONTEXT_CHUNK { - LONG Offset; - ULONG Length; -} CONTEXT_CHUNK, *PCONTEXT_CHUNK; - -typedef struct _CONTEXT_EX { - CONTEXT_CHUNK All; - CONTEXT_CHUNK Legacy; - CONTEXT_CHUNK XState; -} CONTEXT_EX, *PCONTEXT_EX; - -#define CONTEXT_EX_LENGTH ALIGN_UP_BY(sizeof(CONTEXT_EX), STACK_ALIGN) - -#if (NTDDI_VERSION >= NTDDI_VISTA) -extern NTSYSAPI volatile CCHAR KeNumberProcessors; -#elif (NTDDI_VERSION >= NTDDI_WINXP) -extern NTSYSAPI CCHAR KeNumberProcessors; -#else -extern PCCHAR KeNumberProcessors; -#endif /****************************************************************************** * Memory manager Types * ******************************************************************************/ -#if (NTDDI_VERSION >= NTDDI_WIN2K) -typedef ULONG NODE_REQUIREMENT; -#define MM_ANY_NODE_OK 0x80000000 -#endif - #define MM_DONT_ZERO_ALLOCATION 0x00000001 #define MM_ALLOCATE_FROM_LOCAL_NODE_ONLY 0x00000002 #define MM_ALLOCATE_FULLY_REQUIRED 0x00000004 @@ -1688,6 +1334,12 @@ typedef enum _MM_PAGE_PRIORITY { HighPagePriority = 32 } MM_PAGE_PRIORITY; +typedef enum _LOCK_OPERATION { + IoReadAccess, + IoWriteAccess, + IoModifyAccess +} LOCK_OPERATION; + typedef enum _MM_SYSTEM_SIZE { MmSmallSystem, MmMediumSystem, @@ -1706,6 +1358,12 @@ extern PVOID MmBadPointer; #define EX_RUNDOWN_COUNT_SHIFT 0x1 #define EX_RUNDOWN_COUNT_INC (1 << EX_RUNDOWN_COUNT_SHIFT) +#ifdef _WIN64 +#define PORT_MAXIMUM_MESSAGE_LENGTH 512 +#else +#define PORT_MAXIMUM_MESSAGE_LENGTH 256 +#endif + typedef struct _FAST_MUTEX { volatile LONG Count; PKTHREAD Owner; @@ -1877,13 +1535,6 @@ typedef struct _EX_RUNDOWN_REF { typedef struct _EX_RUNDOWN_REF_CACHE_AWARE *PEX_RUNDOWN_REF_CACHE_AWARE; -typedef enum _WORK_QUEUE_TYPE { - CriticalWorkQueue, - DelayedWorkQueue, - HyperCriticalWorkQueue, - MaximumWorkQueue -} WORK_QUEUE_TYPE; - typedef VOID (NTAPI WORKER_THREAD_ROUTINE)( IN PVOID Parameter); @@ -1895,78 +1546,6 @@ typedef struct _WORK_QUEUE_ITEM { volatile PVOID Parameter; } WORK_QUEUE_ITEM, *PWORK_QUEUE_ITEM; -typedef ULONG_PTR ERESOURCE_THREAD, *PERESOURCE_THREAD; - -typedef struct _OWNER_ENTRY { - ERESOURCE_THREAD OwnerThread; - union { - struct { - ULONG IoPriorityBoosted:1; - ULONG OwnerReferenced:1; - ULONG OwnerCount:30; - }; - ULONG TableSize; - }; -} OWNER_ENTRY, *POWNER_ENTRY; - -typedef struct _ERESOURCE { - LIST_ENTRY SystemResourcesList; - POWNER_ENTRY OwnerTable; - SHORT ActiveCount; - USHORT Flag; - volatile PKSEMAPHORE SharedWaiters; - volatile PKEVENT ExclusiveWaiters; - OWNER_ENTRY OwnerEntry; - ULONG ActiveEntries; - ULONG ContentionCount; - ULONG NumberOfSharedWaiters; - ULONG NumberOfExclusiveWaiters; -#if defined(_WIN64) - PVOID Reserved2; -#endif - __GNU_EXTENSION union { - PVOID Address; - ULONG_PTR CreatorBackTraceIndex; - }; - KSPIN_LOCK SpinLock; -} ERESOURCE, *PERESOURCE; - -/* ERESOURCE.Flag */ -#define ResourceNeverExclusive 0x0010 -#define ResourceReleaseByOtherThread 0x0020 -#define ResourceOwnedExclusive 0x0080 - -#define RESOURCE_HASH_TABLE_SIZE 64 - -typedef struct _RESOURCE_HASH_ENTRY { - LIST_ENTRY ListEntry; - PVOID Address; - ULONG ContentionCount; - ULONG Number; -} RESOURCE_HASH_ENTRY, *PRESOURCE_HASH_ENTRY; - -typedef struct _RESOURCE_PERFORMANCE_DATA { - ULONG ActiveResourceCount; - ULONG TotalResourceCount; - ULONG ExclusiveAcquire; - ULONG SharedFirstLevel; - ULONG SharedSecondLevel; - ULONG StarveFirstLevel; - ULONG StarveSecondLevel; - ULONG WaitForExclusive; - ULONG OwnerTableExpands; - ULONG MaximumTableExpand; - LIST_ENTRY HashTable[RESOURCE_HASH_TABLE_SIZE]; -} RESOURCE_PERFORMANCE_DATA, *PRESOURCE_PERFORMANCE_DATA; - -/* Global debug flag */ -#if DEVL -extern ULONG NtGlobalFlag; -#define IF_NTOS_DEBUG(FlagName) if (NtGlobalFlag & (FLG_##FlagName)) -#else -#define IF_NTOS_DEBUG(FlagName) if(FALSE) -#endif - /****************************************************************************** * Security Manager Types * @@ -2393,144 +1972,6 @@ typedef enum _POWER_STATE_TYPE { DevicePowerState } POWER_STATE_TYPE, *PPOWER_STATE_TYPE; -#if (NTDDI_VERSION >= NTDDI_VISTA) -typedef struct _SYSTEM_POWER_STATE_CONTEXT { - union { - struct { - ULONG Reserved1:8; - ULONG TargetSystemState:4; - ULONG EffectiveSystemState:4; - ULONG CurrentSystemState:4; - ULONG IgnoreHibernationPath:1; - ULONG PseudoTransition:1; - ULONG Reserved2:10; - } DUMMYSTRUCTNAME; - ULONG ContextAsUlong; - } DUMMYUNIONNAME; -} SYSTEM_POWER_STATE_CONTEXT, *PSYSTEM_POWER_STATE_CONTEXT; -#endif - -#if (NTDDI_VERSION >= NTDDI_WIN7) -typedef struct _COUNTED_REASON_CONTEXT { - ULONG Version; - ULONG Flags; - union { - struct { - UNICODE_STRING ResourceFileName; - USHORT ResourceReasonId; - ULONG StringCount; - PUNICODE_STRING ReasonStrings; - } DUMMYSTRUCTNAME; - UNICODE_STRING SimpleString; - } DUMMYUNIONNAME; -} COUNTED_REASON_CONTEXT, *PCOUNTED_REASON_CONTEXT; -#endif - -#define IOCTL_QUERY_DEVICE_POWER_STATE \ - CTL_CODE(FILE_DEVICE_BATTERY, 0x0, METHOD_BUFFERED, FILE_READ_ACCESS) - -#define IOCTL_SET_DEVICE_WAKE \ - CTL_CODE(FILE_DEVICE_BATTERY, 0x1, METHOD_BUFFERED, FILE_WRITE_ACCESS) - -#define IOCTL_CANCEL_DEVICE_WAKE \ - CTL_CODE(FILE_DEVICE_BATTERY, 0x2, METHOD_BUFFERED, FILE_WRITE_ACCESS) - -#define ES_SYSTEM_REQUIRED 0x00000001 -#define ES_DISPLAY_REQUIRED 0x00000002 -#define ES_USER_PRESENT 0x00000004 -#define ES_CONTINUOUS 0x80000000 - -typedef ULONG EXECUTION_STATE, *PEXECUTION_STATE; - -typedef enum { - LT_DONT_CARE, - LT_LOWEST_LATENCY -} LATENCY_TIME; - -#if (_WIN32_WINNT >= _WIN32_WINNT_WIN7) -#define DIAGNOSTIC_REASON_VERSION 0 -#define DIAGNOSTIC_REASON_SIMPLE_STRING 0x00000001 -#define DIAGNOSTIC_REASON_DETAILED_STRING 0x00000002 -#define DIAGNOSTIC_REASON_NOT_SPECIFIED 0x80000000 -#define DIAGNOSTIC_REASON_INVALID_FLAGS (~0x80000003) -#endif - -#define POWER_REQUEST_CONTEXT_VERSION 0 -#define POWER_REQUEST_CONTEXT_SIMPLE_STRING 0x00000001 -#define POWER_REQUEST_CONTEXT_DETAILED_STRING 0x00000002 - -#define PowerRequestMaximum 3 - -typedef enum _POWER_REQUEST_TYPE { - PowerRequestDisplayRequired, - PowerRequestSystemRequired, - PowerRequestAwayModeRequired -} POWER_REQUEST_TYPE, *PPOWER_REQUEST_TYPE; - -#if (NTDDI_VERSION >= NTDDI_WINXP) - -#define PDCAP_D0_SUPPORTED 0x00000001 -#define PDCAP_D1_SUPPORTED 0x00000002 -#define PDCAP_D2_SUPPORTED 0x00000004 -#define PDCAP_D3_SUPPORTED 0x00000008 -#define PDCAP_WAKE_FROM_D0_SUPPORTED 0x00000010 -#define PDCAP_WAKE_FROM_D1_SUPPORTED 0x00000020 -#define PDCAP_WAKE_FROM_D2_SUPPORTED 0x00000040 -#define PDCAP_WAKE_FROM_D3_SUPPORTED 0x00000080 -#define PDCAP_WARM_EJECT_SUPPORTED 0x00000100 - -typedef struct CM_Power_Data_s { - ULONG PD_Size; - DEVICE_POWER_STATE PD_MostRecentPowerState; - ULONG PD_Capabilities; - ULONG PD_D1Latency; - ULONG PD_D2Latency; - ULONG PD_D3Latency; - DEVICE_POWER_STATE PD_PowerStateMapping[PowerSystemMaximum]; - SYSTEM_POWER_STATE PD_DeepestSystemWake; -} CM_POWER_DATA, *PCM_POWER_DATA; - -#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ - -typedef enum _SYSTEM_POWER_CONDITION { - PoAc, - PoDc, - PoHot, - PoConditionMaximum -} SYSTEM_POWER_CONDITION; - -typedef struct _SET_POWER_SETTING_VALUE { - ULONG Version; - GUID Guid; - SYSTEM_POWER_CONDITION PowerCondition; - ULONG DataLength; - UCHAR Data[ANYSIZE_ARRAY]; -} SET_POWER_SETTING_VALUE, *PSET_POWER_SETTING_VALUE; - -#define POWER_SETTING_VALUE_VERSION (0x1) - -typedef struct _NOTIFY_USER_POWER_SETTING { - GUID Guid; -} NOTIFY_USER_POWER_SETTING, *PNOTIFY_USER_POWER_SETTING; - -typedef struct _APPLICATIONLAUNCH_SETTING_VALUE { - LARGE_INTEGER ActivationTime; - ULONG Flags; - ULONG ButtonInstanceID; -} APPLICATIONLAUNCH_SETTING_VALUE, *PAPPLICATIONLAUNCH_SETTING_VALUE; - -typedef enum _POWER_PLATFORM_ROLE { - PlatformRoleUnspecified = 0, - PlatformRoleDesktop, - PlatformRoleMobile, - PlatformRoleWorkstation, - PlatformRoleEnterpriseServer, - PlatformRoleSOHOServer, - PlatformRoleAppliancePC, - PlatformRolePerformanceServer, - PlatformRoleMaximum -} POWER_PLATFORM_ROLE; - #if (NTDDI_VERSION >= NTDDI_WINXP) || !defined(_BATCLASS_) typedef struct { ULONG Granularity; @@ -2684,6 +2125,12 @@ NTSTATUS IN OUT PVOID Context OPTIONAL); typedef POWER_SETTING_CALLBACK *PPOWER_SETTING_CALLBACK; +#define PO_CB_SYSTEM_POWER_POLICY 0 +#define PO_CB_AC_STATUS 1 +#define PO_CB_BUTTON_COLLISION 2 +#define PO_CB_SYSTEM_STATE_LOCK 3 +#define PO_CB_LID_SWITCH_STATE 4 +#define PO_CB_PROCESSOR_POWER_POLICY 5 /****************************************************************************** * Configuration Manager Types * @@ -2775,15 +2222,6 @@ typedef int CM_RESOURCE_TYPE; REG_OPTION_BACKUP_RESTORE |\ REG_OPTION_OPEN_LINK) -#define REG_OPEN_LEGAL_OPTION \ - (REG_OPTION_RESERVED |\ - REG_OPTION_BACKUP_RESTORE |\ - REG_OPTION_OPEN_LINK) - -#define REG_STANDARD_FORMAT 1 -#define REG_LATEST_FORMAT 2 -#define REG_NO_COMPRESSION 4 - /* Key creation/open disposition */ #define REG_CREATED_NEW_KEY (0x00000001L) #define REG_OPENED_EXISTING_KEY (0x00000002L) @@ -2816,6 +2254,27 @@ typedef int CM_RESOURCE_TYPE; REG_NOTIFY_CHANGE_LAST_SET |\ REG_NOTIFY_CHANGE_SECURITY) +typedef struct _CM_FLOPPY_DEVICE_DATA { + USHORT Version; + USHORT Revision; + CHAR Size[8]; + ULONG MaxDensity; + ULONG MountDensity; + UCHAR StepRateHeadUnloadTime; + UCHAR HeadLoadTime; + UCHAR MotorOffTime; + UCHAR SectorLengthCode; + UCHAR SectorPerTrack; + UCHAR ReadWriteGapLength; + UCHAR DataTransferLength; + UCHAR FormatGapLength; + UCHAR FormatFillCharacter; + UCHAR HeadSettleTime; + UCHAR MotorSettleTime; + UCHAR MaximumTrackValue; + UCHAR DataTransferRate; +} CM_FLOPPY_DEVICE_DATA, *PCM_FLOPPY_DEVICE_DATA; + #include typedef struct _CM_PARTIAL_RESOURCE_DESCRIPTOR { UCHAR Type; @@ -2982,50 +2441,6 @@ typedef enum _CM_SHARE_DISPOSITION { #define CM_RESOURCE_DMA_TYPE_B 0x0020 #define CM_RESOURCE_DMA_TYPE_F 0x0040 -typedef struct _DEVICE_FLAGS { - ULONG Failed:1; - ULONG ReadOnly:1; - ULONG Removable:1; - ULONG ConsoleIn:1; - ULONG ConsoleOut:1; - ULONG Input:1; - ULONG Output:1; -} DEVICE_FLAGS, *PDEVICE_FLAGS; - -typedef enum _INTERFACE_TYPE { - InterfaceTypeUndefined = -1, - Internal, - Isa, - Eisa, - MicroChannel, - TurboChannel, - PCIBus, - VMEBus, - NuBus, - PCMCIABus, - CBus, - MPIBus, - MPSABus, - ProcessorInternal, - InternalPowerBus, - PNPISABus, - PNPBus, - Vmcs, - MaximumInterfaceType -} INTERFACE_TYPE, *PINTERFACE_TYPE; - -typedef struct _CM_COMPONENT_INFORMATION { - DEVICE_FLAGS Flags; - ULONG Version; - ULONG Key; - KAFFINITY AffinityMask; -} CM_COMPONENT_INFORMATION, *PCM_COMPONENT_INFORMATION; - -typedef struct _CM_ROM_BLOCK { - ULONG Address; - ULONG Size; -} CM_ROM_BLOCK, *PCM_ROM_BLOCK; - typedef struct _CM_PARTIAL_RESOURCE_LIST { USHORT Version; USHORT Revision; @@ -3044,12 +2459,6 @@ typedef struct _CM_RESOURCE_LIST { CM_FULL_RESOURCE_DESCRIPTOR List[1]; } CM_RESOURCE_LIST, *PCM_RESOURCE_LIST; -typedef struct _PNP_BUS_INFORMATION { - GUID BusTypeGuid; - INTERFACE_TYPE LegacyBusType; - ULONG BusNumber; -} PNP_BUS_INFORMATION, *PPNP_BUS_INFORMATION; - #include typedef struct _CM_INT13_DRIVE_PARAMETER { @@ -3060,14 +2469,6 @@ typedef struct _CM_INT13_DRIVE_PARAMETER { USHORT NumberDrives; } CM_INT13_DRIVE_PARAMETER, *PCM_INT13_DRIVE_PARAMETER; -typedef struct _CM_MCA_POS_DATA { - USHORT AdapterId; - UCHAR PosData1; - UCHAR PosData2; - UCHAR PosData3; - UCHAR PosData4; -} CM_MCA_POS_DATA, *PCM_MCA_POS_DATA; - typedef struct _CM_PNP_BIOS_DEVICE_NODE { USHORT Size; UCHAR Node; @@ -3109,82 +2510,50 @@ typedef struct _CM_KEYBOARD_DEVICE_DATA { USHORT KeyboardFlags; } CM_KEYBOARD_DEVICE_DATA, *PCM_KEYBOARD_DEVICE_DATA; +typedef struct _CM_MCA_POS_DATA { + USHORT AdapterId; + UCHAR PosData1; + UCHAR PosData2; + UCHAR PosData3; + UCHAR PosData4; +} CM_MCA_POS_DATA, *PCM_MCA_POS_DATA; + +#if (NTDDI_VERSION >= NTDDI_WINXP) +typedef struct CM_Power_Data_s { + ULONG PD_Size; + DEVICE_POWER_STATE PD_MostRecentPowerState; + ULONG PD_Capabilities; + ULONG PD_D1Latency; + ULONG PD_D2Latency; + ULONG PD_D3Latency; + DEVICE_POWER_STATE PD_PowerStateMapping[PowerSystemMaximum]; + SYSTEM_POWER_STATE PD_DeepestSystemWake; +} CM_POWER_DATA, *PCM_POWER_DATA; + +#define PDCAP_D0_SUPPORTED 0x00000001 +#define PDCAP_D1_SUPPORTED 0x00000002 +#define PDCAP_D2_SUPPORTED 0x00000004 +#define PDCAP_D3_SUPPORTED 0x00000008 +#define PDCAP_WAKE_FROM_D0_SUPPORTED 0x00000010 +#define PDCAP_WAKE_FROM_D1_SUPPORTED 0x00000020 +#define PDCAP_WAKE_FROM_D2_SUPPORTED 0x00000040 +#define PDCAP_WAKE_FROM_D3_SUPPORTED 0x00000080 +#define PDCAP_WARM_EJECT_SUPPORTED 0x00000100 + +#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ + typedef struct _CM_SCSI_DEVICE_DATA { USHORT Version; USHORT Revision; UCHAR HostIdentifier; } CM_SCSI_DEVICE_DATA, *PCM_SCSI_DEVICE_DATA; -typedef struct _CM_VIDEO_DEVICE_DATA { - USHORT Version; - USHORT Revision; - ULONG VideoClock; -} CM_VIDEO_DEVICE_DATA, *PCM_VIDEO_DEVICE_DATA; - -typedef struct _CM_SONIC_DEVICE_DATA { - USHORT Version; - USHORT Revision; - USHORT DataConfigurationRegister; - UCHAR EthernetAddress[8]; -} CM_SONIC_DEVICE_DATA, *PCM_SONIC_DEVICE_DATA; - typedef struct _CM_SERIAL_DEVICE_DATA { USHORT Version; USHORT Revision; ULONG BaudClock; } CM_SERIAL_DEVICE_DATA, *PCM_SERIAL_DEVICE_DATA; -typedef struct _CM_MONITOR_DEVICE_DATA { - USHORT Version; - USHORT Revision; - USHORT HorizontalScreenSize; - USHORT VerticalScreenSize; - USHORT HorizontalResolution; - USHORT VerticalResolution; - USHORT HorizontalDisplayTimeLow; - USHORT HorizontalDisplayTime; - USHORT HorizontalDisplayTimeHigh; - USHORT HorizontalBackPorchLow; - USHORT HorizontalBackPorch; - USHORT HorizontalBackPorchHigh; - USHORT HorizontalFrontPorchLow; - USHORT HorizontalFrontPorch; - USHORT HorizontalFrontPorchHigh; - USHORT HorizontalSyncLow; - USHORT HorizontalSync; - USHORT HorizontalSyncHigh; - USHORT VerticalBackPorchLow; - USHORT VerticalBackPorch; - USHORT VerticalBackPorchHigh; - USHORT VerticalFrontPorchLow; - USHORT VerticalFrontPorch; - USHORT VerticalFrontPorchHigh; - USHORT VerticalSyncLow; - USHORT VerticalSync; - USHORT VerticalSyncHigh; -} CM_MONITOR_DEVICE_DATA, *PCM_MONITOR_DEVICE_DATA; - -typedef struct _CM_FLOPPY_DEVICE_DATA { - USHORT Version; - USHORT Revision; - CHAR Size[8]; - ULONG MaxDensity; - ULONG MountDensity; - UCHAR StepRateHeadUnloadTime; - UCHAR HeadLoadTime; - UCHAR MotorOffTime; - UCHAR SectorLengthCode; - UCHAR SectorPerTrack; - UCHAR ReadWriteGapLength; - UCHAR DataTransferLength; - UCHAR FormatGapLength; - UCHAR FormatFillCharacter; - UCHAR HeadSettleTime; - UCHAR MotorSettleTime; - UCHAR MaximumTrackValue; - UCHAR DataTransferRate; -} CM_FLOPPY_DEVICE_DATA, *PCM_FLOPPY_DEVICE_DATA; - typedef enum _KEY_INFORMATION_CLASS { KeyBasicInformation, KeyNodeInformation, @@ -3204,10 +2573,6 @@ typedef struct _KEY_BASIC_INFORMATION { WCHAR Name[1]; } KEY_BASIC_INFORMATION, *PKEY_BASIC_INFORMATION; -typedef struct _KEY_CONTROL_FLAGS_INFORMATION { - ULONG ControlFlags; -} KEY_CONTROL_FLAGS_INFORMATION, *PKEY_CONTROL_FLAGS_INFORMATION; - typedef struct _KEY_FULL_INFORMATION { LARGE_INTEGER LastWriteTime; ULONG TitleIndex; @@ -3222,10 +2587,6 @@ typedef struct _KEY_FULL_INFORMATION { WCHAR Class[1]; } KEY_FULL_INFORMATION, *PKEY_FULL_INFORMATION; -typedef struct _KEY_HANDLE_TAGS_INFORMATION { - ULONG HandleTags; -} KEY_HANDLE_TAGS_INFORMATION, *PKEY_HANDLE_TAGS_INFORMATION; - typedef struct _KEY_NODE_INFORMATION { LARGE_INTEGER LastWriteTime; ULONG TitleIndex; @@ -3235,23 +2596,6 @@ typedef struct _KEY_NODE_INFORMATION { WCHAR Name[1]; } KEY_NODE_INFORMATION, *PKEY_NODE_INFORMATION; -typedef enum _KEY_SET_INFORMATION_CLASS { - KeyWriteTimeInformation, - KeyWow64FlagsInformation, - KeyControlFlagsInformation, - KeySetVirtualizationInformation, - KeySetDebugInformation, - KeySetHandleTagsInformation, - MaxKeySetInfoClass -} KEY_SET_INFORMATION_CLASS; - -typedef struct _KEY_SET_VIRTUALIZATION_INFORMATION { - ULONG VirtualTarget:1; - ULONG VirtualStore:1; - ULONG VirtualSource:1; - ULONG Reserved:29; -} KEY_SET_VIRTUALIZATION_INFORMATION, *PKEY_SET_VIRTUALIZATION_INFORMATION; - typedef struct _KEY_VALUE_BASIC_INFORMATION { ULONG TitleIndex; ULONG Type; @@ -3296,14 +2640,20 @@ typedef enum _KEY_VALUE_INFORMATION_CLASS { KeyValuePartialInformationAlign64 } KEY_VALUE_INFORMATION_CLASS; -typedef struct _KEY_WOW64_FLAGS_INFORMATION { - ULONG UserFlags; -} KEY_WOW64_FLAGS_INFORMATION, *PKEY_WOW64_FLAGS_INFORMATION; - typedef struct _KEY_WRITE_TIME_INFORMATION { LARGE_INTEGER LastWriteTime; } KEY_WRITE_TIME_INFORMATION, *PKEY_WRITE_TIME_INFORMATION; +typedef enum _KEY_SET_INFORMATION_CLASS { + KeyWriteTimeInformation, + KeyWow64FlagsInformation, + KeyControlFlagsInformation, + KeySetVirtualizationInformation, + KeySetDebugInformation, + KeySetHandleTagsInformation, + MaxKeySetInfoClass +} KEY_SET_INFORMATION_CLASS; + typedef enum _REG_NOTIFY_CLASS { RegNtDeleteKey, RegNtPreDeleteKey = RegNtDeleteKey, @@ -3473,54 +2823,6 @@ typedef struct _REG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION { PVOID Reserved; } REG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION, *PREG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION; -typedef struct _REG_RENAME_KEY_INFORMATION { - PVOID Object; - PUNICODE_STRING NewName; - PVOID CallContext; - PVOID ObjectContext; - PVOID Reserved; -} REG_RENAME_KEY_INFORMATION, *PREG_RENAME_KEY_INFORMATION; - -typedef struct _REG_CREATE_KEY_INFORMATION { - PUNICODE_STRING CompleteName; - PVOID RootObject; - PVOID ObjectType; - ULONG CreateOptions; - PUNICODE_STRING Class; - PVOID SecurityDescriptor; - PVOID SecurityQualityOfService; - ACCESS_MASK DesiredAccess; - ACCESS_MASK GrantedAccess; - PULONG Disposition; - PVOID *ResultObject; - PVOID CallContext; - PVOID RootObjectContext; - PVOID Transaction; - PVOID Reserved; -} REG_CREATE_KEY_INFORMATION, REG_OPEN_KEY_INFORMATION,*PREG_CREATE_KEY_INFORMATION, *PREG_OPEN_KEY_INFORMATION; - -typedef struct _REG_CREATE_KEY_INFORMATION_V1 { - PUNICODE_STRING CompleteName; - PVOID RootObject; - PVOID ObjectType; - ULONG Options; - PUNICODE_STRING Class; - PVOID SecurityDescriptor; - PVOID SecurityQualityOfService; - ACCESS_MASK DesiredAccess; - ACCESS_MASK GrantedAccess; - PULONG Disposition; - PVOID *ResultObject; - PVOID CallContext; - PVOID RootObjectContext; - PVOID Transaction; - ULONG_PTR Version; - PUNICODE_STRING RemainingName; - ULONG Wow64Flags; - ULONG Attributes; - KPROCESSOR_MODE CheckAccessMode; -} REG_CREATE_KEY_INFORMATION_V1, REG_OPEN_KEY_INFORMATION_V1,*PREG_CREATE_KEY_INFORMATION_V1, *PREG_OPEN_KEY_INFORMATION_V1; - typedef struct _REG_PRE_CREATE_KEY_INFORMATION { PUNICODE_STRING CompleteName; } REG_PRE_CREATE_KEY_INFORMATION, REG_PRE_OPEN_KEY_INFORMATION,*PREG_PRE_CREATE_KEY_INFORMATION, *PREG_PRE_OPEN_KEY_INFORMATION;; @@ -3548,83 +2850,142 @@ typedef struct _REG_KEY_HANDLE_CLOSE_INFORMATION { PVOID Reserved; } REG_KEY_HANDLE_CLOSE_INFORMATION, *PREG_KEY_HANDLE_CLOSE_INFORMATION; -#if (NTDDI_VERSION >= NTDDI_VISTA) +/****************************************************************************** + * I/O Manager Types * + ******************************************************************************/ -typedef struct _REG_LOAD_KEY_INFORMATION { - PVOID Object; - PUNICODE_STRING KeyName; - PUNICODE_STRING SourceFile; - ULONG Flags; - PVOID TrustClassObject; - PVOID UserEvent; - ACCESS_MASK DesiredAccess; - PHANDLE RootHandle; - PVOID CallContext; - PVOID ObjectContext; - PVOID Reserved; -} REG_LOAD_KEY_INFORMATION, *PREG_LOAD_KEY_INFORMATION; + /* PCI_COMMON_CONFIG.Command */ +#define PCI_ENABLE_IO_SPACE 0x0001 +#define PCI_ENABLE_MEMORY_SPACE 0x0002 +#define PCI_ENABLE_BUS_MASTER 0x0004 +#define PCI_ENABLE_SPECIAL_CYCLES 0x0008 +#define PCI_ENABLE_WRITE_AND_INVALIDATE 0x0010 +#define PCI_ENABLE_VGA_COMPATIBLE_PALETTE 0x0020 +#define PCI_ENABLE_PARITY 0x0040 +#define PCI_ENABLE_WAIT_CYCLE 0x0080 +#define PCI_ENABLE_SERR 0x0100 +#define PCI_ENABLE_FAST_BACK_TO_BACK 0x0200 +#define PCI_DISABLE_LEVEL_INTERRUPT 0x0400 -typedef struct _REG_UNLOAD_KEY_INFORMATION { - PVOID Object; - PVOID UserEvent; - PVOID CallContext; - PVOID ObjectContext; - PVOID Reserved; -} REG_UNLOAD_KEY_INFORMATION, *PREG_UNLOAD_KEY_INFORMATION; +/* PCI_COMMON_CONFIG.Status */ +#define PCI_STATUS_INTERRUPT_PENDING 0x0008 +#define PCI_STATUS_CAPABILITIES_LIST 0x0010 +#define PCI_STATUS_66MHZ_CAPABLE 0x0020 +#define PCI_STATUS_UDF_SUPPORTED 0x0040 +#define PCI_STATUS_FAST_BACK_TO_BACK 0x0080 +#define PCI_STATUS_DATA_PARITY_DETECTED 0x0100 +#define PCI_STATUS_DEVSEL 0x0600 +#define PCI_STATUS_SIGNALED_TARGET_ABORT 0x0800 +#define PCI_STATUS_RECEIVED_TARGET_ABORT 0x1000 +#define PCI_STATUS_RECEIVED_MASTER_ABORT 0x2000 +#define PCI_STATUS_SIGNALED_SYSTEM_ERROR 0x4000 +#define PCI_STATUS_DETECTED_PARITY_ERROR 0x8000 -typedef struct _REG_CALLBACK_CONTEXT_CLEANUP_INFORMATION { - PVOID Object; - PVOID ObjectContext; - PVOID Reserved; -} REG_CALLBACK_CONTEXT_CLEANUP_INFORMATION, *PREG_CALLBACK_CONTEXT_CLEANUP_INFORMATION; +/* PCI_COMMON_CONFIG.HeaderType */ +#define PCI_MULTIFUNCTION 0x80 +#define PCI_DEVICE_TYPE 0x00 +#define PCI_BRIDGE_TYPE 0x01 +#define PCI_CARDBUS_BRIDGE_TYPE 0x02 -typedef struct _REG_QUERY_KEY_SECURITY_INFORMATION { - PVOID Object; - PSECURITY_INFORMATION SecurityInformation; - PSECURITY_DESCRIPTOR SecurityDescriptor; - PULONG Length; - PVOID CallContext; - PVOID ObjectContext; - PVOID Reserved; -} REG_QUERY_KEY_SECURITY_INFORMATION, *PREG_QUERY_KEY_SECURITY_INFORMATION; +#define PCI_CONFIGURATION_TYPE(PciData) \ + (((PPCI_COMMON_CONFIG) (PciData))->HeaderType & ~PCI_MULTIFUNCTION) -typedef struct _REG_SET_KEY_SECURITY_INFORMATION { - PVOID Object; - PSECURITY_INFORMATION SecurityInformation; - PSECURITY_DESCRIPTOR SecurityDescriptor; - PVOID CallContext; - PVOID ObjectContext; - PVOID Reserved; -} REG_SET_KEY_SECURITY_INFORMATION, *PREG_SET_KEY_SECURITY_INFORMATION; +#define PCI_MULTIFUNCTION_DEVICE(PciData) \ + ((((PPCI_COMMON_CONFIG) (PciData))->HeaderType & PCI_MULTIFUNCTION) != 0) -typedef struct _REG_RESTORE_KEY_INFORMATION { - PVOID Object; - HANDLE FileHandle; - ULONG Flags; - PVOID CallContext; - PVOID ObjectContext; - PVOID Reserved; -} REG_RESTORE_KEY_INFORMATION, *PREG_RESTORE_KEY_INFORMATION; +/* PCI device classes */ +#define PCI_CLASS_PRE_20 0x00 +#define PCI_CLASS_MASS_STORAGE_CTLR 0x01 +#define PCI_CLASS_NETWORK_CTLR 0x02 +#define PCI_CLASS_DISPLAY_CTLR 0x03 +#define PCI_CLASS_MULTIMEDIA_DEV 0x04 +#define PCI_CLASS_MEMORY_CTLR 0x05 +#define PCI_CLASS_BRIDGE_DEV 0x06 +#define PCI_CLASS_SIMPLE_COMMS_CTLR 0x07 +#define PCI_CLASS_BASE_SYSTEM_DEV 0x08 +#define PCI_CLASS_INPUT_DEV 0x09 +#define PCI_CLASS_DOCKING_STATION 0x0a +#define PCI_CLASS_PROCESSOR 0x0b +#define PCI_CLASS_SERIAL_BUS_CTLR 0x0c +#define PCI_CLASS_WIRELESS_CTLR 0x0d +#define PCI_CLASS_INTELLIGENT_IO_CTLR 0x0e +#define PCI_CLASS_SATELLITE_COMMS_CTLR 0x0f +#define PCI_CLASS_ENCRYPTION_DECRYPTION 0x10 +#define PCI_CLASS_DATA_ACQ_SIGNAL_PROC 0x11 -typedef struct _REG_SAVE_KEY_INFORMATION { - PVOID Object; - HANDLE FileHandle; - ULONG Format; - PVOID CallContext; - PVOID ObjectContext; - PVOID Reserved; -} REG_SAVE_KEY_INFORMATION, *PREG_SAVE_KEY_INFORMATION; +/* PCI device subclasses for class 0 */ +#define PCI_SUBCLASS_PRE_20_NON_VGA 0x00 +#define PCI_SUBCLASS_PRE_20_VGA 0x01 -typedef struct _REG_REPLACE_KEY_INFORMATION { - PVOID Object; - PUNICODE_STRING OldFileName; - PUNICODE_STRING NewFileName; - PVOID CallContext; - PVOID ObjectContext; - PVOID Reserved; -} REG_REPLACE_KEY_INFORMATION, *PREG_REPLACE_KEY_INFORMATION; +/* PCI device subclasses for class 1 (mass storage controllers)*/ +#define PCI_SUBCLASS_MSC_SCSI_BUS_CTLR 0x00 +#define PCI_SUBCLASS_MSC_IDE_CTLR 0x01 +#define PCI_SUBCLASS_MSC_FLOPPY_CTLR 0x02 +#define PCI_SUBCLASS_MSC_IPI_CTLR 0x03 +#define PCI_SUBCLASS_MSC_RAID_CTLR 0x04 +#define PCI_SUBCLASS_MSC_OTHER 0x80 -#endif /* NTDDI_VERSION >= NTDDI_VISTA */ +/* PCI device subclasses for class 2 (network controllers)*/ +#define PCI_SUBCLASS_NET_ETHERNET_CTLR 0x00 +#define PCI_SUBCLASS_NET_TOKEN_RING_CTLR 0x01 +#define PCI_SUBCLASS_NET_FDDI_CTLR 0x02 +#define PCI_SUBCLASS_NET_ATM_CTLR 0x03 +#define PCI_SUBCLASS_NET_ISDN_CTLR 0x04 +#define PCI_SUBCLASS_NET_OTHER 0x80 + +/* PCI device subclasses for class 3 (display controllers)*/ +#define PCI_SUBCLASS_VID_VGA_CTLR 0x00 +#define PCI_SUBCLASS_VID_XGA_CTLR 0x01 +#define PCI_SUBCLASS_VID_3D_CTLR 0x02 +#define PCI_SUBCLASS_VID_OTHER 0x80 + +/* PCI device subclasses for class 4 (multimedia device)*/ +#define PCI_SUBCLASS_MM_VIDEO_DEV 0x00 +#define PCI_SUBCLASS_MM_AUDIO_DEV 0x01 +#define PCI_SUBCLASS_MM_TELEPHONY_DEV 0x02 +#define PCI_SUBCLASS_MM_OTHER 0x80 + +/* PCI device subclasses for class 5 (memory controller)*/ +#define PCI_SUBCLASS_MEM_RAM 0x00 +#define PCI_SUBCLASS_MEM_FLASH 0x01 +#define PCI_SUBCLASS_MEM_OTHER 0x80 + +/* PCI device subclasses for class 6 (bridge device)*/ +#define PCI_SUBCLASS_BR_HOST 0x00 +#define PCI_SUBCLASS_BR_ISA 0x01 +#define PCI_SUBCLASS_BR_EISA 0x02 +#define PCI_SUBCLASS_BR_MCA 0x03 +#define PCI_SUBCLASS_BR_PCI_TO_PCI 0x04 +#define PCI_SUBCLASS_BR_PCMCIA 0x05 +#define PCI_SUBCLASS_BR_NUBUS 0x06 +#define PCI_SUBCLASS_BR_CARDBUS 0x07 +#define PCI_SUBCLASS_BR_RACEWAY 0x08 +#define PCI_SUBCLASS_BR_OTHER 0x80 + +/* PCI device subclasses for class C (serial bus controller)*/ +#define PCI_SUBCLASS_SB_IEEE1394 0x00 +#define PCI_SUBCLASS_SB_ACCESS 0x01 +#define PCI_SUBCLASS_SB_SSA 0x02 +#define PCI_SUBCLASS_SB_USB 0x03 +#define PCI_SUBCLASS_SB_FIBRE_CHANNEL 0x04 +#define PCI_SUBCLASS_SB_SMBUS 0x05 + +#define PCI_MAX_DEVICES 32 +#define PCI_MAX_FUNCTION 8 +#define PCI_MAX_BRIDGE_NUMBER 0xFF +#define PCI_INVALID_VENDORID 0xFFFF +#define PCI_COMMON_HDR_LENGTH (FIELD_OFFSET(PCI_COMMON_CONFIG, DeviceSpecific)) + +#define PCI_ADDRESS_IO_SPACE 0x00000001 +#define PCI_ADDRESS_MEMORY_TYPE_MASK 0x00000006 +#define PCI_ADDRESS_MEMORY_PREFETCHABLE 0x00000008 +#define PCI_ADDRESS_IO_ADDRESS_MASK 0xfffffffc +#define PCI_ADDRESS_MEMORY_ADDRESS_MASK 0xfffffff0 +#define PCI_ADDRESS_ROM_ADDRESS_MASK 0xfffff800 + +#define PCI_TYPE_32BIT 0 +#define PCI_TYPE_20BIT 2 +#define PCI_TYPE_64BIT 4 #define SERVICE_KERNEL_DRIVER 0x00000001 #define SERVICE_FILE_SYSTEM_DRIVER 0x00000002 @@ -3691,37 +3052,14 @@ typedef enum _CM_ERROR_CONTROL_TYPE { CM_SERVICE_VIRTUAL_DISK_BOOT_LOAD | \ CM_SERVICE_USB_DISK_BOOT_LOAD) -/****************************************************************************** - * I/O Manager Types * - ******************************************************************************/ - -#define WDM_MAJORVERSION 0x06 -#define WDM_MINORVERSION 0x00 - -#if defined(_WIN64) - -#ifndef USE_DMA_MACROS -#define USE_DMA_MACROS -#endif - -#ifndef NO_LEGACY_DRIVERS -#define NO_LEGACY_DRIVERS -#endif - -#endif /* defined(_WIN64) */ - -#define STATUS_CONTINUE_COMPLETION STATUS_SUCCESS - -#define CONNECT_FULLY_SPECIFIED 0x1 -#define CONNECT_LINE_BASED 0x2 -#define CONNECT_MESSAGE_BASED 0x3 -#define CONNECT_FULLY_SPECIFIED_GROUP 0x4 -#define CONNECT_CURRENT_VERSION 0x4 - #define POOL_COLD_ALLOCATION 256 #define POOL_QUOTA_FAIL_INSTEAD_OF_RAISE 8 #define POOL_RAISE_IF_ALLOCATION_FAILURE 16 +#define PCI_TYPE0_ADDRESSES 6 +#define PCI_TYPE1_ADDRESSES 2 +#define PCI_TYPE2_ADDRESSES 5 + #define IO_TYPE_ADAPTER 1 #define IO_TYPE_CONTROLLER 2 #define IO_TYPE_DEVICE 3 @@ -3745,6 +3083,47 @@ typedef enum _CM_ERROR_CONTROL_TYPE { #define IO_RESOURCE_DEFAULT 0x02 #define IO_RESOURCE_ALTERNATIVE 0x08 +/* DEVICE_OBJECT.Flags */ +#define DO_VERIFY_VOLUME 0x00000002 +#define DO_BUFFERED_IO 0x00000004 +#define DO_EXCLUSIVE 0x00000008 +#define DO_DIRECT_IO 0x00000010 +#define DO_MAP_IO_BUFFER 0x00000020 +#define DO_DEVICE_INITIALIZING 0x00000080 +#define DO_SHUTDOWN_REGISTERED 0x00000800 +#define DO_BUS_ENUMERATED_DEVICE 0x00001000 +#define DO_POWER_PAGABLE 0x00002000 +#define DO_POWER_INRUSH 0x00004000 + +/* DEVICE_OBJECT.Characteristics */ +#define FILE_REMOVABLE_MEDIA 0x00000001 +#define FILE_READ_ONLY_DEVICE 0x00000002 +#define FILE_FLOPPY_DISKETTE 0x00000004 +#define FILE_WRITE_ONCE_MEDIA 0x00000008 +#define FILE_REMOTE_DEVICE 0x00000010 +#define FILE_DEVICE_IS_MOUNTED 0x00000020 +#define FILE_VIRTUAL_VOLUME 0x00000040 +#define FILE_AUTOGENERATED_DEVICE_NAME 0x00000080 +#define FILE_DEVICE_SECURE_OPEN 0x00000100 +#define FILE_CHARACTERISTIC_PNP_DEVICE 0x00000800 +#define FILE_CHARACTERISTIC_TS_DEVICE 0x00001000 +#define FILE_CHARACTERISTIC_WEBDAV_DEVICE 0x00002000 + +/* DEVICE_OBJECT.AlignmentRequirement */ +#define FILE_BYTE_ALIGNMENT 0x00000000 +#define FILE_WORD_ALIGNMENT 0x00000001 +#define FILE_LONG_ALIGNMENT 0x00000003 +#define FILE_QUAD_ALIGNMENT 0x00000007 +#define FILE_OCTA_ALIGNMENT 0x0000000f +#define FILE_32_BYTE_ALIGNMENT 0x0000001f +#define FILE_64_BYTE_ALIGNMENT 0x0000003f +#define FILE_128_BYTE_ALIGNMENT 0x0000007f +#define FILE_256_BYTE_ALIGNMENT 0x000000ff +#define FILE_512_BYTE_ALIGNMENT 0x000001ff + +/* DEVICE_OBJECT.DeviceType */ +#define DEVICE_TYPE ULONG + #define FILE_DEVICE_BEEP 0x00000001 #define FILE_DEVICE_CD_ROM 0x00000002 #define FILE_DEVICE_CD_ROM_FILE_SYSTEM 0x00000003 @@ -3813,44 +3192,6 @@ typedef enum _CM_ERROR_CONTROL_TYPE { #define FILE_DEVICE_BIOMETRIC 0x00000044 #define FILE_DEVICE_PMI 0x00000045 -#if defined(NT_PROCESSOR_GROUPS) - -typedef USHORT IRQ_DEVICE_POLICY, *PIRQ_DEVICE_POLICY; - -typedef enum _IRQ_DEVICE_POLICY_USHORT { - IrqPolicyMachineDefault = 0, - IrqPolicyAllCloseProcessors = 1, - IrqPolicyOneCloseProcessor = 2, - IrqPolicyAllProcessorsInMachine = 3, - IrqPolicyAllProcessorsInGroup = 3, - IrqPolicySpecifiedProcessors = 4, - IrqPolicySpreadMessagesAcrossAllProcessors = 5}; - -#else /* defined(NT_PROCESSOR_GROUPS) */ - -typedef enum _IRQ_DEVICE_POLICY { - IrqPolicyMachineDefault = 0, - IrqPolicyAllCloseProcessors, - IrqPolicyOneCloseProcessor, - IrqPolicyAllProcessorsInMachine, - IrqPolicySpecifiedProcessors, - IrqPolicySpreadMessagesAcrossAllProcessors -} IRQ_DEVICE_POLICY, *PIRQ_DEVICE_POLICY; - -#endif - -typedef enum _IRQ_PRIORITY { - IrqPriorityUndefined = 0, - IrqPriorityLow, - IrqPriorityNormal, - IrqPriorityHigh -} IRQ_PRIORITY, *PIRQ_PRIORITY; - -typedef enum _IRQ_GROUP_POLICY { - GroupAffinityAllGroupZero = 0, - GroupAffinityDontCare -} IRQ_GROUP_POLICY, *PIRQ_GROUP_POLICY; - #define MAXIMUM_VOLUME_LABEL_LENGTH (32 * sizeof(WCHAR)) typedef struct _OBJECT_HANDLE_INFORMATION { @@ -3863,6 +3204,10 @@ typedef struct _CLIENT_ID { HANDLE UniqueThread; } CLIENT_ID, *PCLIENT_ID; +typedef VOID +(NTAPI *PKSTART_ROUTINE)( + IN PVOID StartContext); + typedef struct _VPB { CSHORT Type; CSHORT Size; @@ -3899,47 +3244,6 @@ typedef struct _WAIT_CONTEXT_BLOCK { PKDPC BufferChainingDpc; } WAIT_CONTEXT_BLOCK, *PWAIT_CONTEXT_BLOCK; -/* DEVICE_OBJECT.Flags */ -#define DO_VERIFY_VOLUME 0x00000002 -#define DO_BUFFERED_IO 0x00000004 -#define DO_EXCLUSIVE 0x00000008 -#define DO_DIRECT_IO 0x00000010 -#define DO_MAP_IO_BUFFER 0x00000020 -#define DO_DEVICE_INITIALIZING 0x00000080 -#define DO_SHUTDOWN_REGISTERED 0x00000800 -#define DO_BUS_ENUMERATED_DEVICE 0x00001000 -#define DO_POWER_PAGABLE 0x00002000 -#define DO_POWER_INRUSH 0x00004000 - -/* DEVICE_OBJECT.Characteristics */ -#define FILE_REMOVABLE_MEDIA 0x00000001 -#define FILE_READ_ONLY_DEVICE 0x00000002 -#define FILE_FLOPPY_DISKETTE 0x00000004 -#define FILE_WRITE_ONCE_MEDIA 0x00000008 -#define FILE_REMOTE_DEVICE 0x00000010 -#define FILE_DEVICE_IS_MOUNTED 0x00000020 -#define FILE_VIRTUAL_VOLUME 0x00000040 -#define FILE_AUTOGENERATED_DEVICE_NAME 0x00000080 -#define FILE_DEVICE_SECURE_OPEN 0x00000100 -#define FILE_CHARACTERISTIC_PNP_DEVICE 0x00000800 -#define FILE_CHARACTERISTIC_TS_DEVICE 0x00001000 -#define FILE_CHARACTERISTIC_WEBDAV_DEVICE 0x00002000 - -/* DEVICE_OBJECT.AlignmentRequirement */ -#define FILE_BYTE_ALIGNMENT 0x00000000 -#define FILE_WORD_ALIGNMENT 0x00000001 -#define FILE_LONG_ALIGNMENT 0x00000003 -#define FILE_QUAD_ALIGNMENT 0x00000007 -#define FILE_OCTA_ALIGNMENT 0x0000000f -#define FILE_32_BYTE_ALIGNMENT 0x0000001f -#define FILE_64_BYTE_ALIGNMENT 0x0000003f -#define FILE_128_BYTE_ALIGNMENT 0x0000007f -#define FILE_256_BYTE_ALIGNMENT 0x000000ff -#define FILE_512_BYTE_ALIGNMENT 0x000001ff - -/* DEVICE_OBJECT.DeviceType */ -#define DEVICE_TYPE ULONG - typedef struct _DEVICE_OBJECT { CSHORT Type; USHORT Size; @@ -3971,153 +3275,6 @@ typedef struct _DEVICE_OBJECT { PVOID Reserved; } DEVICE_OBJECT, *PDEVICE_OBJECT; -typedef enum _IO_SESSION_STATE { - IoSessionStateCreated = 1, - IoSessionStateInitialized, - IoSessionStateConnected, - IoSessionStateDisconnected, - IoSessionStateDisconnectedLoggedOn, - IoSessionStateLoggedOn, - IoSessionStateLoggedOff, - IoSessionStateTerminated, - IoSessionStateMax -} IO_SESSION_STATE, *PIO_SESSION_STATE; - -typedef enum _IO_COMPLETION_ROUTINE_RESULT { - ContinueCompletion = STATUS_CONTINUE_COMPLETION, - StopCompletion = STATUS_MORE_PROCESSING_REQUIRED -} IO_COMPLETION_ROUTINE_RESULT, *PIO_COMPLETION_ROUTINE_RESULT; - -typedef struct _IO_INTERRUPT_MESSAGE_INFO_ENTRY { - PHYSICAL_ADDRESS MessageAddress; - KAFFINITY TargetProcessorSet; - PKINTERRUPT InterruptObject; - ULONG MessageData; - ULONG Vector; - KIRQL Irql; - KINTERRUPT_MODE Mode; - KINTERRUPT_POLARITY Polarity; -} IO_INTERRUPT_MESSAGE_INFO_ENTRY, *PIO_INTERRUPT_MESSAGE_INFO_ENTRY; - -typedef struct _IO_INTERRUPT_MESSAGE_INFO { - KIRQL UnifiedIrql; - ULONG MessageCount; - IO_INTERRUPT_MESSAGE_INFO_ENTRY MessageInfo[1]; -} IO_INTERRUPT_MESSAGE_INFO, *PIO_INTERRUPT_MESSAGE_INFO; - -typedef struct _IO_CONNECT_INTERRUPT_FULLY_SPECIFIED_PARAMETERS { - IN PDEVICE_OBJECT PhysicalDeviceObject; - OUT PKINTERRUPT *InterruptObject; - IN PKSERVICE_ROUTINE ServiceRoutine; - IN PVOID ServiceContext; - IN PKSPIN_LOCK SpinLock OPTIONAL; - IN KIRQL SynchronizeIrql; - IN BOOLEAN FloatingSave; - IN BOOLEAN ShareVector; - IN ULONG Vector; - IN KIRQL Irql; - IN KINTERRUPT_MODE InterruptMode; - IN KAFFINITY ProcessorEnableMask; - IN USHORT Group; -} IO_CONNECT_INTERRUPT_FULLY_SPECIFIED_PARAMETERS, *PIO_CONNECT_INTERRUPT_FULLY_SPECIFIED_PARAMETERS; - -typedef struct _IO_CONNECT_INTERRUPT_LINE_BASED_PARAMETERS { - IN PDEVICE_OBJECT PhysicalDeviceObject; - OUT PKINTERRUPT *InterruptObject; - IN PKSERVICE_ROUTINE ServiceRoutine; - IN PVOID ServiceContext; - IN PKSPIN_LOCK SpinLock OPTIONAL; - IN KIRQL SynchronizeIrql OPTIONAL; - IN BOOLEAN FloatingSave; -} IO_CONNECT_INTERRUPT_LINE_BASED_PARAMETERS, *PIO_CONNECT_INTERRUPT_LINE_BASED_PARAMETERS; - -typedef struct _IO_CONNECT_INTERRUPT_MESSAGE_BASED_PARAMETERS { - IN PDEVICE_OBJECT PhysicalDeviceObject; - union { - OUT PVOID *Generic; - OUT PIO_INTERRUPT_MESSAGE_INFO *InterruptMessageTable; - OUT PKINTERRUPT *InterruptObject; - } ConnectionContext; - IN PKMESSAGE_SERVICE_ROUTINE MessageServiceRoutine; - IN PVOID ServiceContext; - IN PKSPIN_LOCK SpinLock OPTIONAL; - IN KIRQL SynchronizeIrql OPTIONAL; - IN BOOLEAN FloatingSave; - IN PKSERVICE_ROUTINE FallBackServiceRoutine OPTIONAL; -} IO_CONNECT_INTERRUPT_MESSAGE_BASED_PARAMETERS, *PIO_CONNECT_INTERRUPT_MESSAGE_BASED_PARAMETERS; - -typedef struct _IO_CONNECT_INTERRUPT_PARAMETERS { - IN OUT ULONG Version; - union { - IO_CONNECT_INTERRUPT_FULLY_SPECIFIED_PARAMETERS FullySpecified; - IO_CONNECT_INTERRUPT_LINE_BASED_PARAMETERS LineBased; - IO_CONNECT_INTERRUPT_MESSAGE_BASED_PARAMETERS MessageBased; - }; -} IO_CONNECT_INTERRUPT_PARAMETERS, *PIO_CONNECT_INTERRUPT_PARAMETERS; - -typedef struct _IO_DISCONNECT_INTERRUPT_PARAMETERS { - IN ULONG Version; - union { - IN PVOID Generic; - IN PKINTERRUPT InterruptObject; - IN PIO_INTERRUPT_MESSAGE_INFO InterruptMessageTable; - } ConnectionContext; -} IO_DISCONNECT_INTERRUPT_PARAMETERS, *PIO_DISCONNECT_INTERRUPT_PARAMETERS; - -typedef enum _IO_ACCESS_TYPE { - ReadAccess, - WriteAccess, - ModifyAccess -} IO_ACCESS_TYPE; - -typedef enum _IO_ACCESS_MODE { - SequentialAccess, - RandomAccess -} IO_ACCESS_MODE; - -typedef enum _IO_CONTAINER_NOTIFICATION_CLASS { - IoSessionStateNotification, - IoMaxContainerNotificationClass -} IO_CONTAINER_NOTIFICATION_CLASS; - -typedef struct _IO_SESSION_STATE_NOTIFICATION { - ULONG Size; - ULONG Flags; - PVOID IoObject; - ULONG EventMask; - PVOID Context; -} IO_SESSION_STATE_NOTIFICATION, *PIO_SESSION_STATE_NOTIFICATION; - -typedef enum _IO_CONTAINER_INFORMATION_CLASS { - IoSessionStateInformation, - IoMaxContainerInformationClass -} IO_CONTAINER_INFORMATION_CLASS; - -typedef struct _IO_SESSION_STATE_INFORMATION { - ULONG SessionId; - IO_SESSION_STATE SessionState; - BOOLEAN LocalSession; -} IO_SESSION_STATE_INFORMATION, *PIO_SESSION_STATE_INFORMATION; - -#if (NTDDI_VERSION >= NTDDI_WIN7) - -typedef NTSTATUS -(NTAPI *PIO_CONTAINER_NOTIFICATION_FUNCTION)( - VOID); - -typedef NTSTATUS -(NTAPI IO_SESSION_NOTIFICATION_FUNCTION)( - IN PVOID SessionObject, - IN PVOID IoObject, - IN ULONG Event, - IN PVOID Context, - IN PVOID NotificationPayload, - IN ULONG PayloadLength); - -typedef IO_SESSION_NOTIFICATION_FUNCTION *PIO_SESSION_NOTIFICATION_FUNCTION; - -#endif - typedef struct _IO_REMOVE_LOCK_TRACKING_BLOCK * PIO_REMOVE_LOCK_TRACKING_BLOCK; typedef struct _IO_REMOVE_LOCK_COMMON_BLOCK { @@ -4246,6 +3403,22 @@ typedef struct _SHARE_ACCESS { } type2; \ } u; +typedef struct _PCI_COMMON_HEADER { + PCI_COMMON_HEADER_LAYOUT +} PCI_COMMON_HEADER, *PPCI_COMMON_HEADER; + +#ifdef __cplusplus +typedef struct _PCI_COMMON_CONFIG { + PCI_COMMON_HEADER_LAYOUT + UCHAR DeviceSpecific[192]; +} PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG; +#else +typedef struct _PCI_COMMON_CONFIG { + PCI_COMMON_HEADER DUMMYSTRUCTNAME; + UCHAR DeviceSpecific[192]; +} PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG; +#endif + typedef enum _CREATE_FILE_TYPE { CreateFileTypeNone, CreateFileTypeNamedPipe, @@ -4266,12 +3439,16 @@ typedef struct _IO_STATUS_BLOCK { ULONG_PTR Information; } IO_STATUS_BLOCK, *PIO_STATUS_BLOCK; -#if defined(_WIN64) -typedef struct _IO_STATUS_BLOCK32 { - NTSTATUS Status; - ULONG Information; -} IO_STATUS_BLOCK32, *PIO_STATUS_BLOCK32; -#endif +typedef struct _PCI_SLOT_NUMBER { + union { + struct { + ULONG DeviceNumber : 5; + ULONG FunctionNumber : 3; + ULONG Reserved : 24; + } bits; + ULONG AsULONG; + } u; +} PCI_SLOT_NUMBER, *PPCI_SLOT_NUMBER; typedef VOID (NTAPI *PIO_APC_ROUTINE)( @@ -4279,35 +3456,16 @@ typedef VOID IN PIO_STATUS_BLOCK IoStatusBlock, IN ULONG Reserved); -#define PIO_APC_ROUTINE_DEFINED +typedef VOID +(NTAPI *WMI_NOTIFICATION_CALLBACK)( + PVOID Wnode, + PVOID Context); -typedef enum _IO_SESSION_EVENT { - IoSessionEventIgnore = 0, - IoSessionEventCreated, - IoSessionEventTerminated, - IoSessionEventConnected, - IoSessionEventDisconnected, - IoSessionEventLogon, - IoSessionEventLogoff, - IoSessionEventMax -} IO_SESSION_EVENT, *PIO_SESSION_EVENT; - -#define IO_SESSION_STATE_ALL_EVENTS 0xffffffff -#define IO_SESSION_STATE_CREATION_EVENT 0x00000001 -#define IO_SESSION_STATE_TERMINATION_EVENT 0x00000002 -#define IO_SESSION_STATE_CONNECT_EVENT 0x00000004 -#define IO_SESSION_STATE_DISCONNECT_EVENT 0x00000008 -#define IO_SESSION_STATE_LOGON_EVENT 0x00000010 -#define IO_SESSION_STATE_LOGOFF_EVENT 0x00000020 - -#define IO_SESSION_STATE_VALID_EVENT_MASK 0x0000003f - -#define IO_SESSION_MAX_PAYLOAD_SIZE 256L - -typedef struct _IO_SESSION_CONNECT_INFO { - ULONG SessionId; - BOOLEAN LocalSession; -} IO_SESSION_CONNECT_INFO, *PIO_SESSION_CONNECT_INFO; +#define WMIREG_ACTION_REGISTER 1 +#define WMIREG_ACTION_DEREGISTER 2 +#define WMIREG_ACTION_REREGISTER 3 +#define WMIREG_ACTION_UPDATE_GUIDS 4 +#define WMIREG_ACTION_BLOCK_IRPS 5 #define EVENT_INCREMENT 1 #define IO_NO_INCREMENT 0 @@ -4376,7 +3534,6 @@ typedef struct _BOOTDISK_INFORMATION_LITE { #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ -#include typedef struct _EISA_MEMORY_TYPE { UCHAR ReadWrite : 1; @@ -4388,6 +3545,7 @@ typedef struct _EISA_MEMORY_TYPE { UCHAR MoreEntries : 1; } EISA_MEMORY_TYPE, *PEISA_MEMORY_TYPE; +#include typedef struct _EISA_MEMORY_CONFIGURATION { EISA_MEMORY_TYPE ConfigurationByte; UCHAR DataSize; @@ -4395,6 +3553,7 @@ typedef struct _EISA_MEMORY_CONFIGURATION { UCHAR AddressHighByte; USHORT MemorySize; } EISA_MEMORY_CONFIGURATION, *PEISA_MEMORY_CONFIGURATION; +#include typedef struct _EISA_IRQ_DESCRIPTOR { UCHAR Interrupt : 4; @@ -4428,6 +3587,7 @@ typedef struct _EISA_DMA_CONFIGURATION { DMA_CONFIGURATION_BYTE1 ConfigurationByte1; } EISA_DMA_CONFIGURATION, *PEISA_DMA_CONFIGURATION; +#include typedef struct _EISA_PORT_DESCRIPTOR { UCHAR NumberPorts : 5; UCHAR Reserved : 1; @@ -4439,17 +3599,7 @@ typedef struct _EISA_PORT_CONFIGURATION { EISA_PORT_DESCRIPTOR Configuration; USHORT PortAddress; } EISA_PORT_CONFIGURATION, *PEISA_PORT_CONFIGURATION; - -typedef struct _CM_EISA_SLOT_INFORMATION { - UCHAR ReturnCode; - UCHAR ReturnFlags; - UCHAR MajorRevision; - UCHAR MinorRevision; - USHORT Checksum; - UCHAR NumberFunctions; - UCHAR FunctionInformation; - ULONG CompressedId; -} CM_EISA_SLOT_INFORMATION, *PCM_EISA_SLOT_INFORMATION; +#include typedef struct _CM_EISA_FUNCTION_INFORMATION { ULONG CompressedId; @@ -4467,8 +3617,6 @@ typedef struct _CM_EISA_FUNCTION_INFORMATION { UCHAR InitializationData[60]; } CM_EISA_FUNCTION_INFORMATION, *PCM_EISA_FUNCTION_INFORMATION; -#include - /* CM_EISA_FUNCTION_INFORMATION.FunctionFlags */ #define EISA_FUNCTION_ENABLED 0x80 @@ -4483,9 +3631,16 @@ typedef struct _CM_EISA_FUNCTION_INFORMATION { (EISA_HAS_PORT_RANGE + EISA_HAS_DMA_ENTRY + EISA_HAS_IRQ_ENTRY \ + EISA_HAS_MEMORY_ENTRY + EISA_HAS_TYPE_ENTRY) -#define EISA_MORE_ENTRIES 0x80 -#define EISA_SYSTEM_MEMORY 0x00 -#define EISA_MEMORY_TYPE_RAM 0x01 +typedef struct _CM_EISA_SLOT_INFORMATION { + UCHAR ReturnCode; + UCHAR ReturnFlags; + UCHAR MajorRevision; + UCHAR MinorRevision; + USHORT Checksum; + UCHAR NumberFunctions; + UCHAR FunctionInformation; + ULONG CompressedId; +} CM_EISA_SLOT_INFORMATION, *PCM_EISA_SLOT_INFORMATION; /* CM_EISA_SLOT_INFORMATION.ReturnCode */ @@ -4532,45 +3687,6 @@ typedef ULONG IN ULONG Length); typedef GET_SET_DEVICE_DATA *PGET_SET_DEVICE_DATA; -typedef enum _DEVICE_INSTALL_STATE { - InstallStateInstalled, - InstallStateNeedsReinstall, - InstallStateFailedInstall, - InstallStateFinishInstall -} DEVICE_INSTALL_STATE, *PDEVICE_INSTALL_STATE; - -typedef struct _LEGACY_BUS_INFORMATION { - GUID BusTypeGuid; - INTERFACE_TYPE LegacyBusType; - ULONG BusNumber; -} LEGACY_BUS_INFORMATION, *PLEGACY_BUS_INFORMATION; - -typedef enum _DEVICE_REMOVAL_POLICY { - RemovalPolicyExpectNoRemoval = 1, - RemovalPolicyExpectOrderlyRemoval = 2, - RemovalPolicyExpectSurpriseRemoval = 3 -} DEVICE_REMOVAL_POLICY, *PDEVICE_REMOVAL_POLICY; - -typedef VOID -(NTAPI*PREENUMERATE_SELF)( - IN PVOID Context); - -typedef struct _REENUMERATE_SELF_INTERFACE_STANDARD { - USHORT Size; - USHORT Version; - PVOID Context; - PINTERFACE_REFERENCE InterfaceReference; - PINTERFACE_DEREFERENCE InterfaceDereference; - PREENUMERATE_SELF SurpriseRemoveAndReenumerateSelf; -} REENUMERATE_SELF_INTERFACE_STANDARD, *PREENUMERATE_SELF_INTERFACE_STANDARD; - -typedef VOID -(NTAPI *PIO_DEVICE_EJECT_CALLBACK)( - IN NTSTATUS Status, - IN OUT PVOID Context OPTIONAL); - -#define PCI_DEVICE_PRESENT_INTERFACE_VERSION 1 - /* PCI_DEVICE_PRESENCE_PARAMETERS.Flags */ #define PCI_USE_SUBSYSTEM_IDS 0x00000001 #define PCI_USE_REVISION 0x00000002 @@ -4631,6 +3747,175 @@ typedef struct _PCI_DEVICE_PRESENT_INTERFACE { PPCI_IS_DEVICE_PRESENT_EX IsDevicePresentEx; } PCI_DEVICE_PRESENT_INTERFACE, *PPCI_DEVICE_PRESENT_INTERFACE; +typedef +BOOLEAN +(*PGPE_SERVICE_ROUTINE2)( + PVOID ObjectContext, + PVOID ServiceContext +); + +typedef +NTSTATUS +(*PGPE_CONNECT_VECTOR2)( + PVOID Context, + ULONG GpeNumber, + KINTERRUPT_MODE Mode, + BOOLEAN Shareable, + PGPE_SERVICE_ROUTINE2 ServiceRoutine, + PVOID ServiceContext, + PVOID *ObjectContext +); + +typedef +NTSTATUS +(*PGPE_DISCONNECT_VECTOR2)( + PVOID Context, + PVOID ObjectContext +); + +typedef +NTSTATUS +(*PGPE_ENABLE_EVENT2)( + PVOID Context, + PVOID ObjectContext +); + +typedef +NTSTATUS +(*PGPE_DISABLE_EVENT2)( + PVOID Context, + PVOID ObjectContext +); + +typedef +NTSTATUS +(*PGPE_CLEAR_STATUS2)( + PVOID Context, + PVOID ObjectContext +); + +typedef +VOID +(*PDEVICE_NOTIFY_CALLBACK2)( + PVOID NotificationContext, + ULONG NotifyCode +); + +typedef +NTSTATUS +(*PREGISTER_FOR_DEVICE_NOTIFICATIONS2)( + PVOID Context, + PDEVICE_NOTIFY_CALLBACK2 NotificationHandler, + PVOID NotificationContext +); + +typedef +VOID +(*PUNREGISTER_FOR_DEVICE_NOTIFICATIONS2)( + PVOID Context +); + +typedef struct +{ + USHORT Size; + USHORT Version; + PVOID Context; + PINTERFACE_REFERENCE InterfaceReference; + PINTERFACE_DEREFERENCE InterfaceDereference; + PGPE_CONNECT_VECTOR2 GpeConnectVector; + PGPE_DISCONNECT_VECTOR2 GpeDisconnectVector; + PGPE_ENABLE_EVENT2 GpeEnableEvent; + PGPE_DISABLE_EVENT2 GpeDisableEvent; + PGPE_CLEAR_STATUS2 GpeClearStatus; + PREGISTER_FOR_DEVICE_NOTIFICATIONS2 RegisterForDeviceNotifications; + PUNREGISTER_FOR_DEVICE_NOTIFICATIONS2 UnregisterForDeviceNotifications; +} ACPI_INTERFACE_STANDARD2, *PACPI_INTERFACE_STANDARD2; + +typedef +BOOLEAN +(*PGPE_SERVICE_ROUTINE)( + PDEVICE_OBJECT ObjectContext, + PVOID ServiceContext +); + +typedef +NTSTATUS +(*PGPE_CONNECT_VECTOR)( + PDEVICE_OBJECT Context, + ULONG GpeNumber, + KINTERRUPT_MODE Mode, + BOOLEAN Shareable, + PGPE_SERVICE_ROUTINE ServiceRoutine, + PVOID ServiceContext, + PVOID *ObjectContext +); + +typedef +NTSTATUS +(*PGPE_DISCONNECT_VECTOR)( + PDEVICE_OBJECT Context, + PVOID ObjectContext +); + +typedef +NTSTATUS +(*PGPE_ENABLE_EVENT)( + PDEVICE_OBJECT Context, + PVOID ObjectContext +); + +typedef +NTSTATUS +(*PGPE_DISABLE_EVENT)( + PDEVICE_OBJECT Context, + PVOID ObjectContext +); + +typedef +NTSTATUS +(*PGPE_CLEAR_STATUS)( + PDEVICE_OBJECT Context, + PVOID ObjectContext +); + +typedef +VOID +(*PDEVICE_NOTIFY_CALLBACK)( + PVOID NotificationContext, + ULONG NotifyCode +); + +typedef +NTSTATUS +(*PREGISTER_FOR_DEVICE_NOTIFICATIONS)( + PDEVICE_OBJECT Context, + PDEVICE_NOTIFY_CALLBACK NotificationHandler, + PVOID NotificationContext +); + +typedef +VOID +(*PUNREGISTER_FOR_DEVICE_NOTIFICATIONS)( + PDEVICE_OBJECT Context, + PDEVICE_NOTIFY_CALLBACK NotificationHandler +); + +typedef struct +{ + USHORT Size; + USHORT Version; + PVOID Context; + PINTERFACE_REFERENCE InterfaceReference; + PINTERFACE_DEREFERENCE InterfaceDereference; + PGPE_CONNECT_VECTOR GpeConnectVector; + PGPE_DISCONNECT_VECTOR GpeDisconnectVector; + PGPE_ENABLE_EVENT GpeEnableEvent; + PGPE_DISABLE_EVENT GpeDisableEvent; + PGPE_CLEAR_STATUS GpeClearStatus; + PREGISTER_FOR_DEVICE_NOTIFICATIONS RegisterForDeviceNotifications; + PUNREGISTER_FOR_DEVICE_NOTIFICATIONS UnregisterForDeviceNotifications; +} ACPI_INTERFACE_STANDARD, *PACPI_INTERFACE_STANDARD; + typedef struct _DEVICE_CAPABILITIES { USHORT Size; USHORT Version; @@ -4720,139 +4005,6 @@ typedef struct _TARGET_DEVICE_REMOVAL_NOTIFICATION { struct _FILE_OBJECT *FileObject; } TARGET_DEVICE_REMOVAL_NOTIFICATION, *PTARGET_DEVICE_REMOVAL_NOTIFICATION; -#if (NTDDI_VERSION >= NTDDI_VISTA) -#include -#define PLUGPLAY_PROPERTY_PERSISTENT 0x00000001 -#endif - -#define PNP_REPLACE_NO_MAP MAXLONGLONG - -typedef NTSTATUS -(NTAPI *PREPLACE_MAP_MEMORY)( - IN PHYSICAL_ADDRESS TargetPhysicalAddress, - IN PHYSICAL_ADDRESS SparePhysicalAddress, - IN OUT PLARGE_INTEGER NumberOfBytes, - OUT PVOID *TargetAddress, - OUT PVOID *SpareAddress); - -typedef struct _PNP_REPLACE_MEMORY_LIST { - ULONG AllocatedCount; - ULONG Count; - ULONGLONG TotalLength; - struct { - PHYSICAL_ADDRESS Address; - ULONGLONG Length; - } Ranges[ANYSIZE_ARRAY]; -} PNP_REPLACE_MEMORY_LIST, *PPNP_REPLACE_MEMORY_LIST; - -typedef struct _PNP_REPLACE_PROCESSOR_LIST { - PKAFFINITY Affinity; - ULONG GroupCount; - ULONG AllocatedCount; - ULONG Count; - ULONG ApicIds[ANYSIZE_ARRAY]; -} PNP_REPLACE_PROCESSOR_LIST, *PPNP_REPLACE_PROCESSOR_LIST; - -typedef struct _PNP_REPLACE_PROCESSOR_LIST_V1 { - KAFFINITY AffinityMask; - ULONG AllocatedCount; - ULONG Count; - ULONG ApicIds[ANYSIZE_ARRAY]; -} PNP_REPLACE_PROCESSOR_LIST_V1, *PPNP_REPLACE_PROCESSOR_LIST_V1; - -#define PNP_REPLACE_PARAMETERS_VERSION 2 - -typedef struct _PNP_REPLACE_PARAMETERS { - ULONG Size; - ULONG Version; - ULONG64 Target; - ULONG64 Spare; - PPNP_REPLACE_PROCESSOR_LIST TargetProcessors; - PPNP_REPLACE_PROCESSOR_LIST SpareProcessors; - PPNP_REPLACE_MEMORY_LIST TargetMemory; - PPNP_REPLACE_MEMORY_LIST SpareMemory; - PREPLACE_MAP_MEMORY MapMemory; -} PNP_REPLACE_PARAMETERS, *PPNP_REPLACE_PARAMETERS; - -typedef VOID -(NTAPI *PREPLACE_UNLOAD)( - VOID); - -typedef NTSTATUS -(NTAPI *PREPLACE_BEGIN)( - IN PPNP_REPLACE_PARAMETERS Parameters, - OUT PVOID *Context); - -typedef NTSTATUS -(NTAPI *PREPLACE_END)( - IN PVOID Context); - -typedef NTSTATUS -(NTAPI *PREPLACE_MIRROR_PHYSICAL_MEMORY)( - IN PVOID Context, - IN PHYSICAL_ADDRESS PhysicalAddress, - IN LARGE_INTEGER ByteCount); - -typedef NTSTATUS -(NTAPI *PREPLACE_SET_PROCESSOR_ID)( - IN PVOID Context, - IN ULONG ApicId, - IN BOOLEAN Target); - -typedef NTSTATUS -(NTAPI *PREPLACE_SWAP)( - IN PVOID Context); - -typedef NTSTATUS -(NTAPI *PREPLACE_INITIATE_HARDWARE_MIRROR)( - IN PVOID Context); - -typedef NTSTATUS -(NTAPI *PREPLACE_MIRROR_PLATFORM_MEMORY)( - IN PVOID Context); - -typedef NTSTATUS -(NTAPI *PREPLACE_GET_MEMORY_DESTINATION)( - IN PVOID Context, - IN PHYSICAL_ADDRESS SourceAddress, - OUT PPHYSICAL_ADDRESS DestinationAddress); - -typedef NTSTATUS -(NTAPI *PREPLACE_ENABLE_DISABLE_HARDWARE_QUIESCE)( - IN PVOID Context, - IN BOOLEAN Enable); - -#define PNP_REPLACE_DRIVER_INTERFACE_VERSION 1 -#define PNP_REPLACE_DRIVER_INTERFACE_MINIMUM_SIZE \ - FIELD_OFFSET(PNP_REPLACE_DRIVER_INTERFACE, InitiateHardwareMirror) - -#define PNP_REPLACE_MEMORY_SUPPORTED 0x0001 -#define PNP_REPLACE_PROCESSOR_SUPPORTED 0x0002 -#define PNP_REPLACE_HARDWARE_MEMORY_MIRRORING 0x0004 -#define PNP_REPLACE_HARDWARE_PAGE_COPY 0x0008 -#define PNP_REPLACE_HARDWARE_QUIESCE 0x0010 - -typedef struct _PNP_REPLACE_DRIVER_INTERFACE { - ULONG Size; - ULONG Version; - ULONG Flags; - PREPLACE_UNLOAD Unload; - PREPLACE_BEGIN BeginReplace; - PREPLACE_END EndReplace; - PREPLACE_MIRROR_PHYSICAL_MEMORY MirrorPhysicalMemory; - PREPLACE_SET_PROCESSOR_ID SetProcessorId; - PREPLACE_SWAP Swap; - PREPLACE_INITIATE_HARDWARE_MIRROR InitiateHardwareMirror; - PREPLACE_MIRROR_PLATFORM_MEMORY MirrorPlatformMemory; - PREPLACE_GET_MEMORY_DESTINATION GetMemoryDestination; - PREPLACE_ENABLE_DISABLE_HARDWARE_QUIESCE EnableDisableHardwareQuiesce; -} PNP_REPLACE_DRIVER_INTERFACE, *PPNP_REPLACE_DRIVER_INTERFACE; - -typedef NTSTATUS -(NTAPI *PREPLACE_DRIVER_INIT)( - IN OUT PPNP_REPLACE_DRIVER_INTERFACE Interface, - IN PVOID Unused); - typedef enum _DEVICE_USAGE_NOTIFICATION_TYPE { DeviceUsageTypeUndefined, DeviceUsageTypePaging, @@ -4899,15 +4051,6 @@ typedef enum _IO_NOTIFICATION_EVENT_CATEGORY { EventCategoryTargetDeviceChange } IO_NOTIFICATION_EVENT_CATEGORY; -typedef enum _IO_PRIORITY_HINT { - IoPriorityVeryLow = 0, - IoPriorityLow, - IoPriorityNormal, - IoPriorityHigh, - IoPriorityCritical, - MaxIoPriorityTypes -} IO_PRIORITY_HINT; - #define PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES 0x00000001 typedef NTSTATUS @@ -4984,6 +4127,7 @@ typedef struct _FILE_POSITION_INFORMATION { LARGE_INTEGER CurrentByteOffset; } FILE_POSITION_INFORMATION, *PFILE_POSITION_INFORMATION; +#include typedef struct _FILE_BASIC_INFORMATION { LARGE_INTEGER CreationTime; LARGE_INTEGER LastAccessTime; @@ -4991,32 +4135,7 @@ typedef struct _FILE_BASIC_INFORMATION { LARGE_INTEGER ChangeTime; ULONG FileAttributes; } FILE_BASIC_INFORMATION, *PFILE_BASIC_INFORMATION; - -typedef struct _FILE_IO_PRIORITY_HINT_INFORMATION { - IO_PRIORITY_HINT PriorityHint; -} FILE_IO_PRIORITY_HINT_INFORMATION, *PFILE_IO_PRIORITY_HINT_INFORMATION; - -typedef struct _FILE_IO_COMPLETION_NOTIFICATION_INFORMATION { - ULONG Flags; -} FILE_IO_COMPLETION_NOTIFICATION_INFORMATION, *PFILE_IO_COMPLETION_NOTIFICATION_INFORMATION; - -typedef struct _FILE_IOSTATUSBLOCK_RANGE_INFORMATION { - PUCHAR IoStatusBlockRange; - ULONG Length; -} FILE_IOSTATUSBLOCK_RANGE_INFORMATION, *PFILE_IOSTATUSBLOCK_RANGE_INFORMATION; - -typedef struct _FILE_IS_REMOTE_DEVICE_INFORMATION { - BOOLEAN IsRemote; -} FILE_IS_REMOTE_DEVICE_INFORMATION, *PFILE_IS_REMOTE_DEVICE_INFORMATION; - -typedef struct _FILE_NUMA_NODE_INFORMATION { - USHORT NodeNumber; -} FILE_NUMA_NODE_INFORMATION, *PFILE_NUMA_NODE_INFORMATION; - -typedef struct _FILE_PROCESS_IDS_USING_FILE_INFORMATION { - ULONG NumberOfProcessIdsInList; - ULONG_PTR ProcessIdList[1]; -} FILE_PROCESS_IDS_USING_FILE_INFORMATION, *PFILE_PROCESS_IDS_USING_FILE_INFORMATION; +#include typedef struct _FILE_STANDARD_INFORMATION { LARGE_INTEGER AllocationSize; @@ -5063,30 +4182,49 @@ typedef struct _FILE_FULL_EA_INFORMATION { CHAR EaName[1]; } FILE_FULL_EA_INFORMATION, *PFILE_FULL_EA_INFORMATION; -typedef struct _FILE_SFIO_RESERVE_INFORMATION { - ULONG RequestsPerPeriod; - ULONG Period; - BOOLEAN RetryFailures; - BOOLEAN Discardable; - ULONG RequestSize; - ULONG NumOutstandingRequests; -} FILE_SFIO_RESERVE_INFORMATION, *PFILE_SFIO_RESERVE_INFORMATION; - -typedef struct _FILE_SFIO_VOLUME_INFORMATION { - ULONG MaximumRequestsPerPeriod; - ULONG MinimumPeriod; - ULONG MinimumTransferSize; -} FILE_SFIO_VOLUME_INFORMATION, *PFILE_SFIO_VOLUME_INFORMATION; - -#define FILE_SKIP_COMPLETION_PORT_ON_SUCCESS 0x1 -#define FILE_SKIP_SET_EVENT_ON_HANDLE 0x2 -#define FILE_SKIP_SET_USER_EVENT_ON_FAST_IO 0x4 - #define FM_LOCK_BIT (0x1) #define FM_LOCK_BIT_V (0x0) #define FM_LOCK_WAITER_WOKEN (0x2) #define FM_LOCK_WAITER_INC (0x4) +typedef ULONG_PTR ERESOURCE_THREAD, *PERESOURCE_THREAD; + +typedef struct _OWNER_ENTRY { + ERESOURCE_THREAD OwnerThread; + _ANONYMOUS_UNION union { + LONG OwnerCount; + ULONG TableSize; + } DUMMYUNIONNAME; +} OWNER_ENTRY, *POWNER_ENTRY; + +typedef struct _ERESOURCE +{ + LIST_ENTRY SystemResourcesList; + POWNER_ENTRY OwnerTable; + SHORT ActiveCount; + USHORT Flag; + volatile PKSEMAPHORE SharedWaiters; + volatile PKEVENT ExclusiveWaiters; + OWNER_ENTRY OwnerEntry; + ULONG ActiveEntries; + ULONG ContentionCount; + ULONG NumberOfSharedWaiters; + ULONG NumberOfExclusiveWaiters; + __GNU_EXTENSION union + { + PVOID Address; + ULONG_PTR CreatorBackTraceIndex; + }; + KSPIN_LOCK SpinLock; +} ERESOURCE, *PERESOURCE; + +/* ERESOURCE.Flag */ +#define ResourceNeverExclusive 0x0010 +#define ResourceReleaseByOtherThread 0x0020 +#define ResourceOwnedExclusive 0x0080 + +#define RESOURCE_HASH_TABLE_SIZE 64 + typedef BOOLEAN (NTAPI FAST_IO_CHECK_IF_POSSIBLE)( IN struct _FILE_OBJECT *FileObject, @@ -5630,12 +4768,6 @@ typedef struct _IO_ERROR_LOG_MESSAGE { #define ERROR_LOG_MAXIMUM_SIZE (IO_ERROR_LOG_MESSAGE_LENGTH - \ IO_ERROR_LOG_MESSAGE_HEADER_LENGTH) -#ifdef _WIN64 -#define PORT_MAXIMUM_MESSAGE_LENGTH 512 -#else -#define PORT_MAXIMUM_MESSAGE_LENGTH 256 -#endif - typedef enum _DMA_WIDTH { Width8Bits, Width16Bits, @@ -6092,6 +5224,12 @@ typedef NTSTATUS (NTAPI *PMM_DLL_UNLOAD)( VOID); +typedef BOOLEAN +(NTAPI KSERVICE_ROUTINE)( + IN struct _KINTERRUPT *Interrupt, + IN PVOID ServiceContext); +typedef KSERVICE_ROUTINE *PKSERVICE_ROUTINE; + typedef VOID (NTAPI IO_TIMER_ROUTINE)( IN struct _DEVICE_OBJECT *DeviceObject, @@ -6175,135 +5313,12 @@ typedef enum _DEVICE_TEXT_TYPE { DeviceTextLocationInformation } DEVICE_TEXT_TYPE, *PDEVICE_TEXT_TYPE; -typedef BOOLEAN -(NTAPI *PGPE_SERVICE_ROUTINE)( - PVOID, - PVOID); - -typedef NTSTATUS -(NTAPI *PGPE_CONNECT_VECTOR)( - PDEVICE_OBJECT, - ULONG, - KINTERRUPT_MODE, - BOOLEAN, - PGPE_SERVICE_ROUTINE, - PVOID, - PVOID); - -typedef NTSTATUS -(NTAPI *PGPE_DISCONNECT_VECTOR)( - PVOID); - -typedef NTSTATUS -(NTAPI *PGPE_ENABLE_EVENT)( - PDEVICE_OBJECT, - PVOID); - -typedef NTSTATUS -(NTAPI *PGPE_DISABLE_EVENT)( - PDEVICE_OBJECT, - PVOID); - -typedef NTSTATUS -(NTAPI *PGPE_CLEAR_STATUS)( - PDEVICE_OBJECT, - PVOID); - -typedef VOID -(NTAPI *PDEVICE_NOTIFY_CALLBACK)( - PVOID, - ULONG); - -typedef NTSTATUS -(NTAPI *PREGISTER_FOR_DEVICE_NOTIFICATIONS)( - PDEVICE_OBJECT, - PDEVICE_NOTIFY_CALLBACK, - PVOID); - -typedef VOID -(NTAPI *PUNREGISTER_FOR_DEVICE_NOTIFICATIONS)( - PDEVICE_OBJECT, - PDEVICE_NOTIFY_CALLBACK); - -typedef struct _ACPI_INTERFACE_STANDARD { - USHORT Size; - USHORT Version; - PVOID Context; - PINTERFACE_REFERENCE InterfaceReference; - PINTERFACE_DEREFERENCE InterfaceDereference; - PGPE_CONNECT_VECTOR GpeConnectVector; - PGPE_DISCONNECT_VECTOR GpeDisconnectVector; - PGPE_ENABLE_EVENT GpeEnableEvent; - PGPE_DISABLE_EVENT GpeDisableEvent; - PGPE_CLEAR_STATUS GpeClearStatus; - PREGISTER_FOR_DEVICE_NOTIFICATIONS RegisterForDeviceNotifications; - PUNREGISTER_FOR_DEVICE_NOTIFICATIONS UnregisterForDeviceNotifications; -} ACPI_INTERFACE_STANDARD, *PACPI_INTERFACE_STANDARD; - -typedef BOOLEAN -(NTAPI *PGPE_SERVICE_ROUTINE2)( - PVOID ObjectContext, - PVOID ServiceContext); - -typedef NTSTATUS -(NTAPI *PGPE_CONNECT_VECTOR2)( - PVOID Context, - ULONG GpeNumber, - KINTERRUPT_MODE Mode, - BOOLEAN Shareable, - PGPE_SERVICE_ROUTINE ServiceRoutine, - PVOID ServiceContext, - PVOID *ObjectContext); - -typedef NTSTATUS -(NTAPI *PGPE_DISCONNECT_VECTOR2)( - PVOID Context, - PVOID ObjectContext); - -typedef NTSTATUS -(NTAPI *PGPE_ENABLE_EVENT2)( - PVOID Context, - PVOID ObjectContext); - -typedef NTSTATUS -(NTAPI *PGPE_DISABLE_EVENT2)( - PVOID Context, - PVOID ObjectContext); - -typedef NTSTATUS -(NTAPI *PGPE_CLEAR_STATUS2)( - PVOID Context, - PVOID ObjectContext); - -typedef VOID -(NTAPI *PDEVICE_NOTIFY_CALLBACK2)( - PVOID NotificationContext, - ULONG NotifyCode); - -typedef NTSTATUS -(NTAPI *PREGISTER_FOR_DEVICE_NOTIFICATIONS2)( - PVOID Context, - PDEVICE_NOTIFY_CALLBACK2 NotificationHandler, - PVOID NotificationContext); - -typedef VOID -(NTAPI *PUNREGISTER_FOR_DEVICE_NOTIFICATIONS2)( - PVOID Context); - -typedef struct _ACPI_INTERFACE_STANDARD2 { - USHORT Size; - USHORT Version; - PVOID Context; - PINTERFACE_REFERENCE InterfaceReference; - PINTERFACE_DEREFERENCE InterfaceDereference; - PGPE_CONNECT_VECTOR2 GpeConnectVector; - PGPE_DISCONNECT_VECTOR2 GpeDisconnectVector; - PGPE_ENABLE_EVENT2 GpeEnableEvent; - PGPE_DISABLE_EVENT2 GpeDisableEvent; - PGPE_CLEAR_STATUS2 GpeClearStatus; - PREGISTER_FOR_DEVICE_NOTIFICATIONS2 RegisterForDeviceNotifications; - PUNREGISTER_FOR_DEVICE_NOTIFICATIONS2 UnregisterForDeviceNotifications; -} ACPI_INTERFACE_STANDARD2, *PACPI_INTERFACE_STANDARD2; +typedef enum _WORK_QUEUE_TYPE { + CriticalWorkQueue, + DelayedWorkQueue, + HyperCriticalWorkQueue, + MaximumWorkQueue +} WORK_QUEUE_TYPE; #if !defined(_AMD64_) && !defined(_IA64_) #include @@ -6503,6 +5518,11 @@ typedef struct _IO_STACK_LOCATION { #define SL_INVOKE_ON_SUCCESS 0x40 #define SL_INVOKE_ON_ERROR 0x80 +/* IO_STACK_LOCATION.Parameters.ReadWriteControl.WhichSpace */ + +#define PCI_WHICHSPACE_CONFIG 0x0 +#define PCI_WHICHSPACE_ROM 0x52696350 /* 'PciR' */ + #define METHOD_BUFFERED 0 #define METHOD_IN_DIRECT 1 #define METHOD_OUT_DIRECT 2 @@ -6632,920 +5652,10 @@ typedef struct _IO_STACK_LOCATION { /* end winnt.h */ -#define WMIREG_ACTION_REGISTER 1 -#define WMIREG_ACTION_DEREGISTER 2 -#define WMIREG_ACTION_REREGISTER 3 -#define WMIREG_ACTION_UPDATE_GUIDS 4 -#define WMIREG_ACTION_BLOCK_IRPS 5 - -#define WMIREGISTER 0 -#define WMIUPDATE 1 - -typedef VOID -(NTAPI FWMI_NOTIFICATION_CALLBACK)( - PVOID Wnode, - PVOID Context); -typedef FWMI_NOTIFICATION_CALLBACK *WMI_NOTIFICATION_CALLBACK; - -#ifndef _PCI_X_ -#define _PCI_X_ - -typedef struct _PCI_SLOT_NUMBER { - union { - struct { - ULONG DeviceNumber:5; - ULONG FunctionNumber:3; - ULONG Reserved:24; - } bits; - ULONG AsULONG; - } u; -} PCI_SLOT_NUMBER, *PPCI_SLOT_NUMBER; - -#define PCI_TYPE0_ADDRESSES 6 -#define PCI_TYPE1_ADDRESSES 2 -#define PCI_TYPE2_ADDRESSES 5 - -typedef struct _PCI_COMMON_HEADER { - PCI_COMMON_HEADER_LAYOUT -} PCI_COMMON_HEADER, *PPCI_COMMON_HEADER; - -#ifdef __cplusplus -typedef struct _PCI_COMMON_CONFIG { - PCI_COMMON_HEADER_LAYOUT - UCHAR DeviceSpecific[192]; -} PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG; -#else -typedef struct _PCI_COMMON_CONFIG { - PCI_COMMON_HEADER DUMMYSTRUCTNAME; - UCHAR DeviceSpecific[192]; -} PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG; -#endif - -#define PCI_COMMON_HDR_LENGTH (FIELD_OFFSET(PCI_COMMON_CONFIG, DeviceSpecific)) - -#define PCI_EXTENDED_CONFIG_LENGTH 0x1000 - -#define PCI_MAX_DEVICES 32 -#define PCI_MAX_FUNCTION 8 -#define PCI_MAX_BRIDGE_NUMBER 0xFF -#define PCI_INVALID_VENDORID 0xFFFF - -/* PCI_COMMON_CONFIG.HeaderType */ -#define PCI_MULTIFUNCTION 0x80 -#define PCI_DEVICE_TYPE 0x00 -#define PCI_BRIDGE_TYPE 0x01 -#define PCI_CARDBUS_BRIDGE_TYPE 0x02 - -#define PCI_CONFIGURATION_TYPE(PciData) \ - (((PPCI_COMMON_CONFIG) (PciData))->HeaderType & ~PCI_MULTIFUNCTION) - -#define PCI_MULTIFUNCTION_DEVICE(PciData) \ - ((((PPCI_COMMON_CONFIG) (PciData))->HeaderType & PCI_MULTIFUNCTION) != 0) - -/* PCI_COMMON_CONFIG.Command */ -#define PCI_ENABLE_IO_SPACE 0x0001 -#define PCI_ENABLE_MEMORY_SPACE 0x0002 -#define PCI_ENABLE_BUS_MASTER 0x0004 -#define PCI_ENABLE_SPECIAL_CYCLES 0x0008 -#define PCI_ENABLE_WRITE_AND_INVALIDATE 0x0010 -#define PCI_ENABLE_VGA_COMPATIBLE_PALETTE 0x0020 -#define PCI_ENABLE_PARITY 0x0040 -#define PCI_ENABLE_WAIT_CYCLE 0x0080 -#define PCI_ENABLE_SERR 0x0100 -#define PCI_ENABLE_FAST_BACK_TO_BACK 0x0200 -#define PCI_DISABLE_LEVEL_INTERRUPT 0x0400 - -/* PCI_COMMON_CONFIG.Status */ -#define PCI_STATUS_INTERRUPT_PENDING 0x0008 -#define PCI_STATUS_CAPABILITIES_LIST 0x0010 -#define PCI_STATUS_66MHZ_CAPABLE 0x0020 -#define PCI_STATUS_UDF_SUPPORTED 0x0040 -#define PCI_STATUS_FAST_BACK_TO_BACK 0x0080 -#define PCI_STATUS_DATA_PARITY_DETECTED 0x0100 -#define PCI_STATUS_DEVSEL 0x0600 -#define PCI_STATUS_SIGNALED_TARGET_ABORT 0x0800 -#define PCI_STATUS_RECEIVED_TARGET_ABORT 0x1000 -#define PCI_STATUS_RECEIVED_MASTER_ABORT 0x2000 -#define PCI_STATUS_SIGNALED_SYSTEM_ERROR 0x4000 -#define PCI_STATUS_DETECTED_PARITY_ERROR 0x8000 - -/* IO_STACK_LOCATION.Parameters.ReadWriteControl.WhichSpace */ - -#define PCI_WHICHSPACE_CONFIG 0x0 -#define PCI_WHICHSPACE_ROM 0x52696350 /* 'PciR' */ - -#define PCI_CAPABILITY_ID_POWER_MANAGEMENT 0x01 -#define PCI_CAPABILITY_ID_AGP 0x02 -#define PCI_CAPABILITY_ID_VPD 0x03 -#define PCI_CAPABILITY_ID_SLOT_ID 0x04 -#define PCI_CAPABILITY_ID_MSI 0x05 -#define PCI_CAPABILITY_ID_CPCI_HOTSWAP 0x06 -#define PCI_CAPABILITY_ID_PCIX 0x07 -#define PCI_CAPABILITY_ID_HYPERTRANSPORT 0x08 -#define PCI_CAPABILITY_ID_VENDOR_SPECIFIC 0x09 -#define PCI_CAPABILITY_ID_DEBUG_PORT 0x0A -#define PCI_CAPABILITY_ID_CPCI_RES_CTRL 0x0B -#define PCI_CAPABILITY_ID_SHPC 0x0C -#define PCI_CAPABILITY_ID_P2P_SSID 0x0D -#define PCI_CAPABILITY_ID_AGP_TARGET 0x0E -#define PCI_CAPABILITY_ID_SECURE 0x0F -#define PCI_CAPABILITY_ID_PCI_EXPRESS 0x10 -#define PCI_CAPABILITY_ID_MSIX 0x11 - -typedef struct _PCI_CAPABILITIES_HEADER { - UCHAR CapabilityID; - UCHAR Next; -} PCI_CAPABILITIES_HEADER, *PPCI_CAPABILITIES_HEADER; - -typedef struct _PCI_PMC { - UCHAR Version:3; - UCHAR PMEClock:1; - UCHAR Rsvd1:1; - UCHAR DeviceSpecificInitialization:1; - UCHAR Rsvd2:2; - struct _PM_SUPPORT { - UCHAR Rsvd2:1; - UCHAR D1:1; - UCHAR D2:1; - UCHAR PMED0:1; - UCHAR PMED1:1; - UCHAR PMED2:1; - UCHAR PMED3Hot:1; - UCHAR PMED3Cold:1; - } Support; -} PCI_PMC, *PPCI_PMC; - -typedef struct _PCI_PMCSR { - USHORT PowerState:2; - USHORT Rsvd1:6; - USHORT PMEEnable:1; - USHORT DataSelect:4; - USHORT DataScale:2; - USHORT PMEStatus:1; -} PCI_PMCSR, *PPCI_PMCSR; - -typedef struct _PCI_PMCSR_BSE { - UCHAR Rsvd1:6; - UCHAR D3HotSupportsStopClock:1; - UCHAR BusPowerClockControlEnabled:1; -} PCI_PMCSR_BSE, *PPCI_PMCSR_BSE; - -typedef struct _PCI_PM_CAPABILITY { - PCI_CAPABILITIES_HEADER Header; - union { - PCI_PMC Capabilities; - USHORT AsUSHORT; - } PMC; - union { - PCI_PMCSR ControlStatus; - USHORT AsUSHORT; - } PMCSR; - union { - PCI_PMCSR_BSE BridgeSupport; - UCHAR AsUCHAR; - } PMCSR_BSE; - UCHAR Data; -} PCI_PM_CAPABILITY, *PPCI_PM_CAPABILITY; - -typedef struct { - PCI_CAPABILITIES_HEADER Header; - union { - struct { - USHORT DataParityErrorRecoveryEnable:1; - USHORT EnableRelaxedOrdering:1; - USHORT MaxMemoryReadByteCount:2; - USHORT MaxOutstandingSplitTransactions:3; - USHORT Reserved:9; - } bits; - USHORT AsUSHORT; - } Command; - union { - struct { - ULONG FunctionNumber:3; - ULONG DeviceNumber:5; - ULONG BusNumber:8; - ULONG Device64Bit:1; - ULONG Capable133MHz:1; - ULONG SplitCompletionDiscarded:1; - ULONG UnexpectedSplitCompletion:1; - ULONG DeviceComplexity:1; - ULONG DesignedMaxMemoryReadByteCount:2; - ULONG DesignedMaxOutstandingSplitTransactions:3; - ULONG DesignedMaxCumulativeReadSize:3; - ULONG ReceivedSplitCompletionErrorMessage:1; - ULONG CapablePCIX266:1; - ULONG CapablePCIX533:1; - } bits; - ULONG AsULONG; - } Status; -} PCI_X_CAPABILITY, *PPCI_X_CAPABILITY; - -#define PCI_EXPRESS_ADVANCED_ERROR_REPORTING_CAP_ID 0x0001 -#define PCI_EXPRESS_VIRTUAL_CHANNEL_CAP_ID 0x0002 -#define PCI_EXPRESS_DEVICE_SERIAL_NUMBER_CAP_ID 0x0003 -#define PCI_EXPRESS_POWER_BUDGETING_CAP_ID 0x0004 -#define PCI_EXPRESS_RC_LINK_DECLARATION_CAP_ID 0x0005 -#define PCI_EXPRESS_RC_INTERNAL_LINK_CONTROL_CAP_ID 0x0006 -#define PCI_EXPRESS_RC_EVENT_COLLECTOR_ENDPOINT_ASSOCIATION_CAP_ID 0x0007 -#define PCI_EXPRESS_MFVC_CAP_ID 0x0008 -#define PCI_EXPRESS_VC_AND_MFVC_CAP_ID 0x0009 -#define PCI_EXPRESS_RCRB_HEADER_CAP_ID 0x000A -#define PCI_EXPRESS_SINGLE_ROOT_IO_VIRTUALIZATION_CAP_ID 0x0010 - -typedef struct _PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER { - USHORT CapabilityID; - USHORT Version:4; - USHORT Next:12; -} PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER, *PPCI_EXPRESS_ENHANCED_CAPABILITY_HEADER; - -typedef struct _PCI_EXPRESS_SERIAL_NUMBER_CAPABILITY { - PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header; - ULONG LowSerialNumber; - ULONG HighSerialNumber; -} PCI_EXPRESS_SERIAL_NUMBER_CAPABILITY, *PPCI_EXPRESS_SERIAL_NUMBER_CAPABILITY; - -typedef union _PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS { - struct { - ULONG Undefined:1; - ULONG Reserved1:3; - ULONG DataLinkProtocolError:1; - ULONG SurpriseDownError:1; - ULONG Reserved2:6; - ULONG PoisonedTLP:1; - ULONG FlowControlProtocolError:1; - ULONG CompletionTimeout:1; - ULONG CompleterAbort:1; - ULONG UnexpectedCompletion:1; - ULONG ReceiverOverflow:1; - ULONG MalformedTLP:1; - ULONG ECRCError:1; - ULONG UnsupportedRequestError:1; - ULONG Reserved3:11; - } DUMMYSTRUCTNAME; - ULONG AsULONG; -} PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS, *PPCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS; - -typedef union _PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK { - struct { - ULONG Undefined:1; - ULONG Reserved1:3; - ULONG DataLinkProtocolError:1; - ULONG SurpriseDownError:1; - ULONG Reserved2:6; - ULONG PoisonedTLP:1; - ULONG FlowControlProtocolError:1; - ULONG CompletionTimeout:1; - ULONG CompleterAbort:1; - ULONG UnexpectedCompletion:1; - ULONG ReceiverOverflow:1; - ULONG MalformedTLP:1; - ULONG ECRCError:1; - ULONG UnsupportedRequestError:1; - ULONG Reserved3:11; - } DUMMYSTRUCTNAME; - ULONG AsULONG; -} PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK, *PPCI_EXPRESS_UNCORRECTABLE_ERROR_MASK; - -typedef union _PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY { - struct { - ULONG Undefined:1; - ULONG Reserved1:3; - ULONG DataLinkProtocolError:1; - ULONG SurpriseDownError:1; - ULONG Reserved2:6; - ULONG PoisonedTLP:1; - ULONG FlowControlProtocolError:1; - ULONG CompletionTimeout:1; - ULONG CompleterAbort:1; - ULONG UnexpectedCompletion:1; - ULONG ReceiverOverflow:1; - ULONG MalformedTLP:1; - ULONG ECRCError:1; - ULONG UnsupportedRequestError:1; - ULONG Reserved3:11; - } DUMMYSTRUCTNAME; - ULONG AsULONG; -} PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY, *PPCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY; - -typedef union _PCI_EXPRESS_CORRECTABLE_ERROR_STATUS { - struct { - ULONG ReceiverError:1; - ULONG Reserved1:5; - ULONG BadTLP:1; - ULONG BadDLLP:1; - ULONG ReplayNumRollover:1; - ULONG Reserved2:3; - ULONG ReplayTimerTimeout:1; - ULONG AdvisoryNonFatalError:1; - ULONG Reserved3:18; - } DUMMYSTRUCTNAME; - ULONG AsULONG; -} PCI_EXPRESS_CORRECTABLE_ERROR_STATUS, *PPCI_CORRECTABLE_ERROR_STATUS; - -typedef union _PCI_EXPRESS_CORRECTABLE_ERROR_MASK { - struct { - ULONG ReceiverError:1; - ULONG Reserved1:5; - ULONG BadTLP:1; - ULONG BadDLLP:1; - ULONG ReplayNumRollover:1; - ULONG Reserved2:3; - ULONG ReplayTimerTimeout:1; - ULONG AdvisoryNonFatalError:1; - ULONG Reserved3:18; - } DUMMYSTRUCTNAME; - ULONG AsULONG; -} PCI_EXPRESS_CORRECTABLE_ERROR_MASK, *PPCI_CORRECTABLE_ERROR_MASK; - -typedef union _PCI_EXPRESS_AER_CAPABILITIES { - struct { - ULONG FirstErrorPointer:5; - ULONG ECRCGenerationCapable:1; - ULONG ECRCGenerationEnable:1; - ULONG ECRCCheckCapable:1; - ULONG ECRCCheckEnable:1; - ULONG Reserved:23; - } DUMMYSTRUCTNAME; - ULONG AsULONG; -} PCI_EXPRESS_AER_CAPABILITIES, *PPCI_EXPRESS_AER_CAPABILITIES; - -typedef union _PCI_EXPRESS_ROOT_ERROR_COMMAND { - struct { - ULONG CorrectableErrorReportingEnable:1; - ULONG NonFatalErrorReportingEnable:1; - ULONG FatalErrorReportingEnable:1; - ULONG Reserved:29; - } DUMMYSTRUCTNAME; - ULONG AsULONG; -} PCI_EXPRESS_ROOT_ERROR_COMMAND, *PPCI_EXPRESS_ROOT_ERROR_COMMAND; - -typedef union _PCI_EXPRESS_ROOT_ERROR_STATUS { - struct { - ULONG CorrectableErrorReceived:1; - ULONG MultipleCorrectableErrorsReceived:1; - ULONG UncorrectableErrorReceived:1; - ULONG MultipleUncorrectableErrorsReceived:1; - ULONG FirstUncorrectableFatal:1; - ULONG NonFatalErrorMessagesReceived:1; - ULONG FatalErrorMessagesReceived:1; - ULONG Reserved:20; - ULONG AdvancedErrorInterruptMessageNumber:5; - } DUMMYSTRUCTNAME; - ULONG AsULONG; -} PCI_EXPRESS_ROOT_ERROR_STATUS, *PPCI_EXPRESS_ROOT_ERROR_STATUS; - -typedef union _PCI_EXPRESS_ERROR_SOURCE_ID { - struct { - USHORT CorrectableSourceIdFun:3; - USHORT CorrectableSourceIdDev:5; - USHORT CorrectableSourceIdBus:8; - USHORT UncorrectableSourceIdFun:3; - USHORT UncorrectableSourceIdDev:5; - USHORT UncorrectableSourceIdBus:8; - } DUMMYSTRUCTNAME; - ULONG AsULONG; -} PCI_EXPRESS_ERROR_SOURCE_ID, *PPCI_EXPRESS_ERROR_SOURCE_ID; - -typedef union _PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS { - struct { - ULONG TargetAbortOnSplitCompletion:1; - ULONG MasterAbortOnSplitCompletion:1; - ULONG ReceivedTargetAbort:1; - ULONG ReceivedMasterAbort:1; - ULONG RsvdZ:1; - ULONG UnexpectedSplitCompletionError:1; - ULONG UncorrectableSplitCompletion:1; - ULONG UncorrectableDataError:1; - ULONG UncorrectableAttributeError:1; - ULONG UncorrectableAddressError:1; - ULONG DelayedTransactionDiscardTimerExpired:1; - ULONG PERRAsserted:1; - ULONG SERRAsserted:1; - ULONG InternalBridgeError:1; - ULONG Reserved:18; - } DUMMYSTRUCTNAME; - ULONG AsULONG; -} PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS, *PPCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS; - -typedef union _PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK { - struct { - ULONG TargetAbortOnSplitCompletion:1; - ULONG MasterAbortOnSplitCompletion:1; - ULONG ReceivedTargetAbort:1; - ULONG ReceivedMasterAbort:1; - ULONG RsvdZ:1; - ULONG UnexpectedSplitCompletionError:1; - ULONG UncorrectableSplitCompletion:1; - ULONG UncorrectableDataError:1; - ULONG UncorrectableAttributeError:1; - ULONG UncorrectableAddressError:1; - ULONG DelayedTransactionDiscardTimerExpired:1; - ULONG PERRAsserted:1; - ULONG SERRAsserted:1; - ULONG InternalBridgeError:1; - ULONG Reserved:18; - } DUMMYSTRUCTNAME; - ULONG AsULONG; -} PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK, *PPCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK; - -typedef union _PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY { - struct { - ULONG TargetAbortOnSplitCompletion:1; - ULONG MasterAbortOnSplitCompletion:1; - ULONG ReceivedTargetAbort:1; - ULONG ReceivedMasterAbort:1; - ULONG RsvdZ:1; - ULONG UnexpectedSplitCompletionError:1; - ULONG UncorrectableSplitCompletion:1; - ULONG UncorrectableDataError:1; - ULONG UncorrectableAttributeError:1; - ULONG UncorrectableAddressError:1; - ULONG DelayedTransactionDiscardTimerExpired:1; - ULONG PERRAsserted:1; - ULONG SERRAsserted:1; - ULONG InternalBridgeError:1; - ULONG Reserved:18; - } DUMMYSTRUCTNAME; - ULONG AsULONG; -} PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY, *PPCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY; - -typedef union _PCI_EXPRESS_SEC_AER_CAPABILITIES { - struct { - ULONG SecondaryUncorrectableFirstErrorPtr:5; - ULONG Reserved:27; - } DUMMYSTRUCTNAME; - ULONG AsULONG; -} PCI_EXPRESS_SEC_AER_CAPABILITIES, *PPCI_EXPRESS_SEC_AER_CAPABILITIES; - -#define ROOT_CMD_ENABLE_CORRECTABLE_ERROR_REPORTING 0x00000001 -#define ROOT_CMD_ENABLE_NONFATAL_ERROR_REPORTING 0x00000002 -#define ROOT_CMD_ENABLE_FATAL_ERROR_REPORTING 0x00000004 - -#define ROOT_CMD_ERROR_REPORTING_ENABLE_MASK \ - (ROOT_CMD_ENABLE_FATAL_ERROR_REPORTING | \ - ROOT_CMD_ENABLE_NONFATAL_ERROR_REPORTING | \ - ROOT_CMD_ENABLE_CORRECTABLE_ERROR_REPORTING) - -typedef struct _PCI_EXPRESS_AER_CAPABILITY { - PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header; - PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS UncorrectableErrorStatus; - PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK UncorrectableErrorMask; - PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY UncorrectableErrorSeverity; - PCI_EXPRESS_CORRECTABLE_ERROR_STATUS CorrectableErrorStatus; - PCI_EXPRESS_CORRECTABLE_ERROR_MASK CorrectableErrorMask; - PCI_EXPRESS_AER_CAPABILITIES CapabilitiesAndControl; - ULONG HeaderLog[4]; - PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS SecUncorrectableErrorStatus; - PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK SecUncorrectableErrorMask; - PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY SecUncorrectableErrorSeverity; - PCI_EXPRESS_SEC_AER_CAPABILITIES SecCapabilitiesAndControl; - ULONG SecHeaderLog[4]; -} PCI_EXPRESS_AER_CAPABILITY, *PPCI_EXPRESS_AER_CAPABILITY; - -typedef struct _PCI_EXPRESS_ROOTPORT_AER_CAPABILITY { - PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header; - PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS UncorrectableErrorStatus; - PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK UncorrectableErrorMask; - PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY UncorrectableErrorSeverity; - PCI_EXPRESS_CORRECTABLE_ERROR_STATUS CorrectableErrorStatus; - PCI_EXPRESS_CORRECTABLE_ERROR_MASK CorrectableErrorMask; - PCI_EXPRESS_AER_CAPABILITIES CapabilitiesAndControl; - ULONG HeaderLog[4]; - PCI_EXPRESS_ROOT_ERROR_COMMAND RootErrorCommand; - PCI_EXPRESS_ROOT_ERROR_STATUS RootErrorStatus; - PCI_EXPRESS_ERROR_SOURCE_ID ErrorSourceId; -} PCI_EXPRESS_ROOTPORT_AER_CAPABILITY, *PPCI_EXPRESS_ROOTPORT_AER_CAPABILITY; - -typedef struct _PCI_EXPRESS_BRIDGE_AER_CAPABILITY { - PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header; - PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS UncorrectableErrorStatus; - PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK UncorrectableErrorMask; - PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY UncorrectableErrorSeverity; - PCI_EXPRESS_CORRECTABLE_ERROR_STATUS CorrectableErrorStatus; - PCI_EXPRESS_CORRECTABLE_ERROR_MASK CorrectableErrorMask; - PCI_EXPRESS_AER_CAPABILITIES CapabilitiesAndControl; - ULONG HeaderLog[4]; - PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS SecUncorrectableErrorStatus; - PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK SecUncorrectableErrorMask; - PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY SecUncorrectableErrorSeverity; - PCI_EXPRESS_SEC_AER_CAPABILITIES SecCapabilitiesAndControl; - ULONG SecHeaderLog[4]; -} PCI_EXPRESS_BRIDGE_AER_CAPABILITY, *PPCI_EXPRESS_BRIDGE_AER_CAPABILITY; - -typedef union _PCI_EXPRESS_SRIOV_CAPS { - struct { - ULONG VFMigrationCapable:1; - ULONG Reserved1:20; - ULONG VFMigrationInterruptNumber:11; - } DUMMYSTRUCTNAME; - ULONG AsULONG; -} PCI_EXPRESS_SRIOV_CAPS, *PPCI_EXPRESS_SRIOV_CAPS; - -typedef union _PCI_EXPRESS_SRIOV_CONTROL { - struct { - USHORT VFEnable:1; - USHORT VFMigrationEnable:1; - USHORT VFMigrationInterruptEnable:1; - USHORT VFMemorySpaceEnable:1; - USHORT ARICapableHierarchy:1; - USHORT Reserved1:11; - } DUMMYSTRUCTNAME; - USHORT AsUSHORT; -} PCI_EXPRESS_SRIOV_CONTROL, *PPCI_EXPRESS_SRIOV_CONTROL; - -typedef union _PCI_EXPRESS_SRIOV_STATUS { - struct { - USHORT VFMigrationStatus:1; - USHORT Reserved1:15; - } DUMMYSTRUCTNAME; - USHORT AsUSHORT; -} PCI_EXPRESS_SRIOV_STATUS, *PPCI_EXPRESS_SRIOV_STATUS; - -typedef union _PCI_EXPRESS_SRIOV_MIGRATION_STATE_ARRAY { - struct { - ULONG VFMigrationStateBIR:3; - ULONG VFMigrationStateOffset:29; - } DUMMYSTRUCTNAME; - ULONG AsULONG; -} PCI_EXPRESS_SRIOV_MIGRATION_STATE_ARRAY, *PPCI_EXPRESS_SRIOV_MIGRATION_STATE_ARRAY; - -typedef struct _PCI_EXPRESS_SRIOV_CAPABILITY { - PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header; - PCI_EXPRESS_SRIOV_CAPS SRIOVCapabilities; - PCI_EXPRESS_SRIOV_CONTROL SRIOVControl; - PCI_EXPRESS_SRIOV_STATUS SRIOVStatus; - USHORT InitialVFs; - USHORT TotalVFs; - USHORT NumVFs; - UCHAR FunctionDependencyLink; - UCHAR RsvdP1; - USHORT FirstVFOffset; - USHORT VFStride; - USHORT RsvdP2; - USHORT VFDeviceId; - ULONG SupportedPageSizes; - ULONG SystemPageSize; - ULONG BaseAddresses[PCI_TYPE0_ADDRESSES]; - PCI_EXPRESS_SRIOV_MIGRATION_STATE_ARRAY VFMigrationStateArrayOffset; -} PCI_EXPRESS_SRIOV_CAPABILITY, *PPCI_EXPRESS_SRIOV_CAPABILITY; - -/* PCI device classes */ -#define PCI_CLASS_PRE_20 0x00 -#define PCI_CLASS_MASS_STORAGE_CTLR 0x01 -#define PCI_CLASS_NETWORK_CTLR 0x02 -#define PCI_CLASS_DISPLAY_CTLR 0x03 -#define PCI_CLASS_MULTIMEDIA_DEV 0x04 -#define PCI_CLASS_MEMORY_CTLR 0x05 -#define PCI_CLASS_BRIDGE_DEV 0x06 -#define PCI_CLASS_SIMPLE_COMMS_CTLR 0x07 -#define PCI_CLASS_BASE_SYSTEM_DEV 0x08 -#define PCI_CLASS_INPUT_DEV 0x09 -#define PCI_CLASS_DOCKING_STATION 0x0a -#define PCI_CLASS_PROCESSOR 0x0b -#define PCI_CLASS_SERIAL_BUS_CTLR 0x0c -#define PCI_CLASS_WIRELESS_CTLR 0x0d -#define PCI_CLASS_INTELLIGENT_IO_CTLR 0x0e -#define PCI_CLASS_SATELLITE_COMMS_CTLR 0x0f -#define PCI_CLASS_ENCRYPTION_DECRYPTION 0x10 -#define PCI_CLASS_DATA_ACQ_SIGNAL_PROC 0x11 -#define PCI_CLASS_NOT_DEFINED 0xff - -/* PCI device subclasses for class 0 */ -#define PCI_SUBCLASS_PRE_20_NON_VGA 0x00 -#define PCI_SUBCLASS_PRE_20_VGA 0x01 - -/* PCI device subclasses for class 1 (mass storage controllers)*/ -#define PCI_SUBCLASS_MSC_SCSI_BUS_CTLR 0x00 -#define PCI_SUBCLASS_MSC_IDE_CTLR 0x01 -#define PCI_SUBCLASS_MSC_FLOPPY_CTLR 0x02 -#define PCI_SUBCLASS_MSC_IPI_CTLR 0x03 -#define PCI_SUBCLASS_MSC_RAID_CTLR 0x04 -#define PCI_SUBCLASS_MSC_OTHER 0x80 - -/* PCI device subclasses for class 2 (network controllers)*/ -#define PCI_SUBCLASS_NET_ETHERNET_CTLR 0x00 -#define PCI_SUBCLASS_NET_TOKEN_RING_CTLR 0x01 -#define PCI_SUBCLASS_NET_FDDI_CTLR 0x02 -#define PCI_SUBCLASS_NET_ATM_CTLR 0x03 -#define PCI_SUBCLASS_NET_ISDN_CTLR 0x04 -#define PCI_SUBCLASS_NET_OTHER 0x80 - -/* PCI device subclasses for class 3 (display controllers)*/ -#define PCI_SUBCLASS_VID_VGA_CTLR 0x00 -#define PCI_SUBCLASS_VID_XGA_CTLR 0x01 -#define PCI_SUBCLASS_VID_3D_CTLR 0x02 -#define PCI_SUBCLASS_VID_OTHER 0x80 - -/* PCI device subclasses for class 4 (multimedia device)*/ -#define PCI_SUBCLASS_MM_VIDEO_DEV 0x00 -#define PCI_SUBCLASS_MM_AUDIO_DEV 0x01 -#define PCI_SUBCLASS_MM_TELEPHONY_DEV 0x02 -#define PCI_SUBCLASS_MM_OTHER 0x80 - -/* PCI device subclasses for class 5 (memory controller)*/ -#define PCI_SUBCLASS_MEM_RAM 0x00 -#define PCI_SUBCLASS_MEM_FLASH 0x01 -#define PCI_SUBCLASS_MEM_OTHER 0x80 - -/* PCI device subclasses for class 6 (bridge device)*/ -#define PCI_SUBCLASS_BR_HOST 0x00 -#define PCI_SUBCLASS_BR_ISA 0x01 -#define PCI_SUBCLASS_BR_EISA 0x02 -#define PCI_SUBCLASS_BR_MCA 0x03 -#define PCI_SUBCLASS_BR_PCI_TO_PCI 0x04 -#define PCI_SUBCLASS_BR_PCMCIA 0x05 -#define PCI_SUBCLASS_BR_NUBUS 0x06 -#define PCI_SUBCLASS_BR_CARDBUS 0x07 -#define PCI_SUBCLASS_BR_RACEWAY 0x08 -#define PCI_SUBCLASS_BR_OTHER 0x80 - -#define PCI_SUBCLASS_COM_SERIAL 0x00 -#define PCI_SUBCLASS_COM_PARALLEL 0x01 -#define PCI_SUBCLASS_COM_MULTIPORT 0x02 -#define PCI_SUBCLASS_COM_MODEM 0x03 -#define PCI_SUBCLASS_COM_OTHER 0x80 - -#define PCI_SUBCLASS_SYS_INTERRUPT_CTLR 0x00 -#define PCI_SUBCLASS_SYS_DMA_CTLR 0x01 -#define PCI_SUBCLASS_SYS_SYSTEM_TIMER 0x02 -#define PCI_SUBCLASS_SYS_REAL_TIME_CLOCK 0x03 -#define PCI_SUBCLASS_SYS_GEN_HOTPLUG_CTLR 0x04 -#define PCI_SUBCLASS_SYS_SDIO_CTRL 0x05 -#define PCI_SUBCLASS_SYS_OTHER 0x80 - -#define PCI_SUBCLASS_INP_KEYBOARD 0x00 -#define PCI_SUBCLASS_INP_DIGITIZER 0x01 -#define PCI_SUBCLASS_INP_MOUSE 0x02 -#define PCI_SUBCLASS_INP_SCANNER 0x03 -#define PCI_SUBCLASS_INP_GAMEPORT 0x04 -#define PCI_SUBCLASS_INP_OTHER 0x80 - -#define PCI_SUBCLASS_DOC_GENERIC 0x00 -#define PCI_SUBCLASS_DOC_OTHER 0x80 - -#define PCI_SUBCLASS_PROC_386 0x00 -#define PCI_SUBCLASS_PROC_486 0x01 -#define PCI_SUBCLASS_PROC_PENTIUM 0x02 -#define PCI_SUBCLASS_PROC_ALPHA 0x10 -#define PCI_SUBCLASS_PROC_POWERPC 0x20 -#define PCI_SUBCLASS_PROC_COPROCESSOR 0x40 - -/* PCI device subclasses for class C (serial bus controller)*/ -#define PCI_SUBCLASS_SB_IEEE1394 0x00 -#define PCI_SUBCLASS_SB_ACCESS 0x01 -#define PCI_SUBCLASS_SB_SSA 0x02 -#define PCI_SUBCLASS_SB_USB 0x03 -#define PCI_SUBCLASS_SB_FIBRE_CHANNEL 0x04 -#define PCI_SUBCLASS_SB_SMBUS 0x05 - -#define PCI_SUBCLASS_WIRELESS_IRDA 0x00 -#define PCI_SUBCLASS_WIRELESS_CON_IR 0x01 -#define PCI_SUBCLASS_WIRELESS_RF 0x10 -#define PCI_SUBCLASS_WIRELESS_OTHER 0x80 - -#define PCI_SUBCLASS_INTIO_I2O 0x00 - -#define PCI_SUBCLASS_SAT_TV 0x01 -#define PCI_SUBCLASS_SAT_AUDIO 0x02 -#define PCI_SUBCLASS_SAT_VOICE 0x03 -#define PCI_SUBCLASS_SAT_DATA 0x04 - -#define PCI_SUBCLASS_CRYPTO_NET_COMP 0x00 -#define PCI_SUBCLASS_CRYPTO_ENTERTAINMENT 0x10 -#define PCI_SUBCLASS_CRYPTO_OTHER 0x80 - -#define PCI_SUBCLASS_DASP_DPIO 0x00 -#define PCI_SUBCLASS_DASP_OTHER 0x80 - -#define PCI_ADDRESS_IO_SPACE 0x00000001 -#define PCI_ADDRESS_MEMORY_TYPE_MASK 0x00000006 -#define PCI_ADDRESS_MEMORY_PREFETCHABLE 0x00000008 -#define PCI_ADDRESS_IO_ADDRESS_MASK 0xfffffffc -#define PCI_ADDRESS_MEMORY_ADDRESS_MASK 0xfffffff0 -#define PCI_ADDRESS_ROM_ADDRESS_MASK 0xfffff800 - -#define PCI_TYPE_32BIT 0 -#define PCI_TYPE_20BIT 2 -#define PCI_TYPE_64BIT 4 - -#define PCI_ROMADDRESS_ENABLED 0x00000001 - -#endif /* _PCI_X_ */ - -#define PCI_EXPRESS_LINK_QUIESCENT_INTERFACE_VERSION 1 - -typedef NTSTATUS -(NTAPI PCI_EXPRESS_ENTER_LINK_QUIESCENT_MODE)( - IN OUT PVOID Context); -typedef PCI_EXPRESS_ENTER_LINK_QUIESCENT_MODE *PPCI_EXPRESS_ENTER_LINK_QUIESCENT_MODE; - -typedef NTSTATUS -(NTAPI PCI_EXPRESS_EXIT_LINK_QUIESCENT_MODE)( - IN OUT PVOID Context); -typedef PCI_EXPRESS_EXIT_LINK_QUIESCENT_MODE *PPCI_EXPRESS_EXIT_LINK_QUIESCENT_MODE; - -typedef struct _PCI_EXPRESS_LINK_QUIESCENT_INTERFACE { - USHORT Size; - USHORT Version; - PVOID Context; - PINTERFACE_REFERENCE InterfaceReference; - PINTERFACE_DEREFERENCE InterfaceDereference; - PPCI_EXPRESS_ENTER_LINK_QUIESCENT_MODE PciExpressEnterLinkQuiescentMode; - PPCI_EXPRESS_EXIT_LINK_QUIESCENT_MODE PciExpressExitLinkQuiescentMode; -} PCI_EXPRESS_LINK_QUIESCENT_INTERFACE, *PPCI_EXPRESS_LINK_QUIESCENT_INTERFACE; - -#define PCI_EXPRESS_ROOT_PORT_INTERFACE_VERSION 1 - -typedef ULONG -(NTAPI *PPCI_EXPRESS_ROOT_PORT_READ_CONFIG_SPACE)( - IN PVOID Context, - OUT PVOID Buffer, - IN ULONG Offset, - IN ULONG Length); - -typedef ULONG -(NTAPI *PPCI_EXPRESS_ROOT_PORT_WRITE_CONFIG_SPACE)( - IN PVOID Context, - IN PVOID Buffer, - IN ULONG Offset, - IN ULONG Length); - -typedef struct _PCI_EXPRESS_ROOT_PORT_INTERFACE { - USHORT Size; - USHORT Version; - PVOID Context; - PINTERFACE_REFERENCE InterfaceReference; - PINTERFACE_DEREFERENCE InterfaceDereference; - PPCI_EXPRESS_ROOT_PORT_READ_CONFIG_SPACE ReadConfigSpace; - PPCI_EXPRESS_ROOT_PORT_WRITE_CONFIG_SPACE WriteConfigSpace; -} PCI_EXPRESS_ROOT_PORT_INTERFACE, *PPCI_EXPRESS_ROOT_PORT_INTERFACE; - -#define PCI_MSIX_TABLE_CONFIG_INTERFACE_VERSION 1 - -typedef NTSTATUS -(NTAPI PCI_MSIX_SET_ENTRY)( - IN PVOID Context, - IN ULONG TableEntry, - IN ULONG MessageNumber); -typedef PCI_MSIX_SET_ENTRY *PPCI_MSIX_SET_ENTRY; - -typedef NTSTATUS -(NTAPI PCI_MSIX_MASKUNMASK_ENTRY)( - IN PVOID Context, - IN ULONG TableEntry); -typedef PCI_MSIX_MASKUNMASK_ENTRY *PPCI_MSIX_MASKUNMASK_ENTRY; - -typedef NTSTATUS -(NTAPI PCI_MSIX_GET_ENTRY)( - IN PVOID Context, - IN ULONG TableEntry, - OUT PULONG MessageNumber, - OUT PBOOLEAN Masked); -typedef PCI_MSIX_GET_ENTRY *PPCI_MSIX_GET_ENTRY; - -typedef NTSTATUS -(NTAPI PCI_MSIX_GET_TABLE_SIZE)( - IN PVOID Context, - OUT PULONG TableSize); -typedef PCI_MSIX_GET_TABLE_SIZE *PPCI_MSIX_GET_TABLE_SIZE; - -typedef struct _PCI_MSIX_TABLE_CONFIG_INTERFACE { - USHORT Size; - USHORT Version; - PVOID Context; - PINTERFACE_REFERENCE InterfaceReference; - PINTERFACE_DEREFERENCE InterfaceDereference; - PPCI_MSIX_SET_ENTRY SetTableEntry; - PPCI_MSIX_MASKUNMASK_ENTRY MaskTableEntry; - PPCI_MSIX_MASKUNMASK_ENTRY UnmaskTableEntry; - PPCI_MSIX_GET_ENTRY GetTableEntry; - PPCI_MSIX_GET_TABLE_SIZE GetTableSize; -} PCI_MSIX_TABLE_CONFIG_INTERFACE, *PPCI_MSIX_TABLE_CONFIG_INTERFACE; - -#define PCI_MSIX_TABLE_CONFIG_MINIMUM_SIZE \ - RTL_SIZEOF_THROUGH_FIELD(PCI_MSIX_TABLE_CONFIG_INTERFACE, UnmaskTableEntry) - /****************************************************************************** * Object Manager Types * ******************************************************************************/ -#define MAXIMUM_FILENAME_LENGTH 256 -#define OBJ_NAME_PATH_SEPARATOR ((WCHAR)L'\\') - -#define OBJECT_TYPE_CREATE 0x0001 -#define OBJECT_TYPE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1) - -#define DIRECTORY_QUERY 0x0001 -#define DIRECTORY_TRAVERSE 0x0002 -#define DIRECTORY_CREATE_OBJECT 0x0004 -#define DIRECTORY_CREATE_SUBDIRECTORY 0x0008 -#define DIRECTORY_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0xF) - -#define SYMBOLIC_LINK_QUERY 0x0001 -#define SYMBOLIC_LINK_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1) - -#define DUPLICATE_CLOSE_SOURCE 0x00000001 -#define DUPLICATE_SAME_ACCESS 0x00000002 -#define DUPLICATE_SAME_ATTRIBUTES 0x00000004 - -#define OB_FLT_REGISTRATION_VERSION_0100 0x0100 -#define OB_FLT_REGISTRATION_VERSION OB_FLT_REGISTRATION_VERSION_0100 - -typedef ULONG OB_OPERATION; - -#define OB_OPERATION_HANDLE_CREATE 0x00000001 -#define OB_OPERATION_HANDLE_DUPLICATE 0x00000002 - -typedef struct _OB_PRE_CREATE_HANDLE_INFORMATION { - IN OUT ACCESS_MASK DesiredAccess; - IN ACCESS_MASK OriginalDesiredAccess; -} OB_PRE_CREATE_HANDLE_INFORMATION, *POB_PRE_CREATE_HANDLE_INFORMATION; - -typedef struct _OB_PRE_DUPLICATE_HANDLE_INFORMATION { - IN OUT ACCESS_MASK DesiredAccess; - IN ACCESS_MASK OriginalDesiredAccess; - IN PVOID SourceProcess; - IN PVOID TargetProcess; -} OB_PRE_DUPLICATE_HANDLE_INFORMATION, *POB_PRE_DUPLICATE_HANDLE_INFORMATION; - -typedef union _OB_PRE_OPERATION_PARAMETERS { - IN OUT OB_PRE_CREATE_HANDLE_INFORMATION CreateHandleInformation; - IN OUT OB_PRE_DUPLICATE_HANDLE_INFORMATION DuplicateHandleInformation; -} OB_PRE_OPERATION_PARAMETERS, *POB_PRE_OPERATION_PARAMETERS; - -typedef struct _OB_PRE_OPERATION_INFORMATION { - IN OB_OPERATION Operation; - union { - IN ULONG Flags; - struct { - IN ULONG KernelHandle:1; - IN ULONG Reserved:31; - }; - }; - IN PVOID Object; - IN POBJECT_TYPE ObjectType; - OUT PVOID CallContext; - IN POB_PRE_OPERATION_PARAMETERS Parameters; -} OB_PRE_OPERATION_INFORMATION, *POB_PRE_OPERATION_INFORMATION; - -typedef struct _OB_POST_CREATE_HANDLE_INFORMATION { - IN ACCESS_MASK GrantedAccess; -} OB_POST_CREATE_HANDLE_INFORMATION, *POB_POST_CREATE_HANDLE_INFORMATION; - -typedef struct _OB_POST_DUPLICATE_HANDLE_INFORMATION { - IN ACCESS_MASK GrantedAccess; -} OB_POST_DUPLICATE_HANDLE_INFORMATION, *POB_POST_DUPLICATE_HANDLE_INFORMATION; - -typedef union _OB_POST_OPERATION_PARAMETERS { - IN OB_POST_CREATE_HANDLE_INFORMATION CreateHandleInformation; - IN OB_POST_DUPLICATE_HANDLE_INFORMATION DuplicateHandleInformation; -} OB_POST_OPERATION_PARAMETERS, *POB_POST_OPERATION_PARAMETERS; - -typedef struct _OB_POST_OPERATION_INFORMATION { - IN OB_OPERATION Operation; - union { - IN ULONG Flags; - struct { - IN ULONG KernelHandle:1; - IN ULONG Reserved:31; - }; - }; - IN PVOID Object; - IN POBJECT_TYPE ObjectType; - IN PVOID CallContext; - IN NTSTATUS ReturnStatus; - IN POB_POST_OPERATION_PARAMETERS Parameters; -} OB_POST_OPERATION_INFORMATION,*POB_POST_OPERATION_INFORMATION; - -typedef enum _OB_PREOP_CALLBACK_STATUS { - OB_PREOP_SUCCESS -} OB_PREOP_CALLBACK_STATUS, *POB_PREOP_CALLBACK_STATUS; - -typedef OB_PREOP_CALLBACK_STATUS -(NTAPI *POB_PRE_OPERATION_CALLBACK)( - IN PVOID RegistrationContext, - IN OUT POB_PRE_OPERATION_INFORMATION OperationInformation); - -typedef VOID -(NTAPI *POB_POST_OPERATION_CALLBACK)( - IN PVOID RegistrationContext, - IN POB_POST_OPERATION_INFORMATION OperationInformation); - -typedef struct _OB_OPERATION_REGISTRATION { - IN POBJECT_TYPE *ObjectType; - IN OB_OPERATION Operations; - IN POB_PRE_OPERATION_CALLBACK PreOperation; - IN POB_POST_OPERATION_CALLBACK PostOperation; -} OB_OPERATION_REGISTRATION, *POB_OPERATION_REGISTRATION; - -typedef struct _OB_CALLBACK_REGISTRATION { - IN USHORT Version; - IN USHORT OperationRegistrationCount; - IN UNICODE_STRING Altitude; - IN PVOID RegistrationContext; - IN OB_OPERATION_REGISTRATION *OperationRegistration; -} OB_CALLBACK_REGISTRATION, *POB_CALLBACK_REGISTRATION; - typedef struct _OBJECT_NAME_INFORMATION { UNICODE_STRING Name; } OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION; @@ -7570,6 +5680,16 @@ extern POBJECT_TYPE NTSYSAPI PsProcessType; #define QUOTA_LIMITS_HARDWS_MAX_DISABLE 0x00000008 #define QUOTA_LIMITS_USE_DEFAULT_LIMITS 0x00000010 +/* Process Qoutas */ +typedef struct _QUOTA_LIMITS { + SIZE_T PagedPoolLimit; + SIZE_T NonPagedPoolLimit; + SIZE_T MinimumWorkingSetSize; + SIZE_T MaximumWorkingSetSize; + SIZE_T PagefileLimit; + LARGE_INTEGER TimeLimit; +} QUOTA_LIMITS, *PQUOTA_LIMITS; + /* Thread Access Rights */ #define THREAD_TERMINATE 0x0001 #define THREAD_SUSPEND_RESUME 0x0002 @@ -7594,76 +5714,18 @@ extern POBJECT_TYPE NTSYSAPI PsProcessType; #define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3FF) #endif +#define ES_SYSTEM_REQUIRED 0x00000001 +#define ES_DISPLAY_REQUIRED 0x00000002 +#define ES_USER_PRESENT 0x00000004 +#define ES_CONTINUOUS 0x80000000 + #define LOW_PRIORITY 0 #define LOW_REALTIME_PRIORITY 16 #define HIGH_PRIORITY 31 #define MAXIMUM_PRIORITY 32 -/****************************************************************************** - * WMI Library Support Types * - ******************************************************************************/ - -#ifdef RUN_WPP -#include -#include -#endif - -#ifndef _TRACEHANDLE_DEFINED -#define _TRACEHANDLE_DEFINED -typedef ULONG64 TRACEHANDLE, *PTRACEHANDLE; -#endif - -#ifndef TRACE_INFORMATION_CLASS_DEFINE - -typedef struct _ETW_TRACE_SESSION_SETTINGS { - ULONG Version; - ULONG BufferSize; - ULONG MinimumBuffers; - ULONG MaximumBuffers; - ULONG LoggerMode; - ULONG FlushTimer; - ULONG FlushThreshold; - ULONG ClockType; -} ETW_TRACE_SESSION_SETTINGS, *PETW_TRACE_SESSION_SETTINGS; - -typedef enum _TRACE_INFORMATION_CLASS { - TraceIdClass, - TraceHandleClass, - TraceEnableFlagsClass, - TraceEnableLevelClass, - GlobalLoggerHandleClass, - EventLoggerHandleClass, - AllLoggerHandlesClass, - TraceHandleByNameClass, - LoggerEventsLostClass, - TraceSessionSettingsClass, - LoggerEventsLoggedClass, - MaxTraceInformationClass -} TRACE_INFORMATION_CLASS; - -#endif /* TRACE_INFORMATION_CLASS_DEFINE */ - -#ifndef _ETW_KM_ -#define _ETW_KM_ -#endif - -#include - -typedef VOID -(NTAPI *PETWENABLECALLBACK)( - IN LPCGUID SourceId, - IN ULONG ControlCode, - IN UCHAR Level, - IN ULONGLONG MatchAnyKeyword, - IN ULONGLONG MatchAllKeyword, - IN PEVENT_FILTER_DESCRIPTOR FilterData OPTIONAL, - IN OUT PVOID CallbackContext OPTIONAL); - -#define EVENT_WRITE_FLAG_NO_FAULTING 0x00000001 - - -#if defined(_M_IX86) +#ifdef _X86_ /** Kernel definitions for x86 **/ /* Interrupt request levels */ @@ -7824,346 +5886,11 @@ _KeQueryTickCount( } #define KeQueryTickCount(CurrentCount) _KeQueryTickCount(CurrentCount) +#endif /* _X86_ */ -#elif defined(_M_AMD64) -/** Kernel definitions for AMD64 **/ - -/* Interrupt request levels */ -#define PASSIVE_LEVEL 0 -#define LOW_LEVEL 0 -#define APC_LEVEL 1 -#define DISPATCH_LEVEL 2 -#define CMCI_LEVEL 5 -#define CLOCK_LEVEL 13 -#define IPI_LEVEL 14 -#define DRS_LEVEL 14 -#define POWER_LEVEL 14 -#define PROFILE_LEVEL 15 -#define HIGH_LEVEL 15 - -#define KI_USER_SHARED_DATA 0xFFFFF78000000000ULL -#define SharedUserData ((PKUSER_SHARED_DATA const)KI_USER_SHARED_DATA) -#define SharedInterruptTime (KI_USER_SHARED_DATA + 0x8) -#define SharedSystemTime (KI_USER_SHARED_DATA + 0x14) -#define SharedTickCount (KI_USER_SHARED_DATA + 0x320) - -#define PAGE_SIZE 0x1000 -#define PAGE_SHIFT 12L - -#define EFLAG_SIGN 0x8000 -#define EFLAG_ZERO 0x4000 -#define EFLAG_SELECT (EFLAG_SIGN | EFLAG_ZERO) - -#define RESULT_NEGATIVE ((EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT) -#define RESULT_ZERO ((~EFLAG_SIGN & EFLAG_ZERO) & EFLAG_SELECT) -#define RESULT_POSITIVE ((~EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT) - - -typedef struct _KFLOATING_SAVE { - ULONG Dummy; -} KFLOATING_SAVE, *PKFLOATING_SAVE; - -typedef XSAVE_FORMAT XMM_SAVE_AREA32, *PXMM_SAVE_AREA32; - -#define KeQueryInterruptTime() \ - (*(volatile ULONG64*)SharedInterruptTime) - -#define KeQuerySystemTime(CurrentCount) \ - *(ULONG64*)(CurrentCount) = *(volatile ULONG64*)SharedSystemTime - -#define KeQueryTickCount(CurrentCount) \ - *(ULONG64*)(CurrentCount) = *(volatile ULONG64*)SharedTickCount - -#define KeGetDcacheFillSize() 1L - -#define YieldProcessor _mm_pause - -FORCEINLINE -KIRQL -KeGetCurrentIrql(VOID) -{ - return (KIRQL)__readcr8(); -} - -FORCEINLINE -VOID -KeLowerIrql(IN KIRQL NewIrql) -{ - //ASSERT(KeGetCurrentIrql() >= NewIrql); - __writecr8(NewIrql); -} - -FORCEINLINE -KIRQL -KfRaiseIrql(IN KIRQL NewIrql) -{ - KIRQL OldIrql; - - OldIrql = __readcr8(); - //ASSERT(OldIrql <= NewIrql); - __writecr8(NewIrql); - return OldIrql; -} -#define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a) - -FORCEINLINE -KIRQL -KeRaiseIrqlToDpcLevel(VOID) -{ - return KfRaiseIrql(DISPATCH_LEVEL); -} - -FORCEINLINE -KIRQL -KeRaiseIrqlToSynchLevel(VOID) -{ - return KfRaiseIrql(12); // SYNCH_LEVEL = IPI_LEVEL - 2 - } - -FORCEINLINE -PKTHREAD -KeGetCurrentThread(VOID) -{ - return (struct _KTHREAD *)__readgsqword(0x188); -} - -/* VOID - * KeFlushIoBuffers( - * IN PMDL Mdl, - * IN BOOLEAN ReadOperation, - * IN BOOLEAN DmaOperation) - */ -#define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation) - -/* x86 and x64 performs a 0x2C interrupt */ -#define DbgRaiseAssertionFailure __int2c - -#elif defined(_M_IA64) -/** Kernel definitions for IA64 **/ - -/* Interrupt request levels */ -#define PASSIVE_LEVEL 0 -#define LOW_LEVEL 0 -#define APC_LEVEL 1 -#define DISPATCH_LEVEL 2 -#define CMC_LEVEL 3 -#define DEVICE_LEVEL_BASE 4 -#define PC_LEVEL 12 -#define IPI_LEVEL 14 -#define DRS_LEVEL 14 -#define CLOCK_LEVEL 13 -#define POWER_LEVEL 15 -#define PROFILE_LEVEL 15 -#define HIGH_LEVEL 15 - -#define KI_USER_SHARED_DATA ((ULONG_PTR)(KADDRESS_BASE + 0xFFFE0000)) -extern volatile LARGE_INTEGER KeTickCount; - -#define PAUSE_PROCESSOR __yield(); - -FORCEINLINE -VOID -KeFlushWriteBuffer(VOID) -{ - __mf (); - return; -} - -NTSYSAPI -PKTHREAD -NTAPI -KeGetCurrentThread(VOID); - - -#elif defined(_M_PPC) - -/* Interrupt request levels */ -#define PASSIVE_LEVEL 0 -#define LOW_LEVEL 0 -#define APC_LEVEL 1 -#define DISPATCH_LEVEL 2 -#define PROFILE_LEVEL 27 -#define CLOCK1_LEVEL 28 -#define CLOCK2_LEVEL 28 -#define IPI_LEVEL 29 -#define POWER_LEVEL 30 -#define HIGH_LEVEL 31 - -// -// Used to contain PFNs and PFN counts -// -typedef ULONG PFN_COUNT; -typedef ULONG PFN_NUMBER, *PPFN_NUMBER; -typedef LONG SPFN_NUMBER, *PSPFN_NUMBER; - - -typedef struct _KFLOATING_SAVE { - ULONG Dummy; -} KFLOATING_SAVE, *PKFLOATING_SAVE; - -typedef struct _KPCR_TIB { - PVOID ExceptionList; /* 00 */ - PVOID StackBase; /* 04 */ - PVOID StackLimit; /* 08 */ - PVOID SubSystemTib; /* 0C */ - _ANONYMOUS_UNION union { - PVOID FiberData; /* 10 */ - ULONG Version; /* 10 */ - } DUMMYUNIONNAME; - PVOID ArbitraryUserPointer; /* 14 */ - struct _KPCR_TIB *Self; /* 18 */ -} KPCR_TIB, *PKPCR_TIB; /* 1C */ - -#define PCR_MINOR_VERSION 1 -#define PCR_MAJOR_VERSION 1 - -typedef struct _KPCR { - KPCR_TIB Tib; /* 00 */ - struct _KPCR *Self; /* 1C */ - struct _KPRCB *Prcb; /* 20 */ - KIRQL Irql; /* 24 */ - ULONG IRR; /* 28 */ - ULONG IrrActive; /* 2C */ - ULONG IDR; /* 30 */ - PVOID KdVersionBlock; /* 34 */ - PUSHORT IDT; /* 38 */ - PUSHORT GDT; /* 3C */ - struct _KTSS *TSS; /* 40 */ - USHORT MajorVersion; /* 44 */ - USHORT MinorVersion; /* 46 */ - KAFFINITY SetMember; /* 48 */ - ULONG StallScaleFactor; /* 4C */ - UCHAR SpareUnused; /* 50 */ - UCHAR Number; /* 51 */ -} KPCR, *PKPCR; /* 54 */ - -#define KeGetPcr() PCR - -#define YieldProcessor() __asm__ __volatile__("nop"); - -FORCEINLINE -ULONG -NTAPI -KeGetCurrentProcessorNumber(VOID) -{ - ULONG Number; - __asm__ __volatile__ ( - "lwz %0, %c1(12)\n" - : "=r" (Number) - : "i" (FIELD_OFFSET(KPCR, Number)) - ); - return Number; -} - -NTHALAPI -VOID -FASTCALL -KfLowerIrql( - IN KIRQL NewIrql); -#define KeLowerIrql(a) KfLowerIrql(a) - -NTHALAPI -KIRQL -FASTCALL -KfRaiseIrql( - IN KIRQL NewIrql); -#define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a) - -NTHALAPI -KIRQL -NTAPI -KeRaiseIrqlToDpcLevel(VOID); - -NTHALAPI -KIRQL -NTAPI -KeRaiseIrqlToSynchLevel(VOID); - - - -#elif defined(_M_MIPS) -#error MIPS Headers are totally incorrect - -// -// Used to contain PFNs and PFN counts -// -typedef ULONG PFN_COUNT; -typedef ULONG PFN_NUMBER, *PPFN_NUMBER; -typedef LONG SPFN_NUMBER, *PSPFN_NUMBER; - -#define PASSIVE_LEVEL 0 -#define APC_LEVEL 1 -#define DISPATCH_LEVEL 2 -#define PROFILE_LEVEL 27 -#define IPI_LEVEL 29 -#define HIGH_LEVEL 31 - -typedef struct _KPCR { - struct _KPRCB *Prcb; /* 20 */ - KIRQL Irql; /* 24 */ - ULONG IRR; /* 28 */ - ULONG IDR; /* 30 */ -} KPCR, *PKPCR; - -#define KeGetPcr() PCR - -typedef struct _KFLOATING_SAVE { -} KFLOATING_SAVE, *PKFLOATING_SAVE; - -static __inline -ULONG -NTAPI -KeGetCurrentProcessorNumber(VOID) -{ - return 0; -} - -#define YieldProcessor() __asm__ __volatile__("nop"); - -#define KeLowerIrql(a) KfLowerIrql(a) -#define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a) - -NTKERNELAPI -VOID -NTAPI -KfLowerIrql( - IN KIRQL NewIrql); - -NTKERNELAPI -KIRQL -NTAPI -KfRaiseIrql( - IN KIRQL NewIrql); - -NTKERNELAPI -KIRQL -NTAPI -KeRaiseIrqlToDpcLevel(VOID); - -NTKERNELAPI -KIRQL -NTAPI -KeRaiseIrqlToSynchLevel(VOID); - - -#elif defined(_M_ARM) -#include -#else -#error Unknown Architecture -#endif - -/****************************************************************************** - * Runtime Library Functions * - ******************************************************************************/ - - -#if !defined(MIDL_PASS) && !defined(SORTPP_PASS) - -#define RTL_STATIC_LIST_HEAD(x) LIST_ENTRY x = { &x, &x } - FORCEINLINE VOID InitializeListHead( @@ -8172,6 +5899,34 @@ InitializeListHead( ListHead->Flink = ListHead->Blink = ListHead; } +FORCEINLINE +VOID +InsertHeadList( + IN OUT PLIST_ENTRY ListHead, + IN OUT PLIST_ENTRY Entry) +{ + PLIST_ENTRY OldFlink; + OldFlink = ListHead->Flink; + Entry->Flink = OldFlink; + Entry->Blink = ListHead; + OldFlink->Blink = Entry; + ListHead->Flink = Entry; +} + +FORCEINLINE +VOID +InsertTailList( + IN OUT PLIST_ENTRY ListHead, + IN OUT PLIST_ENTRY Entry) +{ + PLIST_ENTRY OldBlink; + OldBlink = ListHead->Blink; + Entry->Flink = ListHead; + Entry->Blink = OldBlink; + OldBlink->Flink = Entry; + ListHead->Blink = Entry; +} + BOOLEAN FORCEINLINE IsListEmpty( @@ -8180,6 +5935,29 @@ IsListEmpty( return (BOOLEAN)(ListHead->Flink == ListHead); } +FORCEINLINE +PSINGLE_LIST_ENTRY +PopEntryList( + IN OUT PSINGLE_LIST_ENTRY ListHead) +{ + PSINGLE_LIST_ENTRY FirstEntry; + FirstEntry = ListHead->Next; + if (FirstEntry != NULL) { + ListHead->Next = FirstEntry->Next; + } + return FirstEntry; +} + +FORCEINLINE +VOID +PushEntryList( + IN OUT PSINGLE_LIST_ENTRY ListHead, + IN OUT PSINGLE_LIST_ENTRY Entry) +{ + Entry->Next = ListHead->Next; + ListHead->Next = Entry; +} + FORCEINLINE BOOLEAN RemoveEntryList( @@ -8225,73 +6003,6 @@ RemoveTailList( return Entry; } -FORCEINLINE -VOID -InsertTailList( - IN OUT PLIST_ENTRY ListHead, - IN OUT PLIST_ENTRY Entry) -{ - PLIST_ENTRY OldBlink; - OldBlink = ListHead->Blink; - Entry->Flink = ListHead; - Entry->Blink = OldBlink; - OldBlink->Flink = Entry; - ListHead->Blink = Entry; -} - -FORCEINLINE -VOID -InsertHeadList( - IN OUT PLIST_ENTRY ListHead, - IN OUT PLIST_ENTRY Entry) -{ - PLIST_ENTRY OldFlink; - OldFlink = ListHead->Flink; - Entry->Flink = OldFlink; - Entry->Blink = ListHead; - OldFlink->Blink = Entry; - ListHead->Flink = Entry; -} - -FORCEINLINE -VOID -AppendTailList( - IN OUT PLIST_ENTRY ListHead, - IN OUT PLIST_ENTRY ListToAppend) -{ - PLIST_ENTRY ListEnd = ListHead->Blink; - - ListHead->Blink->Flink = ListToAppend; - ListHead->Blink = ListToAppend->Blink; - ListToAppend->Blink->Flink = ListHead; - ListToAppend->Blink = ListEnd; -} - -FORCEINLINE -PSINGLE_LIST_ENTRY -PopEntryList( - IN OUT PSINGLE_LIST_ENTRY ListHead) -{ - PSINGLE_LIST_ENTRY FirstEntry; - FirstEntry = ListHead->Next; - if (FirstEntry != NULL) { - ListHead->Next = FirstEntry->Next; - } - return FirstEntry; -} - -FORCEINLINE -VOID -PushEntryList( - IN OUT PSINGLE_LIST_ENTRY ListHead, - IN OUT PSINGLE_LIST_ENTRY Entry) -{ - Entry->Next = ListHead->Next; - ListHead->Next = Entry; -} - -#endif /* !defined(MIDL_PASS) && !defined(SORTPP_PASS) */ - NTSYSAPI VOID NTAPI @@ -8652,6 +6363,15 @@ RtlFindSetBitsAndClear( IN ULONG NumberToFind, IN ULONG HintIndex); +NTSYSAPI +NTSTATUS +NTAPI +RtlHashUnicodeString( + IN CONST UNICODE_STRING *String, + IN BOOLEAN CaseInSensitive, + IN ULONG HashAlgorithm, + OUT PULONG HashValue); + NTSYSAPI VOID NTAPI @@ -8741,10 +6461,49 @@ RtlQueryRegistryValues( #define LONGLONG_MASK (LONGLONG_SIZE - 1) #define LOWBYTE_MASK 0x00FF -#define FIRSTBYTE(VALUE) ((VALUE) & LOWBYTE_MASK) -#define SECONDBYTE(VALUE) (((VALUE) >> 8) & LOWBYTE_MASK) -#define THIRDBYTE(VALUE) (((VALUE) >> 16) & LOWBYTE_MASK) -#define FOURTHBYTE(VALUE) (((VALUE) >> 24) & LOWBYTE_MASK) +/* VOID + * RtlRetrieveUlong( + * PULONG DestinationAddress, + * PULONG SourceAddress); + */ +#if defined(_AMD64_) +#define RtlRetrieveUlong(DestAddress,SrcAddress) \ + *(ULONG UNALIGNED *)(DestAddress) = *(PULONG)(SrcAddress) +#else +#define RtlRetrieveUlong(DestAddress,SrcAddress) \ + if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \ + { \ + ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \ + ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \ + ((PUCHAR)(DestAddress))[2]=((PUCHAR)(SrcAddress))[2]; \ + ((PUCHAR)(DestAddress))[3]=((PUCHAR)(SrcAddress))[3]; \ + } \ + else \ + { \ + *((PULONG)(DestAddress))=*((PULONG)(SrcAddress)); \ + } +#endif + +/* VOID + * RtlRetrieveUshort( + * PUSHORT DestinationAddress, + * PUSHORT SourceAddress); + */ +#if defined(_AMD64_) +#define RtlRetrieveUshort(DestAddress,SrcAddress) \ + *(USHORT UNALIGNED *)(DestAddress) = *(USHORT)(SrcAddress) +#else +#define RtlRetrieveUshort(DestAddress,SrcAddress) \ + if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \ + { \ + ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \ + ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \ + } \ + else \ + { \ + *((PUSHORT)(DestAddress))=*((PUSHORT)(SrcAddress)); \ + } +#endif NTSYSAPI VOID @@ -8823,7 +6582,17 @@ RtlSetDaclSecurityDescriptor( else { \ *((PULONG)(Address)) = (ULONG) (Value); \ } +#endif +/* VOID + * RtlStoreUlonglong( + * IN OUT PULONGLONG Address, + * ULONGLONG Value); + */ +#if defined(_AMD64_) +#define RtlStoreUlonglong(Address,Value) \ + *(ULONGLONG UNALIGNED *)(Address) = (Value) +#else #define RtlStoreUlonglong(Address,Value) \ if ((ULONG_PTR)(Address) & LONGLONG_MASK) { \ RtlStoreUlong((ULONG_PTR)(Address), \ @@ -8833,7 +6602,30 @@ RtlSetDaclSecurityDescriptor( } else { \ *((PULONGLONG)(Address)) = (ULONGLONG)(Value); \ } +#endif +/* VOID + * RtlStoreUlongPtr( + * IN OUT PULONG_PTR Address, + * IN ULONG_PTR Value); + */ +#ifdef _WIN64 +#define RtlStoreUlongPtr(Address,Value) \ + RtlStoreUlonglong(Address,Value) +#else +#define RtlStoreUlongPtr(Address,Value) \ + RtlStoreUlong(Address,Value) +#endif + +/* VOID + * RtlStoreUshort( + * IN PUSHORT Address, + * IN USHORT Value); + */ +#if defined(_AMD64_) +#define RtlStoreUshort(Address,Value) \ + *(USHORT UNALIGNED *)(Address) = (Value) +#else #define RtlStoreUshort(Address,Value) \ if ((ULONG_PTR)(Address) & SHORT_MASK) { \ ((PUCHAR) (Address))[SHORT_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \ @@ -8842,44 +6634,7 @@ RtlSetDaclSecurityDescriptor( else { \ *((PUSHORT) (Address)) = (USHORT)Value; \ } - -#define RtlRetrieveUshort(DestAddress,SrcAddress) \ - if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \ - { \ - ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \ - ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \ - } \ - else \ - { \ - *((PUSHORT)(DestAddress))=*((PUSHORT)(SrcAddress)); \ - } - -#define RtlRetrieveUlong(DestAddress,SrcAddress) \ - if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \ - { \ - ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \ - ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \ - ((PUCHAR)(DestAddress))[2]=((PUCHAR)(SrcAddress))[2]; \ - ((PUCHAR)(DestAddress))[3]=((PUCHAR)(SrcAddress))[3]; \ - } \ - else \ - { \ - *((PULONG)(DestAddress))=*((PULONG)(SrcAddress)); \ - } - -#endif /* defined(_AMD64_) */ - -#ifdef _WIN64 -/* VOID - * RtlStoreUlongPtr( - * IN OUT PULONG_PTR Address, - * IN ULONG_PTR Value); - */ -#define RtlStoreUlongPtr(Address,Value) RtlStoreUlonglong(Address,Value) -#else -#define RtlStoreUlongPtr(Address,Value) RtlStoreUlong(Address,Value) -#endif /* _WIN64 */ - +#endif NTSYSAPI BOOLEAN @@ -9145,34 +6900,6 @@ RtlConvertUlongToLargeInteger( return ret; } -//DECLSPEC_DEPRECATED_DDK_WINXP -static __inline -LARGE_INTEGER -NTAPI_INLINE -RtlLargeIntegerShiftLeft( - IN LARGE_INTEGER LargeInteger, - IN CCHAR ShiftCount) -{ - LARGE_INTEGER Result; - - Result.QuadPart = LargeInteger.QuadPart << ShiftCount; - return Result; -} - -//DECLSPEC_DEPRECATED_DDK_WINXP -static __inline -LARGE_INTEGER -NTAPI_INLINE -RtlLargeIntegerShiftRight( - IN LARGE_INTEGER LargeInteger, - IN CCHAR ShiftCount) -{ - LARGE_INTEGER Result; - - Result.QuadPart = (ULONG64)LargeInteger.QuadPart >> ShiftCount; - return Result; -} - //DECLSPEC_DEPRECATED_DDK static __inline ULONG @@ -9187,33 +6914,6 @@ RtlEnlargedUnsignedDivide( return (ULONG)(Dividend.QuadPart / Divisor); } -//DECLSPEC_DEPRECATED_DDK -static __inline -LARGE_INTEGER -NTAPI_INLINE -RtlLargeIntegerNegate( - IN LARGE_INTEGER Subtrahend) -{ - LARGE_INTEGER Difference; - - Difference.QuadPart = -Subtrahend.QuadPart; - return Difference; -} - -//DECLSPEC_DEPRECATED_DDK -static __inline -LARGE_INTEGER -NTAPI_INLINE -RtlLargeIntegerSubtract( - IN LARGE_INTEGER Minuend, - IN LARGE_INTEGER Subtrahend) -{ - LARGE_INTEGER Difference; - - Difference.QuadPart = Minuend.QuadPart - Subtrahend.QuadPart; - return Difference; -} - //DECLSPEC_DEPRECATED_DDK static __inline LARGE_INTEGER @@ -9492,10 +7192,6 @@ RtlCheckBit( (__annotation(L"Debug", L"AssertFail", msg), \ DbgRaiseAssertionFailure(), FALSE) : TRUE) -#define NT_VERIFY NT_ASSERT -#define NT_VERIFYMSG NT_ASSERTMSG -#define NT_VERIFYMSGW NT_ASSERTMSGW - #else /* GCC doesn't support __annotation (nor PDB) */ @@ -9522,8 +7218,8 @@ RtlCheckBit( #define RTL_SOFT_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE) #define NT_ASSERT(exp) ((VOID)0) -#define NT_ASSERTMSG(msg, exp) ((VOID)0) -#define NT_ASSERTMSGW(msg, exp) ((VOID)0) +#define NT_ASSERTMSG(exp) ((VOID)0) +#define NT_ASSERTMSGW(exp) ((VOID)0) #define NT_VERIFY(_exp) ((_exp) ? TRUE : FALSE) #define NT_VERIFYMSG(_msg, _exp ) ((_exp) ? TRUE : FALSE) @@ -9610,61 +7306,16 @@ InterlockedPushEntrySList( #endif /* !defined(_WINBASE_) */ -#define RTL_CONTEXT_EX_OFFSET(ContextEx, Chunk) ((ContextEx)->Chunk.Offset) -#define RTL_CONTEXT_EX_LENGTH(ContextEx, Chunk) ((ContextEx)->Chunk.Length) -#define RTL_CONTEXT_EX_CHUNK(Base, Layout, Chunk) \ - ((PVOID)((PCHAR)(Base) + RTL_CONTEXT_EX_OFFSET(Layout, Chunk))) -#define RTL_CONTEXT_OFFSET(Context, Chunk) \ - RTL_CONTEXT_EX_OFFSET((PCONTEXT_EX)(Context + 1), Chunk) -#define RTL_CONTEXT_LENGTH(Context, Chunk) \ - RTL_CONTEXT_EX_LENGTH((PCONTEXT_EX)(Context + 1), Chunk) -#define RTL_CONTEXT_CHUNK(Context, Chunk) \ - RTL_CONTEXT_EX_CHUNK((PCONTEXT_EX)(Context + 1), \ - (PCONTEXT_EX)(Context + 1), \ - Chunk) - -BOOLEAN -RTLVERLIB_DDI(RtlIsNtDdiVersionAvailable)( - IN ULONG Version); - -BOOLEAN -RTLVERLIB_DDI(RtlIsServicePackVersionInstalled)( - IN ULONG Version); - -#ifndef RtlIsNtDdiVersionAvailable -#define RtlIsNtDdiVersionAvailable WdmlibRtlIsNtDdiVersionAvailable -#endif - -#ifndef RtlIsServicePackVersionInstalled -#define RtlIsServicePackVersionInstalled WdmlibRtlIsServicePackVersionInstalled -#endif - -#define RtlInterlockedSetBits(Flags, Flag) \ - InterlockedOr((PLONG)(Flags), Flag) - -#define RtlInterlockedAndBits(Flags, Flag) \ - InterlockedAnd((PLONG)(Flags), Flag) - -#define RtlInterlockedClearBits(Flags, Flag) \ - RtlInterlockedAndBits(Flags, ~(Flag)) - -#define RtlInterlockedXorBits(Flags, Flag) \ - InterlockedXor(Flags, Flag) - -#define RtlInterlockedSetBitsDiscardReturn(Flags, Flag) \ - (VOID) RtlInterlockedSetBits(Flags, Flag) - -#define RtlInterlockedAndBitsDiscardReturn(Flags, Flag) \ - (VOID) RtlInterlockedAndBits(Flags, Flag) - -#define RtlInterlockedClearBitsDiscardReturn(Flags, Flag) \ - RtlInterlockedAndBitsDiscardReturn(Flags, ~(Flag)) - - /****************************************************************************** * Kernel Functions * ******************************************************************************/ +NTHALAPI +KIRQL +NTAPI +KeGetCurrentIrql( + VOID); + NTKERNELAPI VOID NTAPI @@ -10551,22 +8202,6 @@ KeFlushWriteBuffer(VOID); #define ALIGN_UP_POINTER(ptr, type) \ ALIGN_UP_POINTER_BY(ptr, sizeof(type)) -#ifndef FIELD_OFFSET -#define FIELD_OFFSET(type, field) ((ULONG)&(((type *)0)->field)) -#endif - -#ifndef FIELD_SIZE -#define FIELD_SIZE(type, field) (sizeof(((type *)0)->field)) -#endif - -#define POOL_TAGGING 1 - -#if DBG -#define IF_DEBUG if (TRUE) -#else -#define IF_DEBUG if (FALSE) -#endif /* DBG */ - /* ULONG * BYTE_OFFSET( * IN PVOID Va) @@ -10579,7 +8214,7 @@ KeFlushWriteBuffer(VOID); * IN ULONG Size) */ #define BYTES_TO_PAGES(Size) \ - (((Size) + PAGE_SIZE - 1) >> PAGE_SHIFT) + (((Size) >> PAGE_SHIFT) + (((Size) & (PAGE_SIZE - 1)) != 0)) /* PVOID * PAGE_ALIGN( @@ -10873,16 +8508,7 @@ MmUnmapLockedPages( IN PVOID BaseAddress, IN PMDL MemoryDescriptorList); -NTKERNELAPI -PVOID -NTAPI -MmAllocateContiguousMemorySpecifyCacheNode( - IN SIZE_T NumberOfBytes, - IN PHYSICAL_ADDRESS LowestAcceptableAddress, - IN PHYSICAL_ADDRESS HighestAcceptableAddress, - IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL, - IN MEMORY_CACHING_TYPE CacheType, - IN NODE_REQUIREMENT PreferredNode); + #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ @@ -10939,22 +8565,6 @@ MmUnmapReservedMapping( IN ULONG PoolTag, IN PMDL MemoryDescriptorList); -NTKERNELAPI -NTSTATUS -NTAPI -MmAddVerifierThunks( - IN PVOID ThunkBuffer, - IN ULONG ThunkBufferSize); - -#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ - -#if (NTDDI_VERSION >= NTDDI_WS03) -NTKERNELAPI -LOGICAL -NTAPI -MmIsIoSpaceActive( - IN PHYSICAL_ADDRESS StartAddress, - IN SIZE_T NumberOfBytes); #endif #if (NTDDI_VERSION >= NTDDI_WS03SP1) @@ -11183,40 +8793,6 @@ CmGetBoundTransaction( * I/O Manager Functions * ******************************************************************************/ - -/* - * NTSTATUS - * IoAcquireRemoveLock( - * IN PIO_REMOVE_LOCK RemoveLock, - * IN OPTIONAL PVOID Tag) - */ -#if DBG -#define IoAcquireRemoveLock(RemoveLock, Tag) \ - IoAcquireRemoveLockEx(RemoveLock, Tag, __FILE__, __LINE__, sizeof (IO_REMOVE_LOCK)) -#else -#define IoAcquireRemoveLock(RemoveLock, Tag) \ - IoAcquireRemoveLockEx(RemoveLock, Tag, "", 1, sizeof (IO_REMOVE_LOCK)) -#endif - -/* - * VOID - * IoAdjustPagingPathCount( - * IN PLONG Count, - * IN BOOLEAN Increment) - */ -#define IoAdjustPagingPathCount(_Count, \ - _Increment) \ -{ \ - if (_Increment) \ - { \ - InterlockedIncrement(_Count); \ - } \ - else \ - { \ - InterlockedDecrement(_Count); \ - } \ -} - #if !defined(_M_AMD64) NTHALAPI VOID @@ -11743,6 +9319,43 @@ IoAcquireRemoveLockEx( IN PCSTR File, IN ULONG Line, IN ULONG RemlockSize); +#endif + +/* + * NTSTATUS + * IoAcquireRemoveLock( + * IN PIO_REMOVE_LOCK RemoveLock, + * IN OPTIONAL PVOID Tag) + */ +#if DBG +#define IoAcquireRemoveLock(RemoveLock, Tag) \ + IoAcquireRemoveLockEx(RemoveLock, Tag, __FILE__, __LINE__, sizeof (IO_REMOVE_LOCK)) +#else +#define IoAcquireRemoveLock(RemoveLock, Tag) \ + IoAcquireRemoveLockEx(RemoveLock, Tag, "", 1, sizeof (IO_REMOVE_LOCK)) +#endif + +/* + * VOID + * IoAdjustPagingPathCount( + * IN PLONG Count, + * IN BOOLEAN Increment) + */ +#define IoAdjustPagingPathCount(_Count, \ + _Increment) \ +{ \ + if (_Increment) \ + { \ + InterlockedIncrement(_Count); \ + } \ + else \ + { \ + InterlockedDecrement(_Count); \ + } \ +} + +#if (NTDDI_VERSION >= NTDDI_WIN2K) + NTKERNELAPI NTSTATUS NTAPI @@ -12538,237 +10151,9 @@ IoWMISetSingleItem( IN ULONG Version, IN ULONG ValueBufferSize, IN PVOID ValueBuffer); -#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ -#if (NTDDI_VERSION >= NTDDI_WINXPSP1) -NTKERNELAPI -NTSTATUS -NTAPI -IoValidateDeviceIoControlAccess( - IN PIRP Irp, - IN ULONG RequiredAccess); #endif -#if (NTDDI_VERSION >= NTDDI_WS03) - -NTKERNELAPI -NTSTATUS -NTAPI -IoCsqInitializeEx( - IN PIO_CSQ Csq, - IN PIO_CSQ_INSERT_IRP_EX CsqInsertIrp, - IN PIO_CSQ_REMOVE_IRP CsqRemoveIrp, - IN PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp, - IN PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock, - IN PIO_CSQ_RELEASE_LOCK CsqReleaseLock, - IN PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp); - -NTKERNELAPI -NTSTATUS -NTAPI -IoCsqInsertIrpEx( - IN PIO_CSQ Csq, - IN PIRP Irp, - IN PIO_CSQ_IRP_CONTEXT Context OPTIONAL, - IN PVOID InsertContext OPTIONAL); -#endif /* (NTDDI_VERSION >= NTDDI_WS03) */ - - -#if (NTDDI_VERSION >= NTDDI_VISTA) - -NTKERNELAPI -NTSTATUS -NTAPI -IoGetBootDiskInformationLite( - OUT PBOOTDISK_INFORMATION_LITE *BootDiskInformation); - -NTKERNELAPI -NTSTATUS -NTAPI -IoCheckShareAccessEx( - IN ACCESS_MASK DesiredAccess, - IN ULONG DesiredShareAccess, - IN OUT PFILE_OBJECT FileObject, - IN OUT PSHARE_ACCESS ShareAccess, - IN BOOLEAN Update, - IN PBOOLEAN WritePermission); - -NTKERNELAPI -NTSTATUS -NTAPI -IoConnectInterruptEx( - IN OUT PIO_CONNECT_INTERRUPT_PARAMETERS Parameters); - -NTKERNELAPI -VOID -NTAPI -IoDisconnectInterruptEx( - IN PIO_DISCONNECT_INTERRUPT_PARAMETERS Parameters); - -LOGICAL -NTAPI -IoWithinStackLimits( - IN ULONG_PTR RegionStart, - IN SIZE_T RegionSize); - -NTKERNELAPI -VOID -NTAPI -IoSetShareAccessEx( - IN ACCESS_MASK DesiredAccess, - IN ULONG DesiredShareAccess, - IN OUT PFILE_OBJECT FileObject, - OUT PSHARE_ACCESS ShareAccess, - IN PBOOLEAN WritePermission); - -ULONG -NTAPI -IoSizeofWorkItem(VOID); - -VOID -NTAPI -IoInitializeWorkItem( - IN PVOID IoObject, - IN PIO_WORKITEM IoWorkItem); - -VOID -NTAPI -IoUninitializeWorkItem( - IN PIO_WORKITEM IoWorkItem); - -VOID -NTAPI -IoQueueWorkItemEx( - IN PIO_WORKITEM IoWorkItem, - IN PIO_WORKITEM_ROUTINE_EX WorkerRoutine, - IN WORK_QUEUE_TYPE QueueType, - IN PVOID Context OPTIONAL); - -IO_PRIORITY_HINT -NTAPI -IoGetIoPriorityHint( - IN PIRP Irp); - -NTSTATUS -NTAPI -IoSetIoPriorityHint( - IN PIRP Irp, - IN IO_PRIORITY_HINT PriorityHint); - -NTSTATUS -NTAPI -IoAllocateSfioStreamIdentifier( - IN PFILE_OBJECT FileObject, - IN ULONG Length, - IN PVOID Signature, - OUT PVOID *StreamIdentifier); - -PVOID -NTAPI -IoGetSfioStreamIdentifier( - IN PFILE_OBJECT FileObject, - IN PVOID Signature); - -NTSTATUS -NTAPI -IoFreeSfioStreamIdentifier( - IN PFILE_OBJECT FileObject, - IN PVOID Signature); - -NTKERNELAPI -NTSTATUS -NTAPI -IoRequestDeviceEjectEx( - IN PDEVICE_OBJECT PhysicalDeviceObject, - IN PIO_DEVICE_EJECT_CALLBACK Callback OPTIONAL, - IN PVOID Context OPTIONAL, - IN PDRIVER_OBJECT DriverObject OPTIONAL); - -NTKERNELAPI -NTSTATUS -NTAPI -IoSetDevicePropertyData( - IN PDEVICE_OBJECT Pdo, - IN CONST DEVPROPKEY *PropertyKey, - IN LCID Lcid, - IN ULONG Flags, - IN DEVPROPTYPE Type, - IN ULONG Size, - IN PVOID Data OPTIONAL); - -NTKERNELAPI -NTSTATUS -NTAPI -IoGetDevicePropertyData( - PDEVICE_OBJECT Pdo, - CONST DEVPROPKEY *PropertyKey, - LCID Lcid, - ULONG Flags, - ULONG Size, - PVOID Data, - PULONG RequiredSize, - PDEVPROPTYPE Type); - -#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ - -#define IoCallDriverStackSafeDefault(a, b) IoCallDriver(a, b) - -#if (NTDDI_VERSION >= NTDDI_WS08) -NTKERNELAPI -NTSTATUS -NTAPI -IoReplacePartitionUnit( - IN PDEVICE_OBJECT TargetPdo, - IN PDEVICE_OBJECT SparePdo, - IN ULONG Flags); -#endif - -#if (NTDDI_VERSION >= NTDDI_WIN7) - -NTKERNELAPI -NTSTATUS -NTAPI -IoGetAffinityInterrupt( - IN PKINTERRUPT InterruptObject, - OUT PGROUP_AFFINITY GroupAffinity); - -NTSTATUS -NTAPI -IoGetContainerInformation( - IN IO_CONTAINER_INFORMATION_CLASS InformationClass, - IN PVOID ContainerObject OPTIONAL, - IN OUT PVOID Buffer OPTIONAL, - IN ULONG BufferLength); - -NTSTATUS -NTAPI -IoRegisterContainerNotification( - IN IO_CONTAINER_NOTIFICATION_CLASS NotificationClass, - IN PIO_CONTAINER_NOTIFICATION_FUNCTION CallbackFunction, - IN PVOID NotificationInformation OPTIONAL, - IN ULONG NotificationInformationLength, - OUT PVOID CallbackRegistration); - -VOID -NTAPI -IoUnregisterContainerNotification( - IN PVOID CallbackRegistration); - -NTKERNELAPI -NTSTATUS -NTAPI -IoUnregisterPlugPlayNotificationEx( - IN PVOID NotificationEntry); - -NTKERNELAPI -NTSTATUS -NTAPI -IoGetDeviceNumaNode( - IN PDEVICE_OBJECT Pdo, - OUT PUSHORT NodeNumber); - -#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ - #if defined(_WIN64) NTKERNELAPI ULONG @@ -13189,57 +10574,12 @@ PoCreatePowerRequest( #define ExInitializeSListHead InitializeSListHead -#if defined(_NTHAL_) && defined(_X86_) - -NTKERNELAPI -VOID -FASTCALL -ExiAcquireFastMutex( - IN OUT PFAST_MUTEX FastMutex); - -NTKERNELAPI -VOID -FASTCALL -ExiReleaseFastMutex( - IN OUT PFAST_MUTEX FastMutex); - -NTKERNELAPI -BOOLEAN -FASTCALL -ExiTryToAcquireFastMutex( - IN OUT PFAST_MUTEX FastMutex); - +#if defined(_X86_) +#if defined(_NTHAL_) #define ExAcquireFastMutex ExiAcquireFastMutex #define ExReleaseFastMutex ExiReleaseFastMutex #define ExTryToAcquireFastMutex ExiTryToAcquireFastMutex - -#else - -#if (NTDDI_VERSION >= NTDDI_WIN2K) - -NTKERNELAPI -VOID -FASTCALL -ExAcquireFastMutex( - IN OUT PFAST_MUTEX FastMutex); - -NTKERNELAPI -VOID -FASTCALL -ExReleaseFastMutex( - IN OUT PFAST_MUTEX FastMutex); - -NTKERNELAPI -BOOLEAN -FASTCALL -ExTryToAcquireFastMutex( - IN OUT PFAST_MUTEX FastMutex); - -#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ - -#endif /* defined(_NTHAL_) && defined(_X86_) */ - -#if defined(_X86_) +#endif #define ExInterlockedAddUlong ExfInterlockedAddUlong #define ExInterlockedInsertHeadList ExfInterlockedInsertHeadList #define ExInterlockedInsertTailList ExfInterlockedInsertTailList @@ -13297,8 +10637,6 @@ FASTCALL ExInterlockedFlushSList( IN OUT PSLIST_HEADER ListHead); -#endif /* !defined(_WIN64) */ - #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_) NTKERNELAPI @@ -13315,70 +10653,20 @@ ExInterlockedPushEntrySList( IN PSLIST_HEADER ListHead, IN PSINGLE_LIST_ENTRY ListEntry, IN PKSPIN_LOCK Lock); - -NTKERNELAPI -PVOID -NTAPI -ExAllocateFromPagedLookasideList( - IN OUT PPAGED_LOOKASIDE_LIST Lookaside); - -NTKERNELAPI -VOID -NTAPI -ExFreeToPagedLookasideList( - IN OUT PPAGED_LOOKASIDE_LIST Lookaside, - IN PVOID Entry); - -#else /* !_WIN2K_COMPAT_SLIST_USAGE */ - -#if !defined(_WIN64) +#else #define ExInterlockedPopEntrySList(_ListHead, _Lock) \ InterlockedPopEntrySList(_ListHead) #define ExInterlockedPushEntrySList(_ListHead, _ListEntry, _Lock) \ InterlockedPushEntrySList(_ListHead, _ListEntry) -#endif - -static __inline -PVOID -ExAllocateFromPagedLookasideList( - IN OUT PPAGED_LOOKASIDE_LIST Lookaside) -{ - PVOID Entry; - - Lookaside->L.TotalAllocates++; - Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead); - if (Entry == NULL) { - Lookaside->L.AllocateMisses++; - Entry = (Lookaside->L.Allocate)(Lookaside->L.Type, - Lookaside->L.Size, - Lookaside->L.Tag); - } - return Entry; -} - -static __inline -VOID -ExFreeToPagedLookasideList( - IN OUT PPAGED_LOOKASIDE_LIST Lookaside, - IN PVOID Entry) -{ - Lookaside->L.TotalFrees++; - if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) { - Lookaside->L.FreeMisses++; - (Lookaside->L.Free)(Entry); - } else { - InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry); - } -} - -#endif /* _WIN2K_COMPAT_SLIST_USAGE */ +#endif // _WIN2K_COMPAT_SLIST_USAGE +#endif // !defined(_WIN64) /* ERESOURCE_THREAD * ExGetCurrentResourceThread( * VOID); */ -#define ExGetCurrentResourceThread() ((ULONG_PTR)PsGetCurrentThread()) +#define ExGetCurrentResourceThread() ((ERESOURCE_THREAD)PsGetCurrentThread()) #define ExReleaseResource(R) (ExReleaseResourceLite(R)) @@ -13409,6 +10697,24 @@ ExInitializeFastMutex( #if (NTDDI_VERSION >= NTDDI_WIN2K) +NTKERNELAPI +VOID +FASTCALL +ExAcquireFastMutex( + IN OUT PFAST_MUTEX FastMutex); + +NTKERNELAPI +VOID +FASTCALL +ExReleaseFastMutex( + IN OUT PFAST_MUTEX FastMutex); + +NTKERNELAPI +BOOLEAN +FASTCALL +ExTryToAcquireFastMutex( + IN OUT PFAST_MUTEX FastMutex); + NTKERNELAPI VOID FASTCALL @@ -13456,6 +10762,10 @@ ExAllocatePool( IN POOL_TYPE PoolType, IN SIZE_T NumberOfBytes); +#ifdef POOL_TAGGING +#define ExAllocatePool(p,n) ExAllocatePoolWithTag(p,n,' kdD') +#endif /* POOL_TAGGING */ + NTKERNELAPI PVOID NTAPI @@ -13463,6 +10773,10 @@ ExAllocatePoolWithQuota( IN POOL_TYPE PoolType, IN SIZE_T NumberOfBytes); +#ifdef POOL_TAGGING +#define ExAllocatePoolWithQuota(p,n) ExAllocatePoolWithQuotaTag(p,n,' kdD') +#endif /* POOL_TAGGING */ + NTKERNELAPI PVOID NTAPI @@ -13483,10 +10797,6 @@ ExAllocatePoolWithTag( IN SIZE_T NumberOfBytes, IN ULONG Tag); -#ifndef POOL_TAGGING -#define ExAllocatePoolWithTag(a,b,c) ExAllocatePool(a,b) -#endif - NTKERNELAPI PVOID NTAPI @@ -13535,6 +10845,10 @@ NTAPI ExFreePool( IN PVOID P); +#ifdef POOL_TAGGING +#define ExFreePool(P) ExFreePoolWithTag(P, 0) +#endif + NTKERNELAPI VOID NTAPI @@ -13962,83 +11276,35 @@ ExInitializeLookasideListEx( IN SIZE_T Size, IN ULONG Tag, IN USHORT Depth); +#endif -NTKERNELAPI -VOID -NTAPI -ExDeleteLookasideListEx( - IN OUT PLOOKASIDE_LIST_EX Lookaside); +#if !defined(MIDL_PASS) -NTKERNELAPI -VOID -NTAPI -ExFlushLookasideListEx( - IN OUT PLOOKASIDE_LIST_EX Lookaside); - -FORCEINLINE -PVOID -ExAllocateFromLookasideListEx( - IN OUT PLOOKASIDE_LIST_EX Lookaside) +static __inline PVOID +ExAllocateFromNPagedLookasideList( + IN PNPAGED_LOOKASIDE_LIST Lookaside) { PVOID Entry; Lookaside->L.TotalAllocates += 1; Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead); if (Entry == NULL) { - Lookaside->L.AllocateMisses += 1; - Entry = (Lookaside->L.AllocateEx)(Lookaside->L.Type, + Lookaside->L.AllocateMisses++; + Entry = (Lookaside->L.Allocate)(Lookaside->L.Type, Lookaside->L.Size, - Lookaside->L.Tag, - Lookaside); + Lookaside->L.Tag); } return Entry; } -FORCEINLINE -VOID -ExFreeToLookasideListEx( - IN OUT PLOOKASIDE_LIST_EX Lookaside, - IN PVOID Entry) -{ - Lookaside->L.TotalFrees += 1; - if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) { - Lookaside->L.FreeMisses += 1; - (Lookaside->L.FreeEx)(Entry, Lookaside); - } else { - InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry); - } - return; -} - -#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ - -#if (NTDDI_VERSION >= NTDDI_WIN7) - -NTKERNELAPI -VOID -NTAPI -ExSetResourceOwnerPointerEx( - IN OUT PERESOURCE Resource, - IN PVOID OwnerPointer, - IN ULONG Flags); - -#define FLAG_OWNER_POINTER_IS_THREAD 0x1 - -#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ - static __inline PVOID -ExAllocateFromNPagedLookasideList( - IN OUT PNPAGED_LOOKASIDE_LIST Lookaside) +ExAllocateFromPagedLookasideList( + IN PPAGED_LOOKASIDE_LIST Lookaside) { PVOID Entry; Lookaside->L.TotalAllocates++; -#if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_) - Entry = ExInterlockedPopEntrySList(&Lookaside->L.ListHead, - &Lookaside->Lock__ObsoleteButDoNotDelete); -#else Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead); -#endif if (Entry == NULL) { Lookaside->L.AllocateMisses++; Entry = (Lookaside->L.Allocate)(Lookaside->L.Type, @@ -14058,16 +11324,25 @@ ExFreeToNPagedLookasideList( Lookaside->L.FreeMisses++; (Lookaside->L.Free)(Entry); } else { -#if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_) - ExInterlockedPushEntrySList(&Lookaside->L.ListHead, - (PSLIST_ENTRY)Entry, - &Lookaside->Lock__ObsoleteButDoNotDelete); -#else InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry); -#endif } } +static __inline VOID +ExFreeToPagedLookasideList( + IN PPAGED_LOOKASIDE_LIST Lookaside, + IN PVOID Entry) +{ + Lookaside->L.TotalFrees++; + if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) { + Lookaside->L.FreeMisses++; + (Lookaside->L.Free)(Entry); + } else { + InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry); + } +} + +#endif // !defined(MIDL_PASS) /****************************************************************************** * Object Manager Functions * @@ -14303,115 +11578,8 @@ WmiTraceMessageVa( IN va_list MessageArgList); #endif -#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ - -#ifndef TRACE_INFORMATION_CLASS_DEFINE - -#if (NTDDI_VERSION >= NTDDI_WINXP) -NTKERNELAPI -NTSTATUS -NTAPI -WmiQueryTraceInformation( - IN TRACE_INFORMATION_CLASS TraceInformationClass, - OUT PVOID TraceInformation, - IN ULONG TraceInformationLength, - OUT PULONG RequiredLength OPTIONAL, - IN PVOID Buffer OPTIONAL); #endif -#define TRACE_INFORMATION_CLASS_DEFINE - -#endif /* TRACE_INFOPRMATION_CLASS_DEFINE */ - -#if (NTDDI_VERSION >= NTDDI_VISTA) - -NTSTATUS -NTKERNELAPI -NTAPI -EtwRegister( - IN LPCGUID ProviderId, - IN PETWENABLECALLBACK EnableCallback OPTIONAL, - IN PVOID CallbackContext OPTIONAL, - OUT PREGHANDLE RegHandle); - -NTSTATUS -NTKERNELAPI -NTAPI -EtwUnregister( - IN REGHANDLE RegHandle); - -BOOLEAN -NTKERNELAPI -NTAPI -EtwEventEnabled( - IN REGHANDLE RegHandle, - IN PCEVENT_DESCRIPTOR EventDescriptor); - -BOOLEAN -NTKERNELAPI -NTAPI -EtwProviderEnabled( - IN REGHANDLE RegHandle, - IN UCHAR Level, - IN ULONGLONG Keyword); - -NTSTATUS -NTKERNELAPI -NTAPI -EtwActivityIdControl( - IN ULONG ControlCode, - IN OUT LPGUID ActivityId); - -NTSTATUS -NTKERNELAPI -NTAPI -EtwWrite( - IN REGHANDLE RegHandle, - IN PCEVENT_DESCRIPTOR EventDescriptor, - IN LPCGUID ActivityId OPTIONAL, - IN ULONG UserDataCount, - IN PEVENT_DATA_DESCRIPTOR UserData OPTIONAL); - -NTSTATUS -NTKERNELAPI -NTAPI -EtwWriteTransfer( - IN REGHANDLE RegHandle, - IN PCEVENT_DESCRIPTOR EventDescriptor, - IN LPCGUID ActivityId OPTIONAL, - IN LPCGUID RelatedActivityId OPTIONAL, - IN ULONG UserDataCount, - IN PEVENT_DATA_DESCRIPTOR UserData OPTIONAL); - -NTSTATUS -NTKERNELAPI -NTAPI -EtwWriteString( - IN REGHANDLE RegHandle, - IN UCHAR Level, - IN ULONGLONG Keyword, - IN LPCGUID ActivityId OPTIONAL, - IN PCWSTR String); - -#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ - -#if (NTDDI_VERSION >= NTDDI_WIN7) -NTSTATUS -NTKERNELAPI -NTAPI -EtwWriteEx( - IN REGHANDLE RegHandle, - IN PCEVENT_DESCRIPTOR EventDescriptor, - IN ULONG64 Filter, - IN ULONG Flags, - IN LPCGUID ActivityId OPTIONAL, - IN LPCGUID RelatedActivityId OPTIONAL, - IN ULONG UserDataCount, - IN PEVENT_DATA_DESCRIPTOR UserData OPTIONAL); -#endif - - - /****************************************************************************** * Kernel Debugger Functions * ******************************************************************************/ @@ -14423,86 +11591,8 @@ __cdecl DbgPrint( IN PCSTR Format, IN ...); - -#if (NTDDI_VERSION >= NTDDI_WIN2K) -NTSYSAPI -ULONG -__cdecl -DbgPrintReturnControlC( - IN PCCH Format, - IN ...); #endif -#if (NTDDI_VERSION >= NTDDI_WINXP) - -NTSYSAPI -ULONG -__cdecl -DbgPrintEx( - IN ULONG ComponentId, - IN ULONG Level, - IN PCSTR Format, - IN ...); - -#ifdef _VA_LIST_DEFINED - -NTSYSAPI -ULONG -NTAPI -vDbgPrintEx( - IN ULONG ComponentId, - IN ULONG Level, - IN PCCH Format, - IN va_list ap); - -NTSYSAPI -ULONG -NTAPI -vDbgPrintExWithPrefix( - IN PCCH Prefix, - IN ULONG ComponentId, - IN ULONG Level, - IN PCCH Format, - IN va_list ap); - -#endif /* _VA_LIST_DEFINED */ - -NTSYSAPI -NTSTATUS -NTAPI -DbgQueryDebugFilterState( - IN ULONG ComponentId, - IN ULONG Level); - -NTSYSAPI -NTSTATUS -NTAPI -DbgSetDebugFilterState( - IN ULONG ComponentId, - IN ULONG Level, - IN BOOLEAN State); - -#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ - -#if (NTDDI_VERSION >= NTDDI_VISTA) - -typedef VOID -(*PDEBUG_PRINT_CALLBACK)( - IN PSTRING Output, - IN ULONG ComponentId, - IN ULONG Level); - -NTSYSAPI -NTSTATUS -NTAPI -DbgSetDebugPrintCallback( - IN PDEBUG_PRINT_CALLBACK DebugPrintCallback, - IN BOOLEAN Enable); - -#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ - -#endif /* _DBGNT_ */ - #if DBG #define KdPrint(_x_) DbgPrint _x_ @@ -14546,6 +11636,31 @@ extern BOOLEAN KdDebuggerEnabled; #endif +#ifdef _VA_LIST_DEFINED +#if (NTDDI_VERSION >= NTDDI_WINXP) + +NTSYSAPI +ULONG +NTAPI +vDbgPrintEx( + IN ULONG ComponentId, + IN ULONG Level, + IN PCCH Format, + IN va_list ap); + +NTSYSAPI +ULONG +NTAPI +vDbgPrintExWithPrefix( + IN PCCH Prefix, + IN ULONG ComponentId, + IN ULONG Level, + IN PCCH Format, + IN va_list ap); + +#endif +#endif // _VA_LIST_DEFINED + #if (NTDDI_VERSION >= NTDDI_WIN2K) NTKERNELAPI @@ -14572,7 +11687,42 @@ NTAPI DbgBreakPointWithStatus( IN ULONG Status); -#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ +NTSYSAPI +ULONG +_cdecl +DbgPrintReturnControlC( + IN PCCH Format, + IN ...); + +#endif + +#if (NTDDI_VERSION >= NTDDI_WINXP) + +NTSYSAPI +ULONG +_cdecl +DbgPrintEx( + IN ULONG ComponentId, + IN ULONG Level, + IN PCSTR Format, + IN ...); + +NTSYSAPI +NTSTATUS +NTAPI +DbgQueryDebugFilterState( + IN ULONG ComponentId, + IN ULONG Level); + +NTSYSAPI +NTSTATUS +NTAPI +DbgSetDebugFilterState( + IN ULONG ComponentId, + IN ULONG Level, + IN BOOLEAN State); + +#endif #if (NTDDI_VERSION >= NTDDI_WS03) NTKERNELAPI @@ -14593,9 +11743,6 @@ KdChangeOption( OUT PVOID OutBuffer, OUT PULONG OutBufferNeeded OPTIONAL); #endif -/* Hardware Abstraction Layer Functions */ - -#if (NTDDI_VERSION >= NTDDI_WIN2K) #if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_) @@ -14649,224 +11796,14 @@ HalReadDmaCounter( return counter; } -FORCEINLINE -ULONG -HalGetDmaAlignment( - IN PDMA_ADAPTER DmaAdapter) -{ - PGET_DMA_ALIGNMENT getDmaAlignment; - ULONG alignment; +#endif - getDmaAlignment = *(DmaAdapter)->DmaOperations->GetDmaAlignment; - ASSERT( getDmaAlignment != NULL ); - alignment = getDmaAlignment( DmaAdapter ); - return alignment; -} - -#endif /* USE_DMA_MACROS ... */ -#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ #ifndef _NTTMAPI_ #define _NTTMAPI_ #include -#define TRANSACTIONMANAGER_QUERY_INFORMATION (0x0001) -#define TRANSACTIONMANAGER_SET_INFORMATION (0x0002) -#define TRANSACTIONMANAGER_RECOVER (0x0004) -#define TRANSACTIONMANAGER_RENAME (0x0008) -#define TRANSACTIONMANAGER_CREATE_RM (0x0010) -#define TRANSACTIONMANAGER_BIND_TRANSACTION (0x0020) - -#define TRANSACTIONMANAGER_GENERIC_READ (STANDARD_RIGHTS_READ |\ - TRANSACTIONMANAGER_QUERY_INFORMATION) - -#define TRANSACTIONMANAGER_GENERIC_WRITE (STANDARD_RIGHTS_WRITE |\ - TRANSACTIONMANAGER_SET_INFORMATION |\ - TRANSACTIONMANAGER_RECOVER |\ - TRANSACTIONMANAGER_RENAME |\ - TRANSACTIONMANAGER_CREATE_RM) - -#define TRANSACTIONMANAGER_GENERIC_EXECUTE (STANDARD_RIGHTS_EXECUTE) - -#define TRANSACTIONMANAGER_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED |\ - TRANSACTIONMANAGER_GENERIC_READ |\ - TRANSACTIONMANAGER_GENERIC_WRITE |\ - TRANSACTIONMANAGER_GENERIC_EXECUTE |\ - TRANSACTIONMANAGER_BIND_TRANSACTION) - -#define TRANSACTION_QUERY_INFORMATION (0x0001) -#define TRANSACTION_SET_INFORMATION (0x0002) -#define TRANSACTION_ENLIST (0x0004) -#define TRANSACTION_COMMIT (0x0008) -#define TRANSACTION_ROLLBACK (0x0010) -#define TRANSACTION_PROPAGATE (0x0020) -#define TRANSACTION_RIGHT_RESERVED1 (0x0040) - -#define TRANSACTION_GENERIC_READ (STANDARD_RIGHTS_READ |\ - TRANSACTION_QUERY_INFORMATION |\ - SYNCHRONIZE) - -#define TRANSACTION_GENERIC_WRITE (STANDARD_RIGHTS_WRITE |\ - TRANSACTION_SET_INFORMATION |\ - TRANSACTION_COMMIT |\ - TRANSACTION_ENLIST |\ - TRANSACTION_ROLLBACK |\ - TRANSACTION_PROPAGATE |\ - SYNCHRONIZE) - -#define TRANSACTION_GENERIC_EXECUTE (STANDARD_RIGHTS_EXECUTE |\ - TRANSACTION_COMMIT |\ - TRANSACTION_ROLLBACK |\ - SYNCHRONIZE) - -#define TRANSACTION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED |\ - TRANSACTION_GENERIC_READ |\ - TRANSACTION_GENERIC_WRITE |\ - TRANSACTION_GENERIC_EXECUTE) - -#define TRANSACTION_RESOURCE_MANAGER_RIGHTS (TRANSACTION_GENERIC_READ |\ - STANDARD_RIGHTS_WRITE |\ - TRANSACTION_SET_INFORMATION |\ - TRANSACTION_ENLIST |\ - TRANSACTION_ROLLBACK |\ - TRANSACTION_PROPAGATE |\ - SYNCHRONIZE) - -#define RESOURCEMANAGER_QUERY_INFORMATION (0x0001) -#define RESOURCEMANAGER_SET_INFORMATION (0x0002) -#define RESOURCEMANAGER_RECOVER (0x0004) -#define RESOURCEMANAGER_ENLIST (0x0008) -#define RESOURCEMANAGER_GET_NOTIFICATION (0x0010) -#define RESOURCEMANAGER_REGISTER_PROTOCOL (0x0020) -#define RESOURCEMANAGER_COMPLETE_PROPAGATION (0x0040) - -#define RESOURCEMANAGER_GENERIC_READ (STANDARD_RIGHTS_READ |\ - RESOURCEMANAGER_QUERY_INFORMATION |\ - SYNCHRONIZE) - -#define RESOURCEMANAGER_GENERIC_WRITE (STANDARD_RIGHTS_WRITE |\ - RESOURCEMANAGER_SET_INFORMATION |\ - RESOURCEMANAGER_RECOVER |\ - RESOURCEMANAGER_ENLIST |\ - RESOURCEMANAGER_GET_NOTIFICATION |\ - RESOURCEMANAGER_REGISTER_PROTOCOL |\ - RESOURCEMANAGER_COMPLETE_PROPAGATION |\ - SYNCHRONIZE) - -#define RESOURCEMANAGER_GENERIC_EXECUTE (STANDARD_RIGHTS_EXECUTE |\ - RESOURCEMANAGER_RECOVER |\ - RESOURCEMANAGER_ENLIST |\ - RESOURCEMANAGER_GET_NOTIFICATION |\ - RESOURCEMANAGER_COMPLETE_PROPAGATION |\ - SYNCHRONIZE) - -#define RESOURCEMANAGER_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED |\ - RESOURCEMANAGER_GENERIC_READ |\ - RESOURCEMANAGER_GENERIC_WRITE |\ - RESOURCEMANAGER_GENERIC_EXECUTE) - -#define ENLISTMENT_QUERY_INFORMATION (0x0001) -#define ENLISTMENT_SET_INFORMATION (0x0002) -#define ENLISTMENT_RECOVER (0x0004) -#define ENLISTMENT_SUBORDINATE_RIGHTS (0x0008) -#define ENLISTMENT_SUPERIOR_RIGHTS (0x0010) - -#define ENLISTMENT_GENERIC_READ (STANDARD_RIGHTS_READ |\ - ENLISTMENT_QUERY_INFORMATION) - -#define ENLISTMENT_GENERIC_WRITE (STANDARD_RIGHTS_WRITE |\ - ENLISTMENT_SET_INFORMATION |\ - ENLISTMENT_RECOVER |\ - ENLISTMENT_SUBORDINATE_RIGHTS |\ - ENLISTMENT_SUPERIOR_RIGHTS) - -#define ENLISTMENT_GENERIC_EXECUTE (STANDARD_RIGHTS_EXECUTE |\ - ENLISTMENT_RECOVER |\ - ENLISTMENT_SUBORDINATE_RIGHTS |\ - ENLISTMENT_SUPERIOR_RIGHTS) - -#define ENLISTMENT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED |\ - ENLISTMENT_GENERIC_READ |\ - ENLISTMENT_GENERIC_WRITE |\ - ENLISTMENT_GENERIC_EXECUTE) - -typedef enum _TRANSACTION_OUTCOME { - TransactionOutcomeUndetermined = 1, - TransactionOutcomeCommitted, - TransactionOutcomeAborted, -} TRANSACTION_OUTCOME; - - -typedef enum _TRANSACTION_STATE { - TransactionStateNormal = 1, - TransactionStateIndoubt, - TransactionStateCommittedNotify, -} TRANSACTION_STATE; - - -typedef struct _TRANSACTION_BASIC_INFORMATION { - GUID TransactionId; - ULONG State; - ULONG Outcome; -} TRANSACTION_BASIC_INFORMATION, *PTRANSACTION_BASIC_INFORMATION; - -typedef struct _TRANSACTIONMANAGER_BASIC_INFORMATION { - GUID TmIdentity; - LARGE_INTEGER VirtualClock; -} TRANSACTIONMANAGER_BASIC_INFORMATION, *PTRANSACTIONMANAGER_BASIC_INFORMATION; - -typedef struct _TRANSACTIONMANAGER_LOG_INFORMATION { - GUID LogIdentity; -} TRANSACTIONMANAGER_LOG_INFORMATION, *PTRANSACTIONMANAGER_LOG_INFORMATION; - -typedef struct _TRANSACTIONMANAGER_LOGPATH_INFORMATION { - ULONG LogPathLength; - WCHAR LogPath[1]; -} TRANSACTIONMANAGER_LOGPATH_INFORMATION, *PTRANSACTIONMANAGER_LOGPATH_INFORMATION; - -typedef struct _TRANSACTIONMANAGER_RECOVERY_INFORMATION { - ULONGLONG LastRecoveredLsn; -} TRANSACTIONMANAGER_RECOVERY_INFORMATION, *PTRANSACTIONMANAGER_RECOVERY_INFORMATION; - -typedef struct _TRANSACTION_PROPERTIES_INFORMATION { - ULONG IsolationLevel; - ULONG IsolationFlags; - LARGE_INTEGER Timeout; - ULONG Outcome; - ULONG DescriptionLength; - WCHAR Description[1]; -} TRANSACTION_PROPERTIES_INFORMATION, *PTRANSACTION_PROPERTIES_INFORMATION; - -typedef struct _TRANSACTION_BIND_INFORMATION { - HANDLE TmHandle; -} TRANSACTION_BIND_INFORMATION, *PTRANSACTION_BIND_INFORMATION; - -typedef struct _TRANSACTION_ENLISTMENT_PAIR { - GUID EnlistmentId; - GUID ResourceManagerId; -} TRANSACTION_ENLISTMENT_PAIR, *PTRANSACTION_ENLISTMENT_PAIR; - -typedef struct _TRANSACTION_ENLISTMENTS_INFORMATION { - ULONG NumberOfEnlistments; - TRANSACTION_ENLISTMENT_PAIR EnlistmentPair[1]; -} TRANSACTION_ENLISTMENTS_INFORMATION, *PTRANSACTION_ENLISTMENTS_INFORMATION; - -typedef struct _TRANSACTION_SUPERIOR_ENLISTMENT_INFORMATION { - TRANSACTION_ENLISTMENT_PAIR SuperiorEnlistmentPair; -} TRANSACTION_SUPERIOR_ENLISTMENT_INFORMATION, *PTRANSACTION_SUPERIOR_ENLISTMENT_INFORMATION; - -typedef struct _RESOURCEMANAGER_BASIC_INFORMATION { - GUID ResourceManagerId; - ULONG DescriptionLength; - WCHAR Description[1]; -} RESOURCEMANAGER_BASIC_INFORMATION, *PRESOURCEMANAGER_BASIC_INFORMATION; - -typedef struct _RESOURCEMANAGER_COMPLETION_INFORMATION { - HANDLE IoCompletionPortHandle; - ULONG_PTR CompletionKey; -} RESOURCEMANAGER_COMPLETION_INFORMATION, *PRESOURCEMANAGER_COMPLETION_INFORMATION; - typedef enum _KTMOBJECT_TYPE { KTMOBJECT_TRANSACTION, KTMOBJECT_TRANSACTION_MANAGER, @@ -14900,421 +11837,12 @@ typedef enum _RESOURCEMANAGER_INFORMATION_CLASS { ResourceManagerCompletionInformation, } RESOURCEMANAGER_INFORMATION_CLASS; -typedef struct _ENLISTMENT_BASIC_INFORMATION { - GUID EnlistmentId; - GUID TransactionId; - GUID ResourceManagerId; -} ENLISTMENT_BASIC_INFORMATION, *PENLISTMENT_BASIC_INFORMATION; - -typedef struct _ENLISTMENT_CRM_INFORMATION { - GUID CrmTransactionManagerId; - GUID CrmResourceManagerId; - GUID CrmEnlistmentId; -} ENLISTMENT_CRM_INFORMATION, *PENLISTMENT_CRM_INFORMATION; - typedef enum _ENLISTMENT_INFORMATION_CLASS { EnlistmentBasicInformation, EnlistmentRecoveryInformation, EnlistmentCrmInformation } ENLISTMENT_INFORMATION_CLASS; -typedef struct _TRANSACTION_LIST_ENTRY { -#if defined(__cplusplus) - ::UOW UOW; -#else - UOW UOW; -#endif -} TRANSACTION_LIST_ENTRY, *PTRANSACTION_LIST_ENTRY; - -typedef struct _TRANSACTION_LIST_INFORMATION { - ULONG NumberOfTransactions; - TRANSACTION_LIST_ENTRY TransactionInformation[1]; -} TRANSACTION_LIST_INFORMATION, *PTRANSACTION_LIST_INFORMATION; - -typedef NTSTATUS -(NTAPI *PFN_NT_CREATE_TRANSACTION)( - OUT PHANDLE TransactionHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, - IN LPGUID Uow OPTIONAL, - IN HANDLE TmHandle OPTIONAL, - IN ULONG CreateOptions OPTIONAL, - IN ULONG IsolationLevel OPTIONAL, - IN ULONG IsolationFlags OPTIONAL, - IN PLARGE_INTEGER Timeout OPTIONAL, - IN PUNICODE_STRING Description OPTIONAL); - -typedef NTSTATUS -(NTAPI *PFN_NT_OPEN_TRANSACTION)( - OUT PHANDLE TransactionHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes, - IN LPGUID Uow OPTIONAL, - IN HANDLE TmHandle OPTIONAL); - -typedef NTSTATUS -(NTAPI *PFN_NT_QUERY_INFORMATION_TRANSACTION)( - IN HANDLE TransactionHandle, - IN TRANSACTION_INFORMATION_CLASS TransactionInformationClass, - OUT PVOID TransactionInformation, - IN ULONG TransactionInformationLength, - OUT PULONG ReturnLength OPTIONAL); - -typedef NTSTATUS -(NTAPI *PFN_NT_SET_INFORMATION_TRANSACTION)( - IN HANDLE TransactionHandle, - IN TRANSACTION_INFORMATION_CLASS TransactionInformationClass, - IN PVOID TransactionInformation, - IN ULONG TransactionInformationLength); - -typedef NTSTATUS -(NTAPI *PFN_NT_COMMIT_TRANSACTION)( - IN HANDLE TransactionHandle, - IN BOOLEAN Wait); - -typedef NTSTATUS -(NTAPI *PFN_NT_ROLLBACK_TRANSACTION)( - IN HANDLE TransactionHandle, - IN BOOLEAN Wait); - -#if (NTDDI_VERSION >= NTDDI_VISTA) - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtCreateTransactionManager( - OUT PHANDLE TmHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, - IN PUNICODE_STRING LogFileName OPTIONAL, - IN ULONG CreateOptions OPTIONAL, - IN ULONG CommitStrength OPTIONAL); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtOpenTransactionManager( - OUT PHANDLE TmHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, - IN PUNICODE_STRING LogFileName OPTIONAL, - IN LPGUID TmIdentity OPTIONAL, - IN ULONG OpenOptions OPTIONAL); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtRenameTransactionManager( - IN PUNICODE_STRING LogFileName, - IN LPGUID ExistingTransactionManagerGuid); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtRollforwardTransactionManager( - IN HANDLE TransactionManagerHandle, - IN PLARGE_INTEGER TmVirtualClock OPTIONAL); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtRecoverTransactionManager( - IN HANDLE TransactionManagerHandle); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtQueryInformationTransactionManager( - IN HANDLE TransactionManagerHandle, - IN TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass, - OUT PVOID TransactionManagerInformation, - IN ULONG TransactionManagerInformationLength, - OUT PULONG ReturnLength); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtSetInformationTransactionManager( - IN HANDLE TmHandle OPTIONAL, - IN TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass, - IN PVOID TransactionManagerInformation, - IN ULONG TransactionManagerInformationLength); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtEnumerateTransactionObject( - IN HANDLE RootObjectHandle OPTIONAL, - IN KTMOBJECT_TYPE QueryType, - IN OUT PKTMOBJECT_CURSOR ObjectCursor, - IN ULONG ObjectCursorLength, - OUT PULONG ReturnLength); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtCreateTransaction( - OUT PHANDLE TransactionHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, - IN LPGUID Uow OPTIONAL, - IN HANDLE TmHandle OPTIONAL, - IN ULONG CreateOptions OPTIONAL, - IN ULONG IsolationLevel OPTIONAL, - IN ULONG IsolationFlags OPTIONAL, - IN PLARGE_INTEGER Timeout OPTIONAL, - IN PUNICODE_STRING Description OPTIONAL); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtOpenTransaction( - OUT PHANDLE TransactionHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes, - IN LPGUID Uow, - IN HANDLE TmHandle OPTIONAL); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtQueryInformationTransaction( - IN HANDLE TransactionHandle, - IN TRANSACTION_INFORMATION_CLASS TransactionInformationClass, - OUT PVOID TransactionInformation, - IN ULONG TransactionInformationLength, - OUT PULONG ReturnLength OPTIONAL); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtSetInformationTransaction( - IN HANDLE TransactionHandle, - IN TRANSACTION_INFORMATION_CLASS TransactionInformationClass, - IN PVOID TransactionInformation, - IN ULONG TransactionInformationLength); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtCommitTransaction( - IN HANDLE TransactionHandle, - IN BOOLEAN Wait); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtRollbackTransaction( - IN HANDLE TransactionHandle, - IN BOOLEAN Wait); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtCreateEnlistment( - OUT PHANDLE EnlistmentHandle, - IN ACCESS_MASK DesiredAccess, - IN HANDLE ResourceManagerHandle, - IN HANDLE TransactionHandle, - IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, - IN ULONG CreateOptions OPTIONAL, - IN NOTIFICATION_MASK NotificationMask, - IN PVOID EnlistmentKey OPTIONAL); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtOpenEnlistment( - OUT PHANDLE EnlistmentHandle, - IN ACCESS_MASK DesiredAccess, - IN HANDLE ResourceManagerHandle, - IN LPGUID EnlistmentGuid, - IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtQueryInformationEnlistment( - IN HANDLE EnlistmentHandle, - IN ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass, - OUT PVOID EnlistmentInformation, - IN ULONG EnlistmentInformationLength, - OUT PULONG ReturnLength); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtSetInformationEnlistment( - IN HANDLE EnlistmentHandle OPTIONAL, - IN ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass, - IN PVOID EnlistmentInformation, - IN ULONG EnlistmentInformationLength); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtRecoverEnlistment( - IN HANDLE EnlistmentHandle, - IN PVOID EnlistmentKey OPTIONAL); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtPrePrepareEnlistment( - IN HANDLE EnlistmentHandle, - IN PLARGE_INTEGER TmVirtualClock OPTIONAL); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtPrepareEnlistment( - IN HANDLE EnlistmentHandle, - IN PLARGE_INTEGER TmVirtualClock OPTIONAL); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtCommitEnlistment( - IN HANDLE EnlistmentHandle, - IN PLARGE_INTEGER TmVirtualClock OPTIONAL); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtRollbackEnlistment( - IN HANDLE EnlistmentHandle, - IN PLARGE_INTEGER TmVirtualClock OPTIONAL); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtPrePrepareComplete( - IN HANDLE EnlistmentHandle, - IN PLARGE_INTEGER TmVirtualClock OPTIONAL); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtPrepareComplete( - IN HANDLE EnlistmentHandle, - IN PLARGE_INTEGER TmVirtualClock OPTIONAL); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtCommitComplete( - IN HANDLE EnlistmentHandle, - IN PLARGE_INTEGER TmVirtualClock OPTIONAL); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtReadOnlyEnlistment( - IN HANDLE EnlistmentHandle, - IN PLARGE_INTEGER TmVirtualClock OPTIONAL); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtRollbackComplete( - IN HANDLE EnlistmentHandle, - IN PLARGE_INTEGER TmVirtualClock OPTIONAL); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtSinglePhaseReject( - IN HANDLE EnlistmentHandle, - IN PLARGE_INTEGER TmVirtualClock OPTIONAL); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtCreateResourceManager( - OUT PHANDLE ResourceManagerHandle, - IN ACCESS_MASK DesiredAccess, - IN HANDLE TmHandle, - IN LPGUID RmGuid, - IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, - IN ULONG CreateOptions OPTIONAL, - IN PUNICODE_STRING Description OPTIONAL); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtOpenResourceManager( - OUT PHANDLE ResourceManagerHandle, - IN ACCESS_MASK DesiredAccess, - IN HANDLE TmHandle, - IN LPGUID ResourceManagerGuid OPTIONAL, - IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtRecoverResourceManager( - IN HANDLE ResourceManagerHandle); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtGetNotificationResourceManager( - IN HANDLE ResourceManagerHandle, - OUT PTRANSACTION_NOTIFICATION TransactionNotification, - IN ULONG NotificationLength, - IN PLARGE_INTEGER Timeout OPTIONAL, - OUT PULONG ReturnLength OPTIONAL, - IN ULONG Asynchronous, - IN ULONG_PTR AsynchronousContext OPTIONAL); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtQueryInformationResourceManager( - IN HANDLE ResourceManagerHandle, - IN RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass, - OUT PVOID ResourceManagerInformation, - IN ULONG ResourceManagerInformationLength, - OUT PULONG ReturnLength OPTIONAL); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtSetInformationResourceManager( - IN HANDLE ResourceManagerHandle, - IN RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass, - IN PVOID ResourceManagerInformation, - IN ULONG ResourceManagerInformationLength); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtRegisterProtocolAddressInformation( - IN HANDLE ResourceManager, - IN PCRM_PROTOCOL_ID ProtocolId, - IN ULONG ProtocolInformationSize, - IN PVOID ProtocolInformation, - IN ULONG CreateOptions OPTIONAL); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtPropagationComplete( - IN HANDLE ResourceManagerHandle, - IN ULONG RequestCookie, - IN ULONG BufferLength, - IN PVOID Buffer); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtPropagationFailed( - IN HANDLE ResourceManagerHandle, - IN ULONG RequestCookie, - IN NTSTATUS PropStatus); - -#endif /* NTDDI_VERSION >= NTDDI_VISTA */ - #endif /* !_NTTMAPI_ */ /****************************************************************************** * ZwXxx Functions * @@ -16006,8 +12534,78 @@ ZwSetInformationKey( IN PVOID KeySetInformation, IN ULONG KeySetInformationLength); +#endif + +/****************************************************************************** + * Unsorted * + ******************************************************************************/ + +/* GUID Comparison */ +#ifndef __IID_ALIGNED__ +#define __IID_ALIGNED__ +#ifdef __cplusplus +inline int IsEqualGUIDAligned(REFGUID guid1, REFGUID guid2) +{ + return ( (*(PLONGLONG)(&guid1) == *(PLONGLONG)(&guid2)) && + (*((PLONGLONG)(&guid1) + 1) == *((PLONGLONG)(&guid2) + 1)) ); +} +#else +#define IsEqualGUIDAligned(guid1, guid2) \ + ( (*(PLONGLONG)(guid1) == *(PLONGLONG)(guid2)) && \ + (*((PLONGLONG)(guid1) + 1) == *((PLONGLONG)(guid2) + 1)) ) +#endif /* __cplusplus */ +#endif /* !__IID_ALIGNED__ */ + +typedef enum { + LT_DONT_CARE, + LT_LOWEST_LATENCY +} LATENCY_TIME; + +#define MAXIMUM_SUSPEND_COUNT MAXCHAR + +#define MAXIMUM_FILENAME_LENGTH 256 + +#define OBJ_NAME_PATH_SEPARATOR ((WCHAR)L'\\') + +#define OBJECT_TYPE_CREATE (0x0001) +#define OBJECT_TYPE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1) + +#define DIRECTORY_QUERY (0x0001) +#define DIRECTORY_TRAVERSE (0x0002) +#define DIRECTORY_CREATE_OBJECT (0x0004) +#define DIRECTORY_CREATE_SUBDIRECTORY (0x0008) +#define DIRECTORY_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0xF) + +#define EVENT_QUERY_STATE (0x0001) +#define EVENT_MODIFY_STATE (0x0002) +#define EVENT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3) + +#define SEMAPHORE_QUERY_STATE (0x0001) +#define SEMAPHORE_MODIFY_STATE (0x0002) +#define SEMAPHORE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3) + +#define SYMBOLIC_LINK_QUERY 0x0001 +#define SYMBOLIC_LINK_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1) + +#define DUPLICATE_CLOSE_SOURCE 0x00000001 +#define DUPLICATE_SAME_ACCESS 0x00000002 +#define DUPLICATE_SAME_ATTRIBUTES 0x00000004 + +/* Global debug flag */ +extern ULONG NtGlobalFlag; + +/* Service Start Types */ +#define SERVICE_BOOT_START 0x00000000 +#define SERVICE_SYSTEM_START 0x00000001 +#define SERVICE_AUTO_START 0x00000002 +#define SERVICE_DEMAND_START 0x00000003 +#define SERVICE_DISABLED 0x00000004 + +#ifndef _TRACEHANDLE_DEFINED +#define _TRACEHANDLE_DEFINED +typedef ULONG64 TRACEHANDLE, *PTRACEHANDLE; +#endif -#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ #ifdef __cplusplus diff --git a/reactos/include/ndk/ketypes.h b/reactos/include/ndk/ketypes.h index 67985379372..d4ae1c545f0 100644 --- a/reactos/include/ndk/ketypes.h +++ b/reactos/include/ndk/ketypes.h @@ -546,6 +546,17 @@ typedef enum _KAPC_ENVIRONMENT InsertApcEnvironment } KAPC_ENVIRONMENT; +// +// CPU Cache Types +// +typedef enum _PROCESSOR_CACHE_TYPE +{ + CacheUnified, + CacheInstruction, + CacheData, + CacheTrace, +} PROCESSOR_CACHE_TYPE; + // // PRCB DPC Data // @@ -566,6 +577,18 @@ typedef struct _PP_LOOKASIDE_LIST struct _GENERAL_LOOKASIDE *L; } PP_LOOKASIDE_LIST, *PPP_LOOKASIDE_LIST; +// +// CPU Cache Descriptor +// +typedef struct _CACHE_DESCRIPTOR +{ + UCHAR Level; + UCHAR Associativity; + USHORT LineSize; + ULONG Size; + PROCESSOR_CACHE_TYPE Type; +} CACHE_DESCRIPTOR, *PCACHE_DESCRIPTOR; + // // Architectural Types // From d26ada063964061de470b69ae7188077e30b6553 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Mon, 19 Apr 2010 17:30:34 +0000 Subject: [PATCH 007/131] Merge changes to ketypes.h and ntimage.h from the last revert back. svn path=/trunk/; revision=46945 --- reactos/include/ddk/ntddk.h | 13 +++++++++++++ reactos/include/ddk/ntimage.h | 17 ++++++++++++++--- reactos/include/ddk/wdm.h | 32 ++++++++++++++++++++++++++++---- reactos/include/ndk/ketypes.h | 23 ----------------------- 4 files changed, 55 insertions(+), 30 deletions(-) diff --git a/reactos/include/ddk/ntddk.h b/reactos/include/ddk/ntddk.h index 62c1f7873f1..6d8bacd4ce8 100644 --- a/reactos/include/ddk/ntddk.h +++ b/reactos/include/ddk/ntddk.h @@ -72,6 +72,19 @@ typedef struct _BUS_HANDLER *PBUS_HANDLER; typedef struct _PEB *PPEB; +#ifndef _NTIMAGE_ + +typedef struct _IMAGE_NT_HEADERS *PIMAGE_NT_HEADERS32; +typedef struct _IMAGE_NT_HEADERS64 *PIMAGE_NT_HEADERS64; + +#ifdef _WIN64 +typedef PIMAGE_NT_HEADERS64 PIMAGE_NT_HEADERS; +#else +typedef PIMAGE_NT_HEADERS32 PIMAGE_NT_HEADERS; +#endif + +#endif /* _NTIMAGE_ */ + #define EXCEPTION_READ_FAULT 0 #define EXCEPTION_WRITE_FAULT 1 #define EXCEPTION_EXECUTE_FAULT 8 diff --git a/reactos/include/ddk/ntimage.h b/reactos/include/ddk/ntimage.h index e008a2daa94..8df984763f7 100644 --- a/reactos/include/ddk/ntimage.h +++ b/reactos/include/ddk/ntimage.h @@ -394,22 +394,33 @@ typedef struct _IMAGE_NT_HEADERS64 { ULONG Signature; IMAGE_FILE_HEADER FileHeader; IMAGE_OPTIONAL_HEADER64 OptionalHeader; -} IMAGE_NT_HEADERS64, *PIMAGE_NT_HEADERS64; +} IMAGE_NT_HEADERS64; typedef struct _IMAGE_NT_HEADERS { ULONG Signature; IMAGE_FILE_HEADER FileHeader; IMAGE_OPTIONAL_HEADER32 OptionalHeader; -} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32; +} IMAGE_NT_HEADERS32; #ifdef _WIN64 typedef IMAGE_NT_HEADERS64 IMAGE_NT_HEADERS; -typedef PIMAGE_NT_HEADERS64 PIMAGE_NT_HEADERS; #else typedef IMAGE_NT_HEADERS32 IMAGE_NT_HEADERS; +#endif + +#ifndef _NTDDK_ + +typedef struct _IMAGE_NT_HEADERS *PIMAGE_NT_HEADERS32; +typedef struct _IMAGE_NT_HEADERS64 *PIMAGE_NT_HEADERS64; + +#ifdef _WIN64 +typedef PIMAGE_NT_HEADERS64 PIMAGE_NT_HEADERS; +#else typedef PIMAGE_NT_HEADERS32 PIMAGE_NT_HEADERS; #endif +#endif /* _NTDDK_ */ + // // Retreives the first image section header from the Nt Header // diff --git a/reactos/include/ddk/wdm.h b/reactos/include/ddk/wdm.h index ee2f034d5e1..285d2165008 100644 --- a/reactos/include/ddk/wdm.h +++ b/reactos/include/ddk/wdm.h @@ -515,6 +515,34 @@ typedef enum _MODE { #define SINGLE_GROUP_LEGACY_API 1 #endif +#define SEMAPHORE_QUERY_STATE (0x0001) +#define SEMAPHORE_MODIFY_STATE (0x0002) +#define SEMAPHORE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3) + +typedef enum _LOGICAL_PROCESSOR_RELATIONSHIP { + RelationProcessorCore, + RelationNumaNode, + RelationCache, + RelationProcessorPackage, + RelationGroup, + RelationAll = 0xffff +} LOGICAL_PROCESSOR_RELATIONSHIP; + +typedef enum _PROCESSOR_CACHE_TYPE { + CacheUnified, + CacheInstruction, + CacheData, + CacheTrace +} PROCESSOR_CACHE_TYPE; + +typedef struct _CACHE_DESCRIPTOR { + UCHAR Level; + UCHAR Associativity; + USHORT LineSize; + ULONG Size; + PROCESSOR_CACHE_TYPE Type; +} CACHE_DESCRIPTOR, *PCACHE_DESCRIPTOR; + /* Processor features */ #define PF_FLOATING_POINT_PRECISION_ERRATA 0 #define PF_FLOATING_POINT_EMULATED 1 @@ -12580,10 +12608,6 @@ typedef enum { #define EVENT_MODIFY_STATE (0x0002) #define EVENT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3) -#define SEMAPHORE_QUERY_STATE (0x0001) -#define SEMAPHORE_MODIFY_STATE (0x0002) -#define SEMAPHORE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3) - #define SYMBOLIC_LINK_QUERY 0x0001 #define SYMBOLIC_LINK_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1) diff --git a/reactos/include/ndk/ketypes.h b/reactos/include/ndk/ketypes.h index d4ae1c545f0..67985379372 100644 --- a/reactos/include/ndk/ketypes.h +++ b/reactos/include/ndk/ketypes.h @@ -546,17 +546,6 @@ typedef enum _KAPC_ENVIRONMENT InsertApcEnvironment } KAPC_ENVIRONMENT; -// -// CPU Cache Types -// -typedef enum _PROCESSOR_CACHE_TYPE -{ - CacheUnified, - CacheInstruction, - CacheData, - CacheTrace, -} PROCESSOR_CACHE_TYPE; - // // PRCB DPC Data // @@ -577,18 +566,6 @@ typedef struct _PP_LOOKASIDE_LIST struct _GENERAL_LOOKASIDE *L; } PP_LOOKASIDE_LIST, *PPP_LOOKASIDE_LIST; -// -// CPU Cache Descriptor -// -typedef struct _CACHE_DESCRIPTOR -{ - UCHAR Level; - UCHAR Associativity; - USHORT LineSize; - ULONG Size; - PROCESSOR_CACHE_TYPE Type; -} CACHE_DESCRIPTOR, *PCACHE_DESCRIPTOR; - // // Architectural Types // From c99e966e79803480c02210b9c43682f096f4e7f6 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Mon, 19 Apr 2010 17:52:56 +0000 Subject: [PATCH 008/131] Patch by Jerome Gardou: add a bunch of tests for NtGdiBitBlt svn path=/trunk/; revision=46946 --- .../apitests/w32knapi/ntgdi/NtGdiBitBlt.c | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/rostests/apitests/w32knapi/ntgdi/NtGdiBitBlt.c b/rostests/apitests/w32knapi/ntgdi/NtGdiBitBlt.c index 14b911457e7..d2821670a74 100644 --- a/rostests/apitests/w32knapi/ntgdi/NtGdiBitBlt.c +++ b/rostests/apitests/w32knapi/ntgdi/NtGdiBitBlt.c @@ -3,6 +3,10 @@ INT Test_NtGdiBitBlt(PTESTINFO pti) { BOOL bRet; + HDC hdc1, hdc2; + HBITMAP hbmp1, hOldBmp1, hbmp2, hOldBmp2; + DWORD bytes1[4] = {0x00ff0000, 0x0000ff00, 0x000000ff, 0x00ffffff}; + DWORD bytes2[4] = {0x00000000, 0x0000000, 0x0000000, 0x00000000}; /* Test NULL dc */ SetLastError(ERROR_SUCCESS); @@ -15,6 +19,71 @@ Test_NtGdiBitBlt(PTESTINFO pti) bRet = NtGdiBitBlt((HDC)0x123456, 0, 0, 10, 10, (HDC)0x123456, 10, 10, SRCCOPY, 0, 0); TEST(bRet == FALSE); TEST(GetLastError() == ERROR_SUCCESS); + + hdc1 = NtGdiCreateCompatibleDC(0); + TEST(hdc1 != NULL); + + hdc2 = NtGdiCreateCompatibleDC(0); + TEST(hdc2 != NULL); + + hbmp1 = NtGdiCreateBitmap(2, 2, 1, 32, (LPBYTE)bytes1 ); + TEST(hbmp1 != NULL); + hOldBmp1 = SelectObject(hdc1, hbmp1); + + hbmp2 = NtGdiCreateBitmap(2, 2, 1, 32, (LPBYTE)bytes2 ); + TEST(hbmp2 != NULL); + hOldBmp2 = SelectObject(hdc2, hbmp2); + + bRet = NtGdiBitBlt(hdc2, 1, 1, -2, -2, hdc1, 0, 0, SRCCOPY, 0, 0); + TEST(bRet == TRUE); + TEST(GetLastError() == ERROR_SUCCESS); + TESTX(NtGdiGetPixel(hdc2, 0, 0) == 0x00000000, "Pixel[0][0] 0x%08x\n", (UINT)NtGdiGetPixel(hdc2, 0, 0)); + TESTX(NtGdiGetPixel(hdc2, 0, 1) == 0x00000000, "Pixel[0][1] 0x%08x\n", (UINT)NtGdiGetPixel(hdc2, 0, 1)); + TESTX(NtGdiGetPixel(hdc2, 1, 0) == 0x00000000, "Pixel[1][0] 0x%08x\n", (UINT)NtGdiGetPixel(hdc2, 1, 0)); + TESTX(NtGdiGetPixel(hdc2, 1, 1) == 0x00000000, "Pixel[1][1] 0x%08x\n", (UINT)NtGdiGetPixel(hdc2, 1, 1)); + + bRet = NtGdiBitBlt(hdc2, 1, 1, -2, -2, hdc1, 1, 1, SRCCOPY, 0, 0); + TEST(bRet == TRUE); + TEST(GetLastError() == ERROR_SUCCESS); + TESTX(NtGdiGetPixel(hdc2, 0, 0) == 0x000000ff, "Pixel[0][0] 0x%08x\n", (UINT)NtGdiGetPixel(hdc2, 0, 0)); + TESTX(NtGdiGetPixel(hdc2, 0, 1) == 0x00000000, "Pixel[0][1] 0x%08x\n", (UINT)NtGdiGetPixel(hdc2, 0, 1)); + TESTX(NtGdiGetPixel(hdc2, 1, 0) == 0x00000000, "Pixel[1][0] 0x%08x\n", (UINT)NtGdiGetPixel(hdc2, 1, 0)); + TESTX(NtGdiGetPixel(hdc2, 1, 1) == 0x00000000, "Pixel[1][1] 0x%08x\n", (UINT)NtGdiGetPixel(hdc2, 1, 1)); + + NtGdiSetPixel(hdc2, 0, 0, 0x00000000); + + bRet = NtGdiBitBlt(hdc2, 1, 1, -2, -2, hdc1, 0, 0, SRCCOPY, 0, 0); + TEST(bRet == TRUE); + TEST(GetLastError() == ERROR_SUCCESS); + TESTX(NtGdiGetPixel(hdc2, 0, 0) == 0x00000000, "Pixel[0][0] 0x%08x\n", (UINT)NtGdiGetPixel(hdc2, 0, 0)); + TESTX(NtGdiGetPixel(hdc2, 0, 1) == 0x00000000, "Pixel[0][1] 0x%08x\n", (UINT)NtGdiGetPixel(hdc2, 0, 1)); + TESTX(NtGdiGetPixel(hdc2, 1, 0) == 0x00000000, "Pixel[1][0] 0x%08x\n", (UINT)NtGdiGetPixel(hdc2, 1, 0)); + TESTX(NtGdiGetPixel(hdc2, 1, 1) == 0x00000000, "Pixel[1][1] 0x%08x\n", (UINT)NtGdiGetPixel(hdc2, 1, 1)); + + bRet = NtGdiBitBlt(hdc2, 1, 1, -2, -2, hdc1, 2, 2, SRCCOPY, 0, 0); + TEST(bRet == TRUE); + TEST(GetLastError() == ERROR_SUCCESS); + TESTX(NtGdiGetPixel(hdc2, 0, 0) == 0x00ffffff, "Pixel[0][0] 0x%08x\n", (UINT)NtGdiGetPixel(hdc2, 0, 0)); + TESTX(NtGdiGetPixel(hdc2, 0, 1) == 0x00000000, "Pixel[0][1] 0x%08x\n", (UINT)NtGdiGetPixel(hdc2, 0, 1)); + TESTX(NtGdiGetPixel(hdc2, 1, 0) == 0x00000000, "Pixel[1][0] 0x%08x\n", (UINT)NtGdiGetPixel(hdc2, 1, 0)); + TESTX(NtGdiGetPixel(hdc2, 1, 1) == 0x00000000, "Pixel[1][1] 0x%08x\n", (UINT)NtGdiGetPixel(hdc2, 1, 1)); + + bRet = NtGdiBitBlt(hdc2, 2, 2, -2, -2, hdc1, 2, 2, SRCCOPY, 0, 0); + TEST(bRet == TRUE); + TEST(GetLastError() == ERROR_SUCCESS); + TESTX(NtGdiGetPixel(hdc2, 0, 0) == 0x000000ff, "Pixel[0][0] 0x%08x\n", (UINT)NtGdiGetPixel(hdc2, 0, 0)); + TESTX(NtGdiGetPixel(hdc2, 0, 1) == 0x00ff0000, "Pixel[0][1] 0x%08x\n", (UINT)NtGdiGetPixel(hdc2, 0, 1)); + TESTX(NtGdiGetPixel(hdc2, 1, 0) == 0x0000ff00, "Pixel[1][0] 0x%08x\n", (UINT)NtGdiGetPixel(hdc2, 1, 0)); + TESTX(NtGdiGetPixel(hdc2, 1, 1) == 0x00ffffff, "Pixel[1][1] 0x%08x\n", (UINT)NtGdiGetPixel(hdc2, 1, 1)); + + SelectObject(hdc2, hOldBmp2); + SelectObject(hdc1, hOldBmp1); + + DeleteObject(hbmp2); + DeleteObject(hbmp1); + + DeleteDC(hdc1); + DeleteDC(hdc2); return APISTATUS_NORMAL; } From d39e608d4de75fd0ccdd5bb87716d0a38c4edd7a Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Mon, 19 Apr 2010 19:43:18 +0000 Subject: [PATCH 009/131] [NTDLL_WINETEST] - Skip broken tests svn path=/trunk/; revision=46947 --- rostests/winetests/ntdll/file.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/rostests/winetests/ntdll/file.c b/rostests/winetests/ntdll/file.c index 3d28d80342d..32c8d184943 100644 --- a/rostests/winetests/ntdll/file.c +++ b/rostests/winetests/ntdll/file.c @@ -1473,7 +1473,8 @@ START_TEST(file) pNtQueryDirectoryFile = (void *)GetProcAddress(hntdll, "NtQueryDirectoryFile"); create_file_test(); - open_file_test(); + ok(0, "broken test: open_file_test\n"); + //open_file_test(); delete_file_test(); read_file_test(); nt_mailslot_test(); @@ -1482,5 +1483,6 @@ START_TEST(file) test_file_all_information(); test_file_both_information(); test_file_name_information(); - test_file_all_name_information(); + ok(0, "broken test: test_file_all_name_information \n"); + //test_file_all_name_information(); } From c31fcaaae7082a1390cef632dd8fddfdd3c6df65 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Mon, 19 Apr 2010 19:45:10 +0000 Subject: [PATCH 010/131] [W32KNAPI] Patch by Jerome Gardou: more tests for NtGdiBitBlt svn path=/trunk/; revision=46948 --- .../apitests/w32knapi/ntgdi/NtGdiBitBlt.c | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/rostests/apitests/w32knapi/ntgdi/NtGdiBitBlt.c b/rostests/apitests/w32knapi/ntgdi/NtGdiBitBlt.c index d2821670a74..81bede314a5 100644 --- a/rostests/apitests/w32knapi/ntgdi/NtGdiBitBlt.c +++ b/rostests/apitests/w32knapi/ntgdi/NtGdiBitBlt.c @@ -30,6 +30,11 @@ Test_NtGdiBitBlt(PTESTINFO pti) TEST(hbmp1 != NULL); hOldBmp1 = SelectObject(hdc1, hbmp1); + TESTX(NtGdiGetPixel(hdc1, 0, 0) == 0x000000ff, "Pixel[0][0] 0x%08x\n", (UINT)NtGdiGetPixel(hdc2, 0, 0)); + TESTX(NtGdiGetPixel(hdc1, 0, 1) == 0x00ff0000, "Pixel[0][1] 0x%08x\n", (UINT)NtGdiGetPixel(hdc2, 0, 1)); + TESTX(NtGdiGetPixel(hdc1, 1, 0) == 0x0000ff00, "Pixel[1][0] 0x%08x\n", (UINT)NtGdiGetPixel(hdc2, 1, 0)); + TESTX(NtGdiGetPixel(hdc1, 1, 1) == 0x00ffffff, "Pixel[1][1] 0x%08x\n", (UINT)NtGdiGetPixel(hdc2, 1, 1)); + hbmp2 = NtGdiCreateBitmap(2, 2, 1, 32, (LPBYTE)bytes2 ); TEST(hbmp2 != NULL); hOldBmp2 = SelectObject(hdc2, hbmp2); @@ -68,6 +73,8 @@ Test_NtGdiBitBlt(PTESTINFO pti) TESTX(NtGdiGetPixel(hdc2, 1, 0) == 0x00000000, "Pixel[1][0] 0x%08x\n", (UINT)NtGdiGetPixel(hdc2, 1, 0)); TESTX(NtGdiGetPixel(hdc2, 1, 1) == 0x00000000, "Pixel[1][1] 0x%08x\n", (UINT)NtGdiGetPixel(hdc2, 1, 1)); + NtGdiSetPixel(hdc2, 0, 0, 0x00000000); + bRet = NtGdiBitBlt(hdc2, 2, 2, -2, -2, hdc1, 2, 2, SRCCOPY, 0, 0); TEST(bRet == TRUE); TEST(GetLastError() == ERROR_SUCCESS); @@ -76,6 +83,19 @@ Test_NtGdiBitBlt(PTESTINFO pti) TESTX(NtGdiGetPixel(hdc2, 1, 0) == 0x0000ff00, "Pixel[1][0] 0x%08x\n", (UINT)NtGdiGetPixel(hdc2, 1, 0)); TESTX(NtGdiGetPixel(hdc2, 1, 1) == 0x00ffffff, "Pixel[1][1] 0x%08x\n", (UINT)NtGdiGetPixel(hdc2, 1, 1)); + NtGdiSetPixel(hdc2, 0, 0, 0x00000000); + NtGdiSetPixel(hdc2, 1, 0, 0x00000000); + NtGdiSetPixel(hdc2, 0, 1, 0x00000000); + NtGdiSetPixel(hdc2, 1, 1, 0x00000000); + + bRet = NtGdiBitBlt(hdc2, 0, 0, 2, 2, hdc1, 0, 0, SRCCOPY, 0, 0); + TEST(bRet == TRUE); + TEST(GetLastError() == ERROR_SUCCESS); + TESTX(NtGdiGetPixel(hdc2, 0, 0) == 0x000000ff, "Pixel[0][0] 0x%08x\n", (UINT)NtGdiGetPixel(hdc2, 0, 0)); + TESTX(NtGdiGetPixel(hdc2, 0, 1) == 0x00ff0000, "Pixel[0][1] 0x%08x\n", (UINT)NtGdiGetPixel(hdc2, 0, 1)); + TESTX(NtGdiGetPixel(hdc2, 1, 0) == 0x0000ff00, "Pixel[1][0] 0x%08x\n", (UINT)NtGdiGetPixel(hdc2, 1, 0)); + TESTX(NtGdiGetPixel(hdc2, 1, 1) == 0x00ffffff, "Pixel[1][1] 0x%08x\n", (UINT)NtGdiGetPixel(hdc2, 1, 1)); + SelectObject(hdc2, hOldBmp2); SelectObject(hdc1, hOldBmp1); From 85c5177ec9742795694bd22151a07e2fc8af70d1 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Mon, 19 Apr 2010 21:40:23 +0000 Subject: [PATCH 011/131] Merge back most changes to ntifs.h from lastt revert svn path=/trunk/; revision=46949 --- reactos/include/ddk/ntifs.h | 4886 ++++++++++++++++++----------------- 1 file changed, 2504 insertions(+), 2382 deletions(-) diff --git a/reactos/include/ddk/ntifs.h b/reactos/include/ddk/ntifs.h index 87d0470888c..8af993ffd15 100644 --- a/reactos/include/ddk/ntifs.h +++ b/reactos/include/ddk/ntifs.h @@ -25,32 +25,10 @@ #define _NTIFS_INCLUDED_ #define _GNU_NTIFS_ -/* Helper macro to enable gcc's extension. */ -#ifndef __GNU_EXTENSION -#ifdef __GNUC__ -#define __GNU_EXTENSION __extension__ -#else -#define __GNU_EXTENSION -#endif -#endif - #ifdef __cplusplus extern "C" { #endif -#if !defined(_NTHALDLL_) && !defined(_BLDR_) -#define NTHALAPI DECLSPEC_IMPORT -#else -#define NTHALAPI -#endif - -/* For ReactOS */ -#if !defined(_NTOSKRNL_) && !defined(_BLDR_) -#define NTKERNELAPI DECLSPEC_IMPORT -#else -#define NTKERNELAPI -#endif - /* Dependencies */ #include #include @@ -76,16 +54,6 @@ extern "C" { #define ClearFlag(_F,_SF) ((_F) &= ~(_SF)) #endif -#define PsGetCurrentProcess IoGetCurrentProcess - -#if (NTDDI_VERSION >= NTDDI_VISTA) -extern NTSYSAPI volatile CCHAR KeNumberProcessors; -#elif (NTDDI_VERSION >= NTDDI_WINXP) -extern NTSYSAPI CCHAR KeNumberProcessors; -#else -extern PCCHAR KeNumberProcessors; -#endif - typedef UNICODE_STRING LSA_UNICODE_STRING, *PLSA_UNICODE_STRING; typedef STRING LSA_STRING, *PLSA_STRING; typedef OBJECT_ATTRIBUTES LSA_OBJECT_ATTRIBUTES, *PLSA_OBJECT_ATTRIBUTES; @@ -751,8 +719,6 @@ typedef enum _OBJECT_INFORMATION_CLASS { MaxObjectInfoClass /* FIXME, not in WDK */ } OBJECT_INFORMATION_CLASS; -#if (NTDDI_VERSION >= NTDDI_NT4) - NTSYSCALLAPI NTSTATUS NTAPI @@ -763,8 +729,6 @@ NtQueryObject( IN ULONG ObjectInformationLength, OUT PULONG ReturnLength OPTIONAL); -#endif - #if (NTDDI_VERSION >= NTDDI_WIN2K) NTSYSCALLAPI @@ -2414,95 +2378,11 @@ extern const PRTL_REALLOCATE_STRING_ROUTINE RtlReallocateStringRoutine; #define RTL_SYSTEM_VOLUME_INFORMATION_FOLDER L"System Volume Information" -#define DEVICE_TYPE ULONG - -#define FILE_DEVICE_BEEP 0x00000001 -#define FILE_DEVICE_CD_ROM 0x00000002 -#define FILE_DEVICE_CD_ROM_FILE_SYSTEM 0x00000003 -#define FILE_DEVICE_CONTROLLER 0x00000004 -#define FILE_DEVICE_DATALINK 0x00000005 -#define FILE_DEVICE_DFS 0x00000006 -#define FILE_DEVICE_DISK 0x00000007 -#define FILE_DEVICE_DISK_FILE_SYSTEM 0x00000008 -#define FILE_DEVICE_FILE_SYSTEM 0x00000009 -#define FILE_DEVICE_INPORT_PORT 0x0000000a -#define FILE_DEVICE_KEYBOARD 0x0000000b -#define FILE_DEVICE_MAILSLOT 0x0000000c -#define FILE_DEVICE_MIDI_IN 0x0000000d -#define FILE_DEVICE_MIDI_OUT 0x0000000e -#define FILE_DEVICE_MOUSE 0x0000000f -#define FILE_DEVICE_MULTI_UNC_PROVIDER 0x00000010 -#define FILE_DEVICE_NAMED_PIPE 0x00000011 -#define FILE_DEVICE_NETWORK 0x00000012 -#define FILE_DEVICE_NETWORK_BROWSER 0x00000013 -#define FILE_DEVICE_NETWORK_FILE_SYSTEM 0x00000014 -#define FILE_DEVICE_NULL 0x00000015 -#define FILE_DEVICE_PARALLEL_PORT 0x00000016 -#define FILE_DEVICE_PHYSICAL_NETCARD 0x00000017 -#define FILE_DEVICE_PRINTER 0x00000018 -#define FILE_DEVICE_SCANNER 0x00000019 -#define FILE_DEVICE_SERIAL_MOUSE_PORT 0x0000001a -#define FILE_DEVICE_SERIAL_PORT 0x0000001b -#define FILE_DEVICE_SCREEN 0x0000001c -#define FILE_DEVICE_SOUND 0x0000001d -#define FILE_DEVICE_STREAMS 0x0000001e -#define FILE_DEVICE_TAPE 0x0000001f -#define FILE_DEVICE_TAPE_FILE_SYSTEM 0x00000020 -#define FILE_DEVICE_TRANSPORT 0x00000021 -#define FILE_DEVICE_UNKNOWN 0x00000022 -#define FILE_DEVICE_VIDEO 0x00000023 -#define FILE_DEVICE_VIRTUAL_DISK 0x00000024 -#define FILE_DEVICE_WAVE_IN 0x00000025 -#define FILE_DEVICE_WAVE_OUT 0x00000026 -#define FILE_DEVICE_8042_PORT 0x00000027 -#define FILE_DEVICE_NETWORK_REDIRECTOR 0x00000028 -#define FILE_DEVICE_BATTERY 0x00000029 -#define FILE_DEVICE_BUS_EXTENDER 0x0000002a -#define FILE_DEVICE_MODEM 0x0000002b -#define FILE_DEVICE_VDM 0x0000002c -#define FILE_DEVICE_MASS_STORAGE 0x0000002d -#define FILE_DEVICE_SMB 0x0000002e -#define FILE_DEVICE_KS 0x0000002f -#define FILE_DEVICE_CHANGER 0x00000030 -#define FILE_DEVICE_SMARTCARD 0x00000031 -#define FILE_DEVICE_ACPI 0x00000032 -#define FILE_DEVICE_DVD 0x00000033 -#define FILE_DEVICE_FULLSCREEN_VIDEO 0x00000034 -#define FILE_DEVICE_DFS_FILE_SYSTEM 0x00000035 -#define FILE_DEVICE_DFS_VOLUME 0x00000036 -#define FILE_DEVICE_SERENUM 0x00000037 -#define FILE_DEVICE_TERMSRV 0x00000038 -#define FILE_DEVICE_KSEC 0x00000039 -#define FILE_DEVICE_FIPS 0x0000003A -#define FILE_DEVICE_INFINIBAND 0x0000003B -#define FILE_DEVICE_VMBUS 0x0000003E -#define FILE_DEVICE_CRYPT_PROVIDER 0x0000003F -#define FILE_DEVICE_WPD 0x00000040 -#define FILE_DEVICE_BLUETOOTH 0x00000041 -#define FILE_DEVICE_MT_COMPOSITE 0x00000042 -#define FILE_DEVICE_MT_TRANSPORT 0x00000043 -#define FILE_DEVICE_BIOMETRIC 0x00000044 -#define FILE_DEVICE_PMI 0x00000045 - -#define CTL_CODE(DeviceType, Function, Method, Access) \ - (((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method)) - -#define DEVICE_TYPE_FROM_CTL_CODE(ctl) (((ULONG) (ctl & 0xffff0000)) >> 16) - #define METHOD_FROM_CTL_CODE(ctrlCode) ((ULONG)(ctrlCode & 3)) -#define METHOD_BUFFERED 0 -#define METHOD_IN_DIRECT 1 -#define METHOD_OUT_DIRECT 2 -#define METHOD_NEITHER 3 #define METHOD_DIRECT_TO_HARDWARE METHOD_IN_DIRECT #define METHOD_DIRECT_FROM_HARDWARE METHOD_OUT_DIRECT -#define FILE_ANY_ACCESS 0x00000000 -#define FILE_SPECIAL_ACCESS FILE_ANY_ACCESS -#define FILE_READ_ACCESS 0x00000001 -#define FILE_WRITE_ACCESS 0x00000002 - typedef ULONG LSA_OPERATIONAL_MODE, *PLSA_OPERATIONAL_MODE; typedef enum _SECURITY_LOGON_TYPE { @@ -4673,6 +4553,8 @@ typedef struct _KAPC_STATE { #define KAPC_STATE_ACTUAL_LENGTH (FIELD_OFFSET(KAPC_STATE, UserApcPending) + sizeof(BOOLEAN)) +#define ASSERT_QUEUE(Q) ASSERT(((Q)->Header.Type & KOBJECT_TYPE_MASK) == QueueObject); + typedef struct _KQUEUE { DISPATCHER_HEADER Header; LIST_ENTRY EntryListHead; @@ -4807,7 +4689,7 @@ FASTCALL KeAcquireQueuedSpinLock( IN OUT KSPIN_LOCK_QUEUE_NUMBER Number); -NTHALAPI +_DECL_HAL_KE_IMPORT VOID FASTCALL KeReleaseQueuedSpinLock( @@ -5022,24 +4904,6 @@ typedef NTSTATUS #if (NTDDI_VERSION >= NTDDI_WIN2K) -NTKERNELAPI -VOID -NTAPI -SeCaptureSubjectContext( - OUT PSECURITY_SUBJECT_CONTEXT SubjectContext); - -NTKERNELAPI -VOID -NTAPI -SeLockSubjectContext( - IN PSECURITY_SUBJECT_CONTEXT SubjectContext); - -NTKERNELAPI -VOID -NTAPI -SeUnlockSubjectContext( - IN PSECURITY_SUBJECT_CONTEXT SubjectContext); - NTKERNELAPI VOID NTAPI @@ -5453,18 +5317,6 @@ SeLocateProcessImageName( extern NTKERNELAPI PSE_EXPORTS SeExports; -#if !defined(_PSGETCURRENTTHREAD_) -#define _PSGETCURRENTTHREAD_ - -FORCEINLINE -PETHREAD -PsGetCurrentThread( - VOID) -{ - return (PETHREAD)KeGetCurrentThread(); -} -#endif - #if (NTDDI_VERSION >= NTDDI_WIN2K) NTKERNELAPI @@ -5534,7 +5386,20 @@ PsReturnPoolQuota( IN POOL_TYPE PoolType, IN ULONG_PTR Amount); -#endif +NTKERNELAPI +NTSTATUS +NTAPI +PsAssignImpersonationToken( + IN PETHREAD Thread, + IN HANDLE Token OPTIONAL); + +NTKERNELAPI +HANDLE +NTAPI +PsReferencePrimaryToken( + IN OUT PEPROCESS Process); + +#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ #if (NTDDI_VERSION >= NTDDI_WINXP) @@ -5823,18 +5688,6 @@ IoPageRead( IN PKEVENT Event, OUT PIO_STATUS_BLOCK IoStatusBlock); -NTKERNELAPI -PDEVICE_OBJECT -NTAPI -IoGetAttachedDevice( - IN PDEVICE_OBJECT DeviceObject); - -NTKERNELAPI -PDEVICE_OBJECT -NTAPI -IoGetAttachedDeviceReference( - IN PDEVICE_OBJECT DeviceObject); - NTKERNELAPI PDEVICE_OBJECT NTAPI @@ -5951,42 +5804,6 @@ NTAPI IoSetTopLevelIrp( IN PIRP Irp OPTIONAL); -NTKERNELAPI -VOID -NTAPI -IoStartNextPacket( - IN PDEVICE_OBJECT DeviceObject, - IN BOOLEAN Cancelable); - -NTKERNELAPI -VOID -NTAPI -IoStartNextPacketByKey( - IN PDEVICE_OBJECT DeviceObject, - IN BOOLEAN Cancelable, - IN ULONG Key); - -NTKERNELAPI -VOID -NTAPI -IoStartPacket( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp, - IN PULONG Key OPTIONAL, - IN PDRIVER_CANCEL CancelFunction OPTIONAL); - -NTKERNELAPI -VOID -NTAPI -IoStartTimer( - IN PDEVICE_OBJECT DeviceObject); - -NTKERNELAPI -VOID -NTAPI -IoStopTimer( - IN PDEVICE_OBJECT DeviceObject); - NTKERNELAPI NTSTATUS NTAPI @@ -6023,12 +5840,6 @@ IoVerifyVolume( IN PDEVICE_OBJECT DeviceObject, IN BOOLEAN AllowRawMount); -NTKERNELAPI -VOID -NTAPI -IoWriteErrorLogEntry( - IN PVOID ElEntry); - NTKERNELAPI NTSTATUS NTAPI @@ -6055,13 +5866,6 @@ IoQueryFileDosDeviceName( IN PFILE_OBJECT FileObject, OUT POBJECT_NAME_INFORMATION *ObjectNameInformation); -VOID -NTAPI -IoSetStartIoAttributes( - IN PDEVICE_OBJECT DeviceObject, - IN BOOLEAN DeferredStartIo, - IN BOOLEAN NonCancelable); - NTKERNELAPI NTSTATUS NTAPI @@ -6160,53 +5964,6 @@ typedef struct _IO_PRIORITY_INFO { #define PO_CB_LID_SWITCH_STATE 4 #define PO_CB_PROCESSOR_POWER_POLICY 5 -#if (NTDDI_VERSION >= NTDDI_WIN2K) - -NTKERNELAPI -PVOID -NTAPI -PoRegisterSystemState( - IN OUT PVOID StateHandle OPTIONAL, - IN EXECUTION_STATE Flags); - -NTKERNELAPI -VOID -NTAPI -PoUnregisterSystemState( - IN OUT PVOID StateHandle); - -NTKERNELAPI -POWER_STATE -NTAPI -PoSetPowerState( - IN PDEVICE_OBJECT DeviceObject, - IN POWER_STATE_TYPE Type, - IN POWER_STATE State); - -NTKERNELAPI -NTSTATUS -NTAPI -PoCallDriver( - IN PDEVICE_OBJECT DeviceObject, - IN OUT PIRP Irp); - -NTKERNELAPI -VOID -NTAPI -PoStartNextPowerIrp( - IN OUT PIRP Irp); - -NTKERNELAPI -PULONG -NTAPI -PoRegisterDeviceForIdleDetection( - IN PDEVICE_OBJECT DeviceObject, - IN ULONG ConservationIdleTime, - IN ULONG PerformanceIdleTime, - IN DEVICE_POWER_STATE State); - -#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ - #if (NTDDI_VERSION >= NTDDI_WINXP) NTKERNELAPI NTSTATUS @@ -6215,84 +5972,6 @@ PoQueueShutdownWorkItem( IN OUT PWORK_QUEUE_ITEM WorkItem); #endif -#if (NTDDI_VERSION >= NTDDI_VISTA) - -NTKERNELAPI -NTSTATUS -NTAPI -PoRegisterPowerSettingCallback( - IN PDEVICE_OBJECT DeviceObject OPTIONAL, - IN LPCGUID SettingGuid, - IN PPOWER_SETTING_CALLBACK Callback, - IN PVOID Context OPTIONAL, - OUT PVOID *Handle); - -NTKERNELAPI -NTSTATUS -PoUnregisterPowerSettingCallback( - IN OUT PVOID Handle); - -#endif - -#if (NTDDI_VERSION >= NTDDI_WIN6SP1) -NTKERNELAPI -VOID -NTAPI -PoSetDeviceBusyEx( - IN OUT PULONG IdlePointer); -#endif - -#if (NTDDI_VERSION >= NTDDI_WIN7) - -NTKERNELAPI -NTSTATUS -NTAPI -PoCreatePowerRequest( - OUT PVOID *PowerRequest, - IN PDEVICE_OBJECT DeviceObject, - IN PCOUNTED_REASON_CONTEXT Context); - -NTKERNELAPI -NTSTATUS -NTAPI -PoSetPowerRequest( - IN OUT PVOID PowerRequest, - IN POWER_REQUEST_TYPE Type); - -NTKERNELAPI -NTSTATUS -NTAPI -PoClearPowerRequest( - IN OUT PVOID PowerRequest, - IN POWER_REQUEST_TYPE Type); - -NTKERNELAPI -VOID -NTAPI -PoDeletePowerRequest( - IN OUT PVOID PowerRequest); - -NTKERNELAPI -VOID -NTAPI -PoStartDeviceBusy( - IN OUT PULONG IdlePointer); - -NTKERNELAPI -VOID -NTAPI -PoEndDeviceBusy( - IN OUT PULONG IdlePointer); - -NTKERNELAPI -BOOLEAN -NTAPI -PoQueryWatchdogTime( - IN PDEVICE_OBJECT Pdo, - OUT PULONG SecondsRemaining); - -#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ - #if defined(_IA64_) #if (NTDDI_VERSION >= NTDDI_WIN2K) //DECLSPEC_DEPRECATED_DDK @@ -6568,6 +6247,188 @@ typedef struct _FILE_LOCK { LONG volatile LockRequestsInProgress; } FILE_LOCK, *PFILE_LOCK; +typedef struct _TUNNEL { + FAST_MUTEX Mutex; + PRTL_SPLAY_LINKS Cache; + LIST_ENTRY TimerQueue; + USHORT NumEntries; +} TUNNEL, *PTUNNEL; + +typedef enum _FSRTL_COMPARISON_RESULT { + LessThan = -1, + EqualTo = 0, + GreaterThan = 1 +} FSRTL_COMPARISON_RESULT; + +#define FSRTL_FAT_LEGAL 0x01 +#define FSRTL_HPFS_LEGAL 0x02 +#define FSRTL_NTFS_LEGAL 0x04 +#define FSRTL_WILD_CHARACTER 0x08 +#define FSRTL_OLE_LEGAL 0x10 +#define FSRTL_NTFS_STREAM_LEGAL (FSRTL_NTFS_LEGAL | FSRTL_OLE_LEGAL) + +typedef struct _BASE_MCB { + ULONG MaximumPairCount; + ULONG PairCount; + USHORT PoolType; + USHORT Flags; + PVOID Mapping; +} BASE_MCB, *PBASE_MCB; + +typedef struct _LARGE_MCB { + PKGUARDED_MUTEX GuardedMutex; + BASE_MCB BaseMcb; +} LARGE_MCB, *PLARGE_MCB; + +#define MCB_FLAG_RAISE_ON_ALLOCATION_FAILURE 1 + +typedef struct _MCB { + LARGE_MCB DummyFieldThatSizesThisStructureCorrectly; +} MCB, *PMCB; + +typedef PVOID OPLOCK, *POPLOCK; + +typedef VOID +(NTAPI *POPLOCK_WAIT_COMPLETE_ROUTINE) ( + IN PVOID Context, + IN PIRP Irp); + +typedef VOID +(NTAPI *POPLOCK_FS_PREPOST_IRP) ( + IN PVOID Context, + IN PIRP Irp); + +#if (NTDDI_VERSION >= NTDDI_VISTASP1) +#define OPLOCK_FLAG_COMPLETE_IF_OPLOCKED 0x00000001 +#endif + +#if (NTDDI_VERSION >= NTDDI_WIN7) +#define OPLOCK_FLAG_OPLOCK_KEY_CHECK_ONLY 0x00000002 +#define OPLOCK_FLAG_BACK_OUT_ATOMIC_OPLOCK 0x00000004 +#define OPLOCK_FLAG_IGNORE_OPLOCK_KEYS 0x00000008 +#define OPLOCK_FSCTRL_FLAG_ALL_KEYS_MATCH 0x00000001 +#endif + +#if (NTDDI_VERSION >= NTDDI_WIN7) + +typedef struct _OPLOCK_KEY_ECP_CONTEXT { + GUID OplockKey; + ULONG Reserved; +} OPLOCK_KEY_ECP_CONTEXT, *POPLOCK_KEY_ECP_CONTEXT; + +DEFINE_GUID( GUID_ECP_OPLOCK_KEY, 0x48850596, 0x3050, 0x4be7, 0x98, 0x63, 0xfe, 0xc3, 0x50, 0xce, 0x8d, 0x7f ); + +#endif + +#define FSRTL_VOLUME_DISMOUNT 1 +#define FSRTL_VOLUME_DISMOUNT_FAILED 2 +#define FSRTL_VOLUME_LOCK 3 +#define FSRTL_VOLUME_LOCK_FAILED 4 +#define FSRTL_VOLUME_UNLOCK 5 +#define FSRTL_VOLUME_MOUNT 6 +#define FSRTL_VOLUME_NEEDS_CHKDSK 7 +#define FSRTL_VOLUME_WORM_NEAR_FULL 8 +#define FSRTL_VOLUME_WEARING_OUT 9 +#define FSRTL_VOLUME_FORCED_CLOSED 10 +#define FSRTL_VOLUME_INFO_MAKE_COMPAT 11 +#define FSRTL_VOLUME_PREPARING_EJECT 12 +#define FSRTL_VOLUME_CHANGE_SIZE 13 +#define FSRTL_VOLUME_BACKGROUND_FORMAT 14 + +typedef PVOID PNOTIFY_SYNC; + +typedef BOOLEAN +(NTAPI *PCHECK_FOR_TRAVERSE_ACCESS) ( + IN PVOID NotifyContext, + IN PVOID TargetContext OPTIONAL, + IN PSECURITY_SUBJECT_CONTEXT SubjectContext); + +typedef BOOLEAN +(NTAPI *PFILTER_REPORT_CHANGE) ( + IN PVOID NotifyContext, + IN PVOID FilterContext); + +typedef VOID +(NTAPI *PFSRTL_STACK_OVERFLOW_ROUTINE) ( + IN PVOID Context, + IN PKEVENT Event); + +#if (NTDDI_VERSION >= NTDDI_VISTA) + +#define FSRTL_UNC_PROVIDER_FLAGS_MAILSLOTS_SUPPORTED 0x00000001 +#define FSRTL_UNC_PROVIDER_FLAGS_CSC_ENABLED 0x00000002 +#define FSRTL_UNC_PROVIDER_FLAGS_DOMAIN_SVC_AWARE 0x00000004 + +#define FSRTL_ALLOCATE_ECPLIST_FLAG_CHARGE_QUOTA 0x00000001 + +#define FSRTL_ALLOCATE_ECP_FLAG_CHARGE_QUOTA 0x00000001 +#define FSRTL_ALLOCATE_ECP_FLAG_NONPAGED_POOL 0x00000002 + +#define FSRTL_ECP_LOOKASIDE_FLAG_NONPAGED_POOL 0x00000002 + +#define FSRTL_VIRTDISK_FULLY_ALLOCATED 0x00000001 +#define FSRTL_VIRTDISK_NO_DRIVE_LETTER 0x00000002 + +typedef struct _FSRTL_MUP_PROVIDER_INFO_LEVEL_1 { + ULONG32 ProviderId; +} FSRTL_MUP_PROVIDER_INFO_LEVEL_1, *PFSRTL_MUP_PROVIDER_INFO_LEVEL_1; + +typedef struct _FSRTL_MUP_PROVIDER_INFO_LEVEL_2 { + ULONG32 ProviderId; + UNICODE_STRING ProviderName; +} FSRTL_MUP_PROVIDER_INFO_LEVEL_2, *PFSRTL_MUP_PROVIDER_INFO_LEVEL_2; + +typedef VOID +(*PFSRTL_EXTRA_CREATE_PARAMETER_CLEANUP_CALLBACK) ( + IN OUT PVOID EcpContext, + IN LPCGUID EcpType); + +typedef struct _ECP_LIST ECP_LIST, *PECP_LIST; + +typedef ULONG FSRTL_ALLOCATE_ECPLIST_FLAGS; +typedef ULONG FSRTL_ALLOCATE_ECP_FLAGS; +typedef ULONG FSRTL_ECP_LOOKASIDE_FLAGS; + +typedef enum _FSRTL_CHANGE_BACKING_TYPE { + ChangeDataControlArea, + ChangeImageControlArea, + ChangeSharedCacheMap +} FSRTL_CHANGE_BACKING_TYPE, *PFSRTL_CHANGE_BACKING_TYPE; + +#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ + +typedef struct _FSRTL_PER_FILE_CONTEXT { + LIST_ENTRY Links; + PVOID OwnerId; + PVOID InstanceId; + PFREE_FUNCTION FreeCallback; +} FSRTL_PER_FILE_CONTEXT, *PFSRTL_PER_FILE_CONTEXT; + +typedef struct _FSRTL_PER_STREAM_CONTEXT { + LIST_ENTRY Links; + PVOID OwnerId; + PVOID InstanceId; + PFREE_FUNCTION FreeCallback; +} FSRTL_PER_STREAM_CONTEXT, *PFSRTL_PER_STREAM_CONTEXT; + +#if (NTDDI_VERSION >= NTDDI_WIN2K) +typedef VOID +(*PFN_FSRTLTEARDOWNPERSTREAMCONTEXTS) ( + IN PFSRTL_ADVANCED_FCB_HEADER AdvancedHeader); +#endif + +typedef struct _FSRTL_PER_FILEOBJECT_CONTEXT { + LIST_ENTRY Links; + PVOID OwnerId; + PVOID InstanceId; +} FSRTL_PER_FILEOBJECT_CONTEXT, *PFSRTL_PER_FILEOBJECT_CONTEXT; + +#define FsRtlEnterFileSystem KeEnterCriticalRegion +#define FsRtlExitFileSystem KeLeaveCriticalRegion + +#define FSRTL_CC_FLUSH_ERROR_FLAG_NO_HARD_ERROR 0x1 +#define FSRTL_CC_FLUSH_ERROR_FLAG_NO_LOG_ENTRY 0x2 + #if (NTDDI_VERSION >= NTDDI_WIN2K) NTKERNELAPI @@ -6845,15 +6706,2320 @@ FsRtlPrivateLock( IN PVOID Context, IN BOOLEAN AlreadySynchronized); +NTKERNELAPI +VOID +NTAPI +FsRtlInitializeTunnelCache( + IN PTUNNEL Cache); + +NTKERNELAPI +VOID +NTAPI +FsRtlAddToTunnelCache( + IN PTUNNEL Cache, + IN ULONGLONG DirectoryKey, + IN PUNICODE_STRING ShortName, + IN PUNICODE_STRING LongName, + IN BOOLEAN KeyByShortName, + IN ULONG DataLength, + IN PVOID Data); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlFindInTunnelCache( + IN PTUNNEL Cache, + IN ULONGLONG DirectoryKey, + IN PUNICODE_STRING Name, + OUT PUNICODE_STRING ShortName, + OUT PUNICODE_STRING LongName, + IN OUT PULONG DataLength, + OUT PVOID Data); + +NTKERNELAPI +VOID +NTAPI +FsRtlDeleteKeyFromTunnelCache( + IN PTUNNEL Cache, + IN ULONGLONG DirectoryKey); + +NTKERNELAPI +VOID +NTAPI +FsRtlDeleteTunnelCache( + IN PTUNNEL Cache); + +NTKERNELAPI +#define IO_ATTACH_DEVICE 0x0400 +struct _RTL_AVL_TABLE; +struct _RTL_GENERIC_TABLE; + +typedef struct _FILE_FS_FULL_SIZE_INFORMATION { + LARGE_INTEGER TotalAllocationUnits; + LARGE_INTEGER CallerAvailableAllocationUnits; + LARGE_INTEGER ActualAvailableAllocationUnits; + ULONG SectorsPerAllocationUnit; + ULONG BytesPerSector; +} FILE_FS_FULL_SIZE_INFORMATION, *PFILE_FS_FULL_SIZE_INFORMATION; + +typedef struct _FILE_FS_LABEL_INFORMATION { + ULONG VolumeLabelLength; + WCHAR VolumeLabel[1]; +} FILE_FS_LABEL_INFORMATION, *PFILE_FS_LABEL_INFORMATION; + +typedef struct _FILE_FS_SIZE_INFORMATION { + LARGE_INTEGER TotalAllocationUnits; + LARGE_INTEGER AvailableAllocationUnits; + ULONG SectorsPerAllocationUnit; + ULONG BytesPerSector; +} FILE_FS_SIZE_INFORMATION, *PFILE_FS_SIZE_INFORMATION; + +typedef struct _FILE_FS_VOLUME_INFORMATION { + LARGE_INTEGER VolumeCreationTime; + ULONG VolumeSerialNumber; + ULONG VolumeLabelLength; + BOOLEAN SupportsObjects; + WCHAR VolumeLabel[1]; +} FILE_FS_VOLUME_INFORMATION, *PFILE_FS_VOLUME_INFORMATION; + +typedef struct _FILE_FS_OBJECTID_INFORMATION +{ + UCHAR ObjectId[16]; + UCHAR ExtendedInfo[48]; +} FILE_FS_OBJECTID_INFORMATION, *PFILE_FS_OBJECTID_INFORMATION; + +typedef enum _RTL_GENERIC_COMPARE_RESULTS +{ + GenericLessThan, + GenericGreaterThan, + GenericEqual +} RTL_GENERIC_COMPARE_RESULTS; + +typedef enum _TABLE_SEARCH_RESULT +{ + TableEmptyTree, + TableFoundNode, + TableInsertAsLeft, + TableInsertAsRight +} TABLE_SEARCH_RESULT; + +typedef RTL_GENERIC_COMPARE_RESULTS +(NTAPI *PRTL_AVL_COMPARE_ROUTINE) ( + struct _RTL_AVL_TABLE *Table, + PVOID FirstStruct, + PVOID SecondStruct +); + +typedef RTL_GENERIC_COMPARE_RESULTS +(NTAPI *PRTL_GENERIC_COMPARE_ROUTINE) ( + struct _RTL_GENERIC_TABLE *Table, + PVOID FirstStruct, + PVOID SecondStruct +); + +typedef PVOID +(NTAPI *PRTL_GENERIC_ALLOCATE_ROUTINE) ( + struct _RTL_GENERIC_TABLE *Table, + CLONG ByteSize +); + +typedef VOID +(NTAPI *PRTL_GENERIC_FREE_ROUTINE) ( + struct _RTL_GENERIC_TABLE *Table, + PVOID Buffer +); + +typedef PVOID +(NTAPI *PRTL_AVL_ALLOCATE_ROUTINE) ( + struct _RTL_AVL_TABLE *Table, + CLONG ByteSize +); + +typedef VOID +(NTAPI *PRTL_AVL_FREE_ROUTINE) ( + struct _RTL_AVL_TABLE *Table, + PVOID Buffer +); + +typedef struct _RTL_BALANCED_LINKS +{ + struct _RTL_BALANCED_LINKS *Parent; + struct _RTL_BALANCED_LINKS *LeftChild; + struct _RTL_BALANCED_LINKS *RightChild; + CHAR Balance; + UCHAR Reserved[3]; +} RTL_BALANCED_LINKS, *PRTL_BALANCED_LINKS; + +typedef struct _RTL_GENERIC_TABLE +{ + PRTL_SPLAY_LINKS TableRoot; + LIST_ENTRY InsertOrderList; + PLIST_ENTRY OrderedPointer; + ULONG WhichOrderedElement; + ULONG NumberGenericTableElements; + PRTL_GENERIC_COMPARE_ROUTINE CompareRoutine; + PRTL_GENERIC_ALLOCATE_ROUTINE AllocateRoutine; + PRTL_GENERIC_FREE_ROUTINE FreeRoutine; + PVOID TableContext; +} RTL_GENERIC_TABLE, *PRTL_GENERIC_TABLE; + +typedef struct _RTL_AVL_TABLE +{ + RTL_BALANCED_LINKS BalancedRoot; + PVOID OrderedPointer; + ULONG WhichOrderedElement; + ULONG NumberGenericTableElements; + ULONG DepthOfTree; + PRTL_BALANCED_LINKS RestartKey; + ULONG DeleteCount; + PRTL_AVL_COMPARE_ROUTINE CompareRoutine; + PRTL_AVL_ALLOCATE_ROUTINE AllocateRoutine; + PRTL_AVL_FREE_ROUTINE FreeRoutine; + PVOID TableContext; +} RTL_AVL_TABLE, *PRTL_AVL_TABLE; + +NTSYSAPI +VOID +NTAPI +RtlInitializeGenericTableAvl( + PRTL_AVL_TABLE Table, + PRTL_AVL_COMPARE_ROUTINE CompareRoutine, + PRTL_AVL_ALLOCATE_ROUTINE AllocateRoutine, + PRTL_AVL_FREE_ROUTINE FreeRoutine, + PVOID TableContext +); + +VOID +NTAPI +FsRtlDissectDbcs( + IN ANSI_STRING Name, + OUT PANSI_STRING FirstPart, + OUT PANSI_STRING RemainingPart); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlDoesDbcsContainWildCards( + IN PANSI_STRING Name); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlIsDbcsInExpression( + IN PANSI_STRING Expression, + IN PANSI_STRING Name); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlIsFatDbcsLegal( + IN ANSI_STRING DbcsName, + IN BOOLEAN WildCardsPermissible, + IN BOOLEAN PathNamePermissible, + IN BOOLEAN LeadingBackslashPermissible); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlIsHpfsDbcsLegal( + IN ANSI_STRING DbcsName, + IN BOOLEAN WildCardsPermissible, + IN BOOLEAN PathNamePermissible, + IN BOOLEAN LeadingBackslashPermissible); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlNormalizeNtstatus( + IN NTSTATUS Exception, + IN NTSTATUS GenericException); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlIsNtstatusExpected( + IN NTSTATUS Ntstatus); + +NTKERNELAPI +PERESOURCE +NTAPI +FsRtlAllocateResource( + VOID); + +NTKERNELAPI +VOID +NTAPI +FsRtlInitializeLargeMcb( + IN PLARGE_MCB Mcb, + IN POOL_TYPE PoolType); + +NTKERNELAPI +VOID +NTAPI +FsRtlUninitializeLargeMcb( + IN PLARGE_MCB Mcb); + +NTKERNELAPI +VOID +NTAPI +FsRtlResetLargeMcb( + IN PLARGE_MCB Mcb, + IN BOOLEAN SelfSynchronized); + +NTKERNELAPI +VOID +NTAPI +FsRtlTruncateLargeMcb( + IN PLARGE_MCB Mcb, + IN LONGLONG Vbn); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlAddLargeMcbEntry( + IN PLARGE_MCB Mcb, + IN LONGLONG Vbn, + IN LONGLONG Lbn, + IN LONGLONG SectorCount); + +NTKERNELAPI +VOID +NTAPI +FsRtlRemoveLargeMcbEntry( + IN PLARGE_MCB Mcb, + IN LONGLONG Vbn, + IN LONGLONG SectorCount); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlLookupLargeMcbEntry( + IN PLARGE_MCB Mcb, + IN LONGLONG Vbn, + OUT PLONGLONG Lbn OPTIONAL, + OUT PLONGLONG SectorCountFromLbn OPTIONAL, + OUT PLONGLONG StartingLbn OPTIONAL, + OUT PLONGLONG SectorCountFromStartingLbn OPTIONAL, + OUT PULONG Index OPTIONAL); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlLookupLastLargeMcbEntry( + IN PLARGE_MCB Mcb, + OUT PLONGLONG Vbn, + OUT PLONGLONG Lbn); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlLookupLastLargeMcbEntryAndIndex( + IN PLARGE_MCB OpaqueMcb, + OUT PLONGLONG LargeVbn, + OUT PLONGLONG LargeLbn, + OUT PULONG Index); + +NTKERNELAPI +ULONG +NTAPI +FsRtlNumberOfRunsInLargeMcb( + IN PLARGE_MCB Mcb); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlGetNextLargeMcbEntry( + IN PLARGE_MCB Mcb, + IN ULONG RunIndex, + OUT PLONGLONG Vbn, + OUT PLONGLONG Lbn, + OUT PLONGLONG SectorCount); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlSplitLargeMcb( + IN PLARGE_MCB Mcb, + IN LONGLONG Vbn, + IN LONGLONG Amount); + +NTKERNELAPI +VOID +NTAPI +FsRtlInitializeMcb( + IN PMCB Mcb, + IN POOL_TYPE PoolType); + +NTKERNELAPI +VOID +NTAPI +FsRtlUninitializeMcb( + IN PMCB Mcb); + +NTKERNELAPI +VOID +NTAPI +FsRtlTruncateMcb( + IN PMCB Mcb, + IN VBN Vbn); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlAddMcbEntry( + IN PMCB Mcb, + IN VBN Vbn, + IN LBN Lbn, + IN ULONG SectorCount); + +NTKERNELAPI +VOID +NTAPI +FsRtlRemoveMcbEntry( + IN PMCB Mcb, + IN VBN Vbn, + IN ULONG SectorCount); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlLookupMcbEntry( + IN PMCB Mcb, + IN VBN Vbn, + OUT PLBN Lbn, + OUT PULONG SectorCount OPTIONAL, + OUT PULONG Index); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlLookupLastMcbEntry( + IN PMCB Mcb, + OUT PVBN Vbn, + OUT PLBN Lbn); + +NTKERNELAPI +ULONG +NTAPI +FsRtlNumberOfRunsInMcb( + IN PMCB Mcb); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlGetNextMcbEntry( + IN PMCB Mcb, + IN ULONG RunIndex, + OUT PVBN Vbn, + OUT PLBN Lbn, + OUT PULONG SectorCount); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlBalanceReads( + IN PDEVICE_OBJECT TargetDevice); + +NTKERNELAPI +VOID +NTAPI +FsRtlInitializeOplock( + IN OUT POPLOCK Oplock); + +NTKERNELAPI +VOID +NTAPI +FsRtlUninitializeOplock( + IN OUT POPLOCK Oplock); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlOplockFsctrl( + IN POPLOCK Oplock, + IN PIRP Irp, + IN ULONG OpenCount); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlCheckOplock( + IN POPLOCK Oplock, + IN PIRP Irp, + IN PVOID Context, + IN POPLOCK_WAIT_COMPLETE_ROUTINE CompletionRoutine OPTIONAL, + IN POPLOCK_FS_PREPOST_IRP PostIrpRoutine OPTIONAL); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlOplockIsFastIoPossible( + IN POPLOCK Oplock); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlCurrentBatchOplock( + IN POPLOCK Oplock); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlNotifyVolumeEvent( + IN PFILE_OBJECT FileObject, + IN ULONG EventCode); + +NTKERNELAPI +VOID +NTAPI +FsRtlNotifyInitializeSync( + IN PNOTIFY_SYNC *NotifySync); + +NTKERNELAPI +VOID +NTAPI +FsRtlNotifyUninitializeSync( + IN PNOTIFY_SYNC *NotifySync); + +NTKERNELAPI +VOID +NTAPI +FsRtlNotifyFullChangeDirectory( + IN PNOTIFY_SYNC NotifySync, + IN PLIST_ENTRY NotifyList, + IN PVOID FsContext, + IN PSTRING FullDirectoryName, + IN BOOLEAN WatchTree, + IN BOOLEAN IgnoreBuffer, + IN ULONG CompletionFilter, + IN PIRP NotifyIrp OPTIONAL, + IN PCHECK_FOR_TRAVERSE_ACCESS TraverseCallback OPTIONAL, + IN PSECURITY_SUBJECT_CONTEXT SubjectContext OPTIONAL); + +NTKERNELAPI +VOID +NTAPI +FsRtlNotifyFilterReportChange( + IN PNOTIFY_SYNC NotifySync, + IN PLIST_ENTRY NotifyList, + IN PSTRING FullTargetName, + IN USHORT TargetNameOffset, + IN PSTRING StreamName OPTIONAL, + IN PSTRING NormalizedParentName OPTIONAL, + IN ULONG FilterMatch, + IN ULONG Action, + IN PVOID TargetContext OPTIONAL, + IN PVOID FilterContext OPTIONAL); + +NTKERNELAPI +VOID +NTAPI +FsRtlNotifyFullReportChange( + IN PNOTIFY_SYNC NotifySync, + IN PLIST_ENTRY NotifyList, + IN PSTRING FullTargetName, + IN USHORT TargetNameOffset, + IN PSTRING StreamName OPTIONAL, + IN PSTRING NormalizedParentName OPTIONAL, + IN ULONG FilterMatch, + IN ULONG Action, + IN PVOID TargetContext OPTIONAL); + +NTKERNELAPI +VOID +NTAPI +FsRtlNotifyCleanup( + IN PNOTIFY_SYNC NotifySync, + IN PLIST_ENTRY NotifyList, + IN PVOID FsContext); + +NTKERNELAPI +VOID +NTAPI +FsRtlDissectName( + IN UNICODE_STRING Name, + OUT PUNICODE_STRING FirstPart, + OUT PUNICODE_STRING RemainingPart); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlDoesNameContainWildCards( + IN PUNICODE_STRING Name); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlAreNamesEqual( + IN PCUNICODE_STRING Name1, + IN PCUNICODE_STRING Name2, + IN BOOLEAN IgnoreCase, + IN PCWCH UpcaseTable OPTIONAL); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlIsNameInExpression( + IN PUNICODE_STRING Expression, + IN PUNICODE_STRING Name, + IN BOOLEAN IgnoreCase, + IN PWCHAR UpcaseTable OPTIONAL); + +NTKERNELAPI +VOID +NTAPI +FsRtlPostPagingFileStackOverflow( + IN PVOID Context, + IN PKEVENT Event, + IN PFSRTL_STACK_OVERFLOW_ROUTINE StackOverflowRoutine); + +NTKERNELAPI +VOID +NTAPI +FsRtlPostStackOverflow ( + IN PVOID Context, + IN PKEVENT Event, + IN PFSRTL_STACK_OVERFLOW_ROUTINE StackOverflowRoutine); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlRegisterUncProvider( + OUT PHANDLE MupHandle, + IN PUNICODE_STRING RedirectorDeviceName, + IN BOOLEAN MailslotsSupported); + +NTKERNELAPI +VOID +NTAPI +FsRtlDeregisterUncProvider( + IN HANDLE Handle); + +NTKERNELAPI +VOID +NTAPI +FsRtlTeardownPerStreamContexts( + IN PFSRTL_ADVANCED_FCB_HEADER AdvancedHeader); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlCreateSectionForDataScan( + OUT PHANDLE SectionHandle, + OUT PVOID *SectionObject, + OUT PLARGE_INTEGER SectionFileSize OPTIONAL, + IN PFILE_OBJECT FileObject, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, + IN PLARGE_INTEGER MaximumSize OPTIONAL, + IN ULONG SectionPageProtection, + IN ULONG AllocationAttributes, + IN ULONG Flags); + #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ +#if (NTDDI_VERSION >= NTDDI_WINXP) + +NTKERNELAPI +VOID +NTAPI +FsRtlNotifyFilterChangeDirectory( + IN PNOTIFY_SYNC NotifySync, + IN PLIST_ENTRY NotifyList, + IN PVOID FsContext, + IN PSTRING FullDirectoryName, + IN BOOLEAN WatchTree, + IN BOOLEAN IgnoreBuffer, + IN ULONG CompletionFilter, + IN PIRP NotifyIrp OPTIONAL, + IN PCHECK_FOR_TRAVERSE_ACCESS TraverseCallback OPTIONAL, + IN PSECURITY_SUBJECT_CONTEXT SubjectContext OPTIONAL, + IN PFILTER_REPORT_CHANGE FilterCallback OPTIONAL); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlInsertPerStreamContext( + IN PFSRTL_ADVANCED_FCB_HEADER PerStreamContext, + IN PFSRTL_PER_STREAM_CONTEXT Ptr); + +NTKERNELAPI +PFSRTL_PER_STREAM_CONTEXT +NTAPI +FsRtlLookupPerStreamContextInternal( + IN PFSRTL_ADVANCED_FCB_HEADER StreamContext, + IN PVOID OwnerId OPTIONAL, + IN PVOID InstanceId OPTIONAL); + +NTKERNELAPI +PFSRTL_PER_STREAM_CONTEXT +NTAPI +FsRtlRemovePerStreamContext( + IN PFSRTL_ADVANCED_FCB_HEADER StreamContext, + IN PVOID OwnerId OPTIONAL, + IN PVOID InstanceId OPTIONAL); + +NTKERNELAPI +VOID +NTAPI +FsRtlIncrementCcFastReadNotPossible( + VOID); + +NTKERNELAPI +VOID +NTAPI +FsRtlIncrementCcFastReadWait( + VOID); + +NTKERNELAPI +VOID +NTAPI +FsRtlIncrementCcFastReadNoWait( + VOID); + +NTKERNELAPI +VOID +NTAPI +FsRtlIncrementCcFastReadResourceMiss( + VOID); + +NTKERNELAPI +LOGICAL +NTAPI +FsRtlIsPagingFile( + IN PFILE_OBJECT FileObject); + +#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ + +#if (NTDDI_VERSION >= NTDDI_WS03) + +NTKERNELAPI + VOID +NTAPI +FsRtlInitializeBaseMcb( + IN PBASE_MCB Mcb, + IN POOL_TYPE PoolType); + +NTKERNELAPI +VOID +NTAPI +FsRtlUninitializeBaseMcb( + IN PBASE_MCB Mcb); + +NTKERNELAPI +VOID +NTAPI +FsRtlResetBaseMcb( + IN PBASE_MCB Mcb); + +NTKERNELAPI +VOID +NTAPI +FsRtlTruncateBaseMcb( + IN PBASE_MCB Mcb, + IN LONGLONG Vbn); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlAddBaseMcbEntry( + IN PBASE_MCB Mcb, + IN LONGLONG Vbn, + IN LONGLONG Lbn, + IN LONGLONG SectorCount); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlRemoveBaseMcbEntry( + IN PBASE_MCB Mcb, + IN LONGLONG Vbn, + IN LONGLONG SectorCount); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlLookupBaseMcbEntry( + IN PBASE_MCB Mcb, + IN LONGLONG Vbn, + OUT PLONGLONG Lbn OPTIONAL, + OUT PLONGLONG SectorCountFromLbn OPTIONAL, + OUT PLONGLONG StartingLbn OPTIONAL, + OUT PLONGLONG SectorCountFromStartingLbn OPTIONAL, + OUT PULONG Index OPTIONAL); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlLookupLastBaseMcbEntry( + IN PBASE_MCB Mcb, + OUT PLONGLONG Vbn, + OUT PLONGLONG Lbn); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlLookupLastBaseMcbEntryAndIndex( + IN PBASE_MCB OpaqueMcb, + IN OUT PLONGLONG LargeVbn, + IN OUT PLONGLONG LargeLbn, + IN OUT PULONG Index); + +NTKERNELAPI +ULONG +NTAPI +FsRtlNumberOfRunsInBaseMcb( + IN PBASE_MCB Mcb); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlGetNextBaseMcbEntry( + IN PBASE_MCB Mcb, + IN ULONG RunIndex, + OUT PLONGLONG Vbn, + OUT PLONGLONG Lbn, + OUT PLONGLONG SectorCount); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlSplitBaseMcb( + IN PBASE_MCB Mcb, + IN LONGLONG Vbn, + IN LONGLONG Amount); + +#endif /* (NTDDI_VERSION >= NTDDI_WS03) */ + +#if (NTDDI_VERSION >= NTDDI_VISTA) + +BOOLEAN +NTAPI +FsRtlInitializeBaseMcbEx( + IN PBASE_MCB Mcb, + IN POOL_TYPE PoolType, + IN USHORT Flags); + +NTSTATUS +NTAPI +FsRtlAddBaseMcbEntryEx( + IN PBASE_MCB Mcb, + IN LONGLONG Vbn, + IN LONGLONG Lbn, + IN LONGLONG SectorCount); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlCurrentOplock( + IN POPLOCK Oplock); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlOplockBreakToNone( + IN OUT POPLOCK Oplock, + IN PIO_STACK_LOCATION IrpSp OPTIONAL, + IN PIRP Irp, + IN PVOID Context OPTIONAL, + IN POPLOCK_WAIT_COMPLETE_ROUTINE CompletionRoutine OPTIONAL, + IN POPLOCK_FS_PREPOST_IRP PostIrpRoutine OPTIONAL); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlNotifyVolumeEventEx( + IN PFILE_OBJECT FileObject, + IN ULONG EventCode, + IN PTARGET_DEVICE_CUSTOM_NOTIFICATION Event); + +NTKERNELAPI +VOID +NTAPI +FsRtlNotifyCleanupAll( + IN PNOTIFY_SYNC NotifySync, + IN PLIST_ENTRY NotifyList); + +NTSTATUS +NTAPI +FsRtlRegisterUncProviderEx( + OUT PHANDLE MupHandle, + IN PUNICODE_STRING RedirDevName, + IN PDEVICE_OBJECT DeviceObject, + IN ULONG Flags); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlCancellableWaitForSingleObject( + IN PVOID Object, + IN PLARGE_INTEGER Timeout OPTIONAL, + IN PIRP Irp OPTIONAL); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlCancellableWaitForMultipleObjects( + IN ULONG Count, + IN PVOID ObjectArray[], + IN WAIT_TYPE WaitType, + IN PLARGE_INTEGER Timeout OPTIONAL, + IN PKWAIT_BLOCK WaitBlockArray OPTIONAL, + IN PIRP Irp OPTIONAL); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlMupGetProviderInfoFromFileObject( + IN PFILE_OBJECT pFileObject, + IN ULONG Level, + OUT PVOID pBuffer, + IN OUT PULONG pBufferSize); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlMupGetProviderIdFromName( + IN PUNICODE_STRING pProviderName, + OUT PULONG32 pProviderId); + +NTKERNELAPI +VOID +NTAPI +FsRtlIncrementCcFastMdlReadWait( + VOID); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlValidateReparsePointBuffer( + IN ULONG BufferLength, + IN PREPARSE_DATA_BUFFER ReparseBuffer); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlRemoveDotsFromPath( + IN OUT PWSTR OriginalString, + IN USHORT PathLength, + OUT USHORT *NewLength); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlAllocateExtraCreateParameterList( + IN FSRTL_ALLOCATE_ECPLIST_FLAGS Flags, + OUT PECP_LIST *EcpList); + +NTKERNELAPI +VOID +NTAPI +FsRtlFreeExtraCreateParameterList( + IN PECP_LIST EcpList); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlAllocateExtraCreateParameter( + IN LPCGUID EcpType, + IN ULONG SizeOfContext, + IN FSRTL_ALLOCATE_ECP_FLAGS Flags, + IN PFSRTL_EXTRA_CREATE_PARAMETER_CLEANUP_CALLBACK CleanupCallback OPTIONAL, + IN ULONG PoolTag, + OUT PVOID *EcpContext); + +NTKERNELAPI +VOID +NTAPI +FsRtlFreeExtraCreateParameter( + IN PVOID EcpContext); + +NTKERNELAPI +VOID +NTAPI +FsRtlInitExtraCreateParameterLookasideList( + IN OUT PVOID Lookaside, + IN FSRTL_ECP_LOOKASIDE_FLAGS Flags, + IN SIZE_T Size, + IN ULONG Tag); + +VOID +NTAPI +FsRtlDeleteExtraCreateParameterLookasideList( + IN OUT PVOID Lookaside, + IN FSRTL_ECP_LOOKASIDE_FLAGS Flags); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlAllocateExtraCreateParameterFromLookasideList( + IN LPCGUID EcpType, + IN ULONG SizeOfContext, + IN FSRTL_ALLOCATE_ECP_FLAGS Flags, + IN PFSRTL_EXTRA_CREATE_PARAMETER_CLEANUP_CALLBACK CleanupCallback OPTIONAL, + IN OUT PVOID LookasideList, + OUT PVOID *EcpContext); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlInsertExtraCreateParameter( + IN OUT PECP_LIST EcpList, + IN OUT PVOID EcpContext); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlFindExtraCreateParameter( + IN PECP_LIST EcpList, + IN LPCGUID EcpType, + OUT PVOID *EcpContext OPTIONAL, + OUT ULONG *EcpContextSize OPTIONAL); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlRemoveExtraCreateParameter( + IN OUT PECP_LIST EcpList, + IN LPCGUID EcpType, + OUT PVOID *EcpContext, + OUT ULONG *EcpContextSize OPTIONAL); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlGetEcpListFromIrp( + IN PIRP Irp, + OUT PECP_LIST *EcpList OPTIONAL); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlSetEcpListIntoIrp( + IN OUT PIRP Irp, + IN PECP_LIST EcpList); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlGetNextExtraCreateParameter( + IN PECP_LIST EcpList, + IN PVOID CurrentEcpContext OPTIONAL, + OUT LPGUID NextEcpType OPTIONAL, + OUT PVOID *NextEcpContext OPTIONAL, + OUT ULONG *NextEcpContextSize OPTIONAL); + +NTKERNELAPI +VOID +NTAPI +FsRtlAcknowledgeEcp( + IN PVOID EcpContext); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlIsEcpAcknowledged( + IN PVOID EcpContext); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlIsEcpFromUserMode( + IN PVOID EcpContext); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlChangeBackingFileObject( + IN PFILE_OBJECT CurrentFileObject OPTIONAL, + IN PFILE_OBJECT NewFileObject, + IN FSRTL_CHANGE_BACKING_TYPE ChangeBackingType, + IN ULONG Flags); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlLogCcFlushError( + IN PUNICODE_STRING FileName, + IN PDEVICE_OBJECT DeviceObject, + IN PSECTION_OBJECT_POINTERS SectionObjectPointer, + IN NTSTATUS FlushError, + IN ULONG Flags); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlAreVolumeStartupApplicationsComplete( + VOID); + +NTKERNELAPI +ULONG +NTAPI +FsRtlQueryMaximumVirtualDiskNestingLevel( + VOID); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlGetVirtualDiskNestingLevel( + IN PDEVICE_OBJECT DeviceObject, + OUT PULONG NestingLevel, + OUT PULONG NestingFlags OPTIONAL); + +#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ + +#if (NTDDI_VERSION >= NTDDI_VISTASP1) +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlCheckOplockEx( + IN POPLOCK Oplock, + IN PIRP Irp, + IN ULONG Flags, + IN PVOID Context OPTIONAL, + IN POPLOCK_WAIT_COMPLETE_ROUTINE CompletionRoutine OPTIONAL, + IN POPLOCK_FS_PREPOST_IRP PostIrpRoutine OPTIONAL); + +#endif + #if (NTDDI_VERSION >= NTDDI_WIN7) + NTKERNELAPI BOOLEAN NTAPI FsRtlAreThereCurrentOrInProgressFileLocks( IN PFILE_LOCK FileLock); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlOplockIsSharedRequest( + IN PIRP Irp); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlOplockBreakH( + IN POPLOCK Oplock, + IN PIRP Irp, + IN ULONG Flags, + IN PVOID Context OPTIONAL, + IN POPLOCK_WAIT_COMPLETE_ROUTINE CompletionRoutine OPTIONAL, + IN POPLOCK_FS_PREPOST_IRP PostIrpRoutine OPTIONAL); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlCurrentOplockH( + IN POPLOCK Oplock); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlOplockBreakToNoneEx( + IN OUT POPLOCK Oplock, + IN PIRP Irp, + IN ULONG Flags, + IN PVOID Context OPTIONAL, + IN POPLOCK_WAIT_COMPLETE_ROUTINE CompletionRoutine OPTIONAL, + IN POPLOCK_FS_PREPOST_IRP PostIrpRoutine OPTIONAL); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlOplockFsctrlEx( + IN POPLOCK Oplock, + IN PIRP Irp, + IN ULONG OpenCount, + IN ULONG Flags); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlOplockKeysEqual( + IN PFILE_OBJECT Fo1 OPTIONAL, + IN PFILE_OBJECT Fo2 OPTIONAL); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlInitializeExtraCreateParameterList( + IN OUT PECP_LIST EcpList); + +NTKERNELAPI +VOID +NTAPI +FsRtlInitializeExtraCreateParameter( + IN PECP_HEADER Ecp, + IN ULONG EcpFlags, + IN PFSRTL_EXTRA_CREATE_PARAMETER_CLEANUP_CALLBACK CleanupCallback OPTIONAL, + IN ULONG TotalSize, + IN LPCGUID EcpType, + IN PVOID ListAllocatedFrom OPTIONAL); + +#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlInsertPerFileContext( + IN PVOID* PerFileContextPointer, + IN PFSRTL_PER_FILE_CONTEXT Ptr); + +NTKERNELAPI +PFSRTL_PER_FILE_CONTEXT +NTAPI +FsRtlLookupPerFileContext( + IN PVOID* PerFileContextPointer, + IN PVOID OwnerId OPTIONAL, + IN PVOID InstanceId OPTIONAL); + +NTKERNELAPI +PFSRTL_PER_FILE_CONTEXT +NTAPI +FsRtlRemovePerFileContext( + IN PVOID* PerFileContextPointer, + IN PVOID OwnerId OPTIONAL, + IN PVOID InstanceId OPTIONAL); + +NTKERNELAPI +VOID +NTAPI +FsRtlTeardownPerFileContexts( + IN PVOID* PerFileContextPointer); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlInsertPerFileObjectContext( + IN PFILE_OBJECT FileObject, + IN PFSRTL_PER_FILEOBJECT_CONTEXT Ptr); + +NTKERNELAPI +PFSRTL_PER_FILEOBJECT_CONTEXT +NTAPI +FsRtlLookupPerFileObjectContext( + IN PFILE_OBJECT FileObject, + IN PVOID OwnerId OPTIONAL, + IN PVOID InstanceId OPTIONAL); + +NTKERNELAPI +PFSRTL_PER_FILEOBJECT_CONTEXT +NTAPI +FsRtlRemovePerFileObjectContext( + IN PFILE_OBJECT FileObject, + IN PVOID OwnerId OPTIONAL, + IN PVOID InstanceId OPTIONAL); + +#define FsRtlFastLock(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11) ( \ + FsRtlPrivateLock(A1, A2, A3, A4, A5, A6, A7, A8, A9, NULL, A10, A11) \ +) + +#define FsRtlAreThereCurrentFileLocks(FL) ( \ + ((FL)->FastIoIsQuestionable) \ +) + +#define FsRtlIncrementLockRequestsInProgress(FL) { \ + ASSERT( (FL)->LockRequestsInProgress >= 0 ); \ + (void) \ + (InterlockedIncrement((LONG volatile *)&((FL)->LockRequestsInProgress)));\ +} + +#define FsRtlDecrementLockRequestsInProgress(FL) { \ + ASSERT( (FL)->LockRequestsInProgress > 0 ); \ + (void) \ + (InterlockedDecrement((LONG volatile *)&((FL)->LockRequestsInProgress)));\ +} + +extern NTKERNELAPI PUSHORT NlsOemLeadByteInfo; +#define NLS_OEM_LEAD_BYTE_INFO NlsOemLeadByteInfo + +#ifdef NLS_MB_CODE_PAGE_TAG +#undef NLS_MB_CODE_PAGE_TAG #endif +#define NLS_MB_CODE_PAGE_TAG NlsMbOemCodePageTag + +/* GCC compatible definition, MS one is retarded */ +extern NTKERNELAPI const UCHAR * const FsRtlLegalAnsiCharacterArray; +#define LEGAL_ANSI_CHARACTER_ARRAY FsRtlLegalAnsiCharacterArray + +#define FsRtlIsAnsiCharacterWild(C) ( \ + FlagOn(FsRtlLegalAnsiCharacterArray[(UCHAR)(C)], FSRTL_WILD_CHARACTER ) \ +) + +#define FsRtlIsAnsiCharacterLegalFat(C, WILD) ( \ + FlagOn(FsRtlLegalAnsiCharacterArray[(UCHAR)(C)], (FSRTL_FAT_LEGAL) | \ + ((WILD) ? FSRTL_WILD_CHARACTER : 0 )) \ +) + +#define FsRtlIsAnsiCharacterLegalHpfs(C, WILD) ( \ + FlagOn(FsRtlLegalAnsiCharacterArray[(UCHAR)(C)], (FSRTL_HPFS_LEGAL) | \ + ((WILD) ? FSRTL_WILD_CHARACTER : 0 )) \ +) + +#define FsRtlIsAnsiCharacterLegalNtfs(C, WILD) ( \ + FlagOn(FsRtlLegalAnsiCharacterArray[(UCHAR)(C)], (FSRTL_NTFS_LEGAL) | \ + ((WILD) ? FSRTL_WILD_CHARACTER : 0 )) \ +) + +#define FsRtlIsAnsiCharacterLegalNtfsStream(C,WILD_OK) ( \ + FsRtlTestAnsiCharacter((C), TRUE, (WILD_OK), FSRTL_NTFS_STREAM_LEGAL) \ +) + +#define FsRtlIsAnsiCharacterLegal(C,FLAGS) ( \ + FsRtlTestAnsiCharacter((C), TRUE, FALSE, (FLAGS)) \ +) + +#define FsRtlTestAnsiCharacter(C, DEFAULT_RET, WILD_OK, FLAGS) ( \ + ((SCHAR)(C) < 0) ? DEFAULT_RET : \ + FlagOn( LEGAL_ANSI_CHARACTER_ARRAY[(C)], \ + (FLAGS) | \ + ((WILD_OK) ? FSRTL_WILD_CHARACTER : 0) ) \ +) + +#define FsRtlIsLeadDbcsCharacter(DBCS_CHAR) ( \ + (BOOLEAN)((UCHAR)(DBCS_CHAR) < 0x80 ? FALSE : \ + (NLS_MB_CODE_PAGE_TAG && \ + (NLS_OEM_LEAD_BYTE_INFO[(UCHAR)(DBCS_CHAR)] != 0))) \ +) + +#define FsRtlIsUnicodeCharacterWild(C) ( \ + (((C) >= 0x40) ? \ + FALSE : \ + FlagOn(FsRtlLegalAnsiCharacterArray[(C)], FSRTL_WILD_CHARACTER )) \ +) + +#define FsRtlInitPerFileContext( _fc, _owner, _inst, _cb) \ + ((_fc)->OwnerId = (_owner), \ + (_fc)->InstanceId = (_inst), \ + (_fc)->FreeCallback = (_cb)) + +#define FsRtlGetPerFileContextPointer(_fo) \ + (FsRtlSupportsPerFileContexts(_fo) ? \ + FsRtlGetPerStreamContextPointer(_fo)->FileContextSupportPointer : \ + NULL) + +#define FsRtlSupportsPerFileContexts(_fo) \ + ((FsRtlGetPerStreamContextPointer(_fo) != NULL) && \ + (FsRtlGetPerStreamContextPointer(_fo)->Version >= FSRTL_FCB_HEADER_V1) && \ + (FsRtlGetPerStreamContextPointer(_fo)->FileContextSupportPointer != NULL)) + +#define FsRtlSetupAdvancedHeaderEx( _advhdr, _fmutx, _fctxptr ) \ +{ \ + FsRtlSetupAdvancedHeader( _advhdr, _fmutx ); \ + if ((_fctxptr) != NULL) { \ + (_advhdr)->FileContextSupportPointer = (_fctxptr); \ + } \ +} + +#define FsRtlGetPerStreamContextPointer(FO) ( \ + (PFSRTL_ADVANCED_FCB_HEADER)(FO)->FsContext \ +) + +#define FsRtlInitPerStreamContext(PSC, O, I, FC) ( \ + (PSC)->OwnerId = (O), \ + (PSC)->InstanceId = (I), \ + (PSC)->FreeCallback = (FC) \ +) + +#define FsRtlSupportsPerStreamContexts(FO) ( \ + (BOOLEAN)((NULL != FsRtlGetPerStreamContextPointer(FO) && \ + FlagOn(FsRtlGetPerStreamContextPointer(FO)->Flags2, \ + FSRTL_FLAG2_SUPPORTS_FILTER_CONTEXTS)) \ +) + +#define FsRtlLookupPerStreamContext(_sc, _oid, _iid) \ + (((NULL != (_sc)) && \ + FlagOn((_sc)->Flags2,FSRTL_FLAG2_SUPPORTS_FILTER_CONTEXTS) && \ + !IsListEmpty(&(_sc)->FilterContexts)) ? \ + FsRtlLookupPerStreamContextInternal((_sc), (_oid), (_iid)) : \ + NULL) + +VOID +FORCEINLINE +NTAPI +FsRtlSetupAdvancedHeader( + IN PVOID AdvHdr, + IN PFAST_MUTEX FMutex ) +{ + PFSRTL_ADVANCED_FCB_HEADER localAdvHdr = (PFSRTL_ADVANCED_FCB_HEADER)AdvHdr; + + localAdvHdr->Flags |= FSRTL_FLAG_ADVANCED_HEADER; + localAdvHdr->Flags2 |= FSRTL_FLAG2_SUPPORTS_FILTER_CONTEXTS; +#if (NTDDI_VERSION >= NTDDI_VISTA) + localAdvHdr->Version = FSRTL_FCB_HEADER_V1; +#else + localAdvHdr->Version = FSRTL_FCB_HEADER_V0; +#endif + InitializeListHead( &localAdvHdr->FilterContexts ); + if (FMutex != NULL) { + localAdvHdr->FastMutex = FMutex; + } +#if (NTDDI_VERSION >= NTDDI_VISTA) + *((PULONG_PTR)(&localAdvHdr->PushLock)) = 0; + localAdvHdr->FileContextSupportPointer = NULL; +#endif +} + +#define FsRtlInitPerFileObjectContext(_fc, _owner, _inst) \ + ((_fc)->OwnerId = (_owner), (_fc)->InstanceId = (_inst)) + +#define FsRtlCompleteRequest(IRP,STATUS) { \ + (IRP)->IoStatus.Status = (STATUS); \ + IoCompleteRequest( (IRP), IO_DISK_INCREMENT ); \ +} + +#if (NTDDI_VERSION >= NTDDI_WIN7) +typedef struct _ECP_HEADER ECP_HEADER, *PECP_HEADER; +#endif + +#if (NTDDI_VERSION >= NTDDI_VISTA) + +typedef enum _NETWORK_OPEN_LOCATION_QUALIFIER { + NetworkOpenLocationAny, + NetworkOpenLocationRemote, + NetworkOpenLocationLoopback +} NETWORK_OPEN_LOCATION_QUALIFIER; + +typedef enum _NETWORK_OPEN_INTEGRITY_QUALIFIER { + NetworkOpenIntegrityAny, + NetworkOpenIntegrityNone, + NetworkOpenIntegritySigned, + NetworkOpenIntegrityEncrypted, + NetworkOpenIntegrityMaximum +} NETWORK_OPEN_INTEGRITY_QUALIFIER; + +#if (NTDDI_VERSION >= NTDDI_WIN7) + +#define NETWORK_OPEN_ECP_IN_FLAG_DISABLE_HANDLE_COLLAPSING 0x1 +#define NETWORK_OPEN_ECP_IN_FLAG_DISABLE_HANDLE_DURABILITY 0x2 +#define NETWORK_OPEN_ECP_IN_FLAG_FORCE_BUFFERED_SYNCHRONOUS_IO_HACK 0x80000000 + +typedef struct _NETWORK_OPEN_ECP_CONTEXT { + USHORT Size; + USHORT Reserved; + struct { + struct { + NETWORK_OPEN_LOCATION_QUALIFIER Location; + NETWORK_OPEN_INTEGRITY_QUALIFIER Integrity; + ULONG Flags; + } in; + struct { + NETWORK_OPEN_LOCATION_QUALIFIER Location; + NETWORK_OPEN_INTEGRITY_QUALIFIER Integrity; + ULONG Flags; + } out; + } DUMMYSTRUCTNAME; +} NETWORK_OPEN_ECP_CONTEXT, *PNETWORK_OPEN_ECP_CONTEXT; + +typedef struct _NETWORK_OPEN_ECP_CONTEXT_V0 { + USHORT Size; + USHORT Reserved; + struct { + struct { + NETWORK_OPEN_LOCATION_QUALIFIER Location; + NETWORK_OPEN_INTEGRITY_QUALIFIER Integrity; + } in; + struct { + NETWORK_OPEN_LOCATION_QUALIFIER Location; + NETWORK_OPEN_INTEGRITY_QUALIFIER Integrity; + } out; + } DUMMYSTRUCTNAME; +} NETWORK_OPEN_ECP_CONTEXT_V0, *PNETWORK_OPEN_ECP_CONTEXT_V0; + +#elif (NTDDI_VERSION >= NTDDI_VISTA) +typedef struct _NETWORK_OPEN_ECP_CONTEXT { + USHORT Size; + USHORT Reserved; + struct { + struct { + NETWORK_OPEN_LOCATION_QUALIFIER Location; + NETWORK_OPEN_INTEGRITY_QUALIFIER Integrity; + } in; + struct { + NETWORK_OPEN_LOCATION_QUALIFIER Location; + NETWORK_OPEN_INTEGRITY_QUALIFIER Integrity; + } out; + } DUMMYSTRUCTNAME; +} NETWORK_OPEN_ECP_CONTEXT, *PNETWORK_OPEN_ECP_CONTEXT; +#endif + +DEFINE_GUID(GUID_ECP_NETWORK_OPEN_CONTEXT, 0xc584edbf, 0x00df, 0x4d28, 0xb8, 0x84, 0x35, 0xba, 0xca, 0x89, 0x11, 0xe8 ); + +#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ + + +#if (NTDDI_VERSION >= NTDDI_VISTA) + +typedef struct _PREFETCH_OPEN_ECP_CONTEXT { + PVOID Context; +} PREFETCH_OPEN_ECP_CONTEXT, *PPREFETCH_OPEN_ECP_CONTEXT; + +DEFINE_GUID(GUID_ECP_PREFETCH_OPEN, 0xe1777b21, 0x847e, 0x4837, 0xaa, 0x45, 0x64, 0x16, 0x1d, 0x28, 0x6, 0x55 ); + +#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ + +#if (NTDDI_VERSION >= NTDDI_WIN7) + +DEFINE_GUID (GUID_ECP_NFS_OPEN, 0xf326d30c, 0xe5f8, 0x4fe7, 0xab, 0x74, 0xf5, 0xa3, 0x19, 0x6d, 0x92, 0xdb); +DEFINE_GUID(GUID_ECP_SRV_OPEN, 0xbebfaebc, 0xaabf, 0x489d, 0x9d, 0x2c, 0xe9, 0xe3, 0x61, 0x10, 0x28, 0x53 ); + +typedef struct sockaddr_storage *PSOCKADDR_STORAGE_NFS; + +typedef struct _NFS_OPEN_ECP_CONTEXT { + PUNICODE_STRING ExportAlias; + PSOCKADDR_STORAGE_NFS ClientSocketAddress; +} NFS_OPEN_ECP_CONTEXT, *PNFS_OPEN_ECP_CONTEXT, **PPNFS_OPEN_ECP_CONTEXT; + +typedef struct _SRV_OPEN_ECP_CONTEXT { + PUNICODE_STRING ShareName; + PSOCKADDR_STORAGE_NFS SocketAddress; + BOOLEAN OplockBlockState; + BOOLEAN OplockAppState; + BOOLEAN OplockFinalState; +} SRV_OPEN_ECP_CONTEXT, *PSRV_OPEN_ECP_CONTEXT; + +#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ + +#define VACB_MAPPING_GRANULARITY (0x40000) +#define VACB_OFFSET_SHIFT (18) + +typedef struct _PUBLIC_BCB { + CSHORT NodeTypeCode; + CSHORT NodeByteSize; + ULONG MappedLength; + LARGE_INTEGER MappedFileOffset; +} PUBLIC_BCB, *PPUBLIC_BCB; + +typedef struct _CC_FILE_SIZES { + LARGE_INTEGER AllocationSize; + LARGE_INTEGER FileSize; + LARGE_INTEGER ValidDataLength; +} CC_FILE_SIZES, *PCC_FILE_SIZES; + +typedef BOOLEAN +(NTAPI *PACQUIRE_FOR_LAZY_WRITE) ( + IN PVOID Context, + IN BOOLEAN Wait); + +typedef VOID +(NTAPI *PRELEASE_FROM_LAZY_WRITE) ( + IN PVOID Context); + +typedef BOOLEAN +(NTAPI *PACQUIRE_FOR_READ_AHEAD) ( + IN PVOID Context, + IN BOOLEAN Wait); + +typedef VOID +(NTAPI *PRELEASE_FROM_READ_AHEAD) ( + IN PVOID Context); + +typedef struct _CACHE_MANAGER_CALLBACKS { + PACQUIRE_FOR_LAZY_WRITE AcquireForLazyWrite; + PRELEASE_FROM_LAZY_WRITE ReleaseFromLazyWrite; + PACQUIRE_FOR_READ_AHEAD AcquireForReadAhead; + PRELEASE_FROM_READ_AHEAD ReleaseFromReadAhead; +} CACHE_MANAGER_CALLBACKS, *PCACHE_MANAGER_CALLBACKS; + +typedef struct _CACHE_UNINITIALIZE_EVENT { + struct _CACHE_UNINITIALIZE_EVENT *Next; + KEVENT Event; +} CACHE_UNINITIALIZE_EVENT, *PCACHE_UNINITIALIZE_EVENT; + +typedef VOID +(NTAPI *PDIRTY_PAGE_ROUTINE) ( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + IN PLARGE_INTEGER OldestLsn, + IN PLARGE_INTEGER NewestLsn, + IN PVOID Context1, + IN PVOID Context2); + +typedef VOID +(NTAPI *PFLUSH_TO_LSN) ( + IN PVOID LogHandle, + IN LARGE_INTEGER Lsn); + +typedef VOID +(NTAPI *PCC_POST_DEFERRED_WRITE) ( + IN PVOID Context1, + IN PVOID Context2); + +#define CcIsFileCached(FO) ( \ + ((FO)->SectionObjectPointer != NULL) && \ + (((PSECTION_OBJECT_POINTERS)(FO)->SectionObjectPointer)->SharedCacheMap != NULL) \ +) + +extern ULONG CcFastMdlReadWait; + +#if (NTDDI_VERSION >= NTDDI_WIN2K) + +NTKERNELAPI +VOID +NTAPI +CcInitializeCacheMap( + IN PFILE_OBJECT FileObject, + IN PCC_FILE_SIZES FileSizes, + IN BOOLEAN PinAccess, + IN PCACHE_MANAGER_CALLBACKS Callbacks, + IN PVOID LazyWriteContext); + +NTKERNELAPI +BOOLEAN +NTAPI +CcUninitializeCacheMap( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER TruncateSize OPTIONAL, + IN PCACHE_UNINITIALIZE_EVENT UninitializeCompleteEvent OPTIONAL); + +NTKERNELAPI +VOID +NTAPI +CcSetFileSizes( + IN PFILE_OBJECT FileObject, + IN PCC_FILE_SIZES FileSizes); + +NTKERNELAPI +VOID +NTAPI +CcSetDirtyPageThreshold( + IN PFILE_OBJECT FileObject, + IN ULONG DirtyPageThreshold); + +NTKERNELAPI +VOID +NTAPI +CcFlushCache( + IN PSECTION_OBJECT_POINTERS SectionObjectPointer, + IN PLARGE_INTEGER FileOffset OPTIONAL, + IN ULONG Length, + OUT PIO_STATUS_BLOCK IoStatus OPTIONAL); + +NTKERNELAPI +LARGE_INTEGER +NTAPI +CcGetFlushedValidData( + IN PSECTION_OBJECT_POINTERS SectionObjectPointer, + IN BOOLEAN BcbListHeld); + +NTKERNELAPI +BOOLEAN +NTAPI +CcZeroData( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER StartOffset, + IN PLARGE_INTEGER EndOffset, + IN BOOLEAN Wait); + +NTKERNELAPI +PVOID +NTAPI +CcRemapBcb( + IN PVOID Bcb); + +NTKERNELAPI +VOID +NTAPI +CcRepinBcb( + IN PVOID Bcb); + +NTKERNELAPI +VOID +NTAPI +CcUnpinRepinnedBcb( + IN PVOID Bcb, + IN BOOLEAN WriteThrough, + OUT PIO_STATUS_BLOCK IoStatus); + +NTKERNELAPI +PFILE_OBJECT +NTAPI +CcGetFileObjectFromSectionPtrs( + IN PSECTION_OBJECT_POINTERS SectionObjectPointer); + +NTKERNELAPI +PFILE_OBJECT +NTAPI +CcGetFileObjectFromBcb( + IN PVOID Bcb); + +NTKERNELAPI +BOOLEAN +NTAPI +CcCanIWrite( + IN PFILE_OBJECT FileObject, + IN ULONG BytesToWrite, + IN BOOLEAN Wait, + IN BOOLEAN Retrying); + +NTKERNELAPI +VOID +NTAPI +CcDeferWrite( + IN PFILE_OBJECT FileObject, + IN PCC_POST_DEFERRED_WRITE PostRoutine, + IN PVOID Context1, + IN PVOID Context2, + IN ULONG BytesToWrite, + IN BOOLEAN Retrying); + +NTKERNELAPI +BOOLEAN +NTAPI +CcCopyRead( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + IN BOOLEAN Wait, + OUT PVOID Buffer, + OUT PIO_STATUS_BLOCK IoStatus); + +NTKERNELAPI +VOID +NTAPI +CcFastCopyRead( + IN PFILE_OBJECT FileObject, + IN ULONG FileOffset, + IN ULONG Length, + IN ULONG PageCount, + OUT PVOID Buffer, + OUT PIO_STATUS_BLOCK IoStatus); + +NTKERNELAPI +BOOLEAN +NTAPI +CcCopyWrite( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + IN BOOLEAN Wait, + IN PVOID Buffer); + +NTKERNELAPI +VOID +NTAPI +CcFastCopyWrite( + IN PFILE_OBJECT FileObject, + IN ULONG FileOffset, + IN ULONG Length, + IN PVOID Buffer); + +NTKERNELAPI +VOID +NTAPI +CcMdlRead( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + OUT PMDL *MdlChain, + OUT PIO_STATUS_BLOCK IoStatus); + +NTKERNELAPI +VOID +NTAPI +CcMdlReadComplete( + IN PFILE_OBJECT FileObject, + IN PMDL MdlChain); + +NTKERNELAPI +VOID +NTAPI +CcPrepareMdlWrite( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + OUT PMDL *MdlChain, + OUT PIO_STATUS_BLOCK IoStatus); + +NTKERNELAPI +VOID +NTAPI +CcMdlWriteComplete( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN PMDL MdlChain); + +NTKERNELAPI +VOID +NTAPI +CcScheduleReadAhead( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length); + +NTKERNELAPI +NTSTATUS +NTAPI +CcWaitForCurrentLazyWriterActivity( + VOID); + +NTKERNELAPI +VOID +NTAPI +CcSetReadAheadGranularity( + IN PFILE_OBJECT FileObject, + IN ULONG Granularity); + +NTKERNELAPI +BOOLEAN +NTAPI +CcPinRead( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + IN ULONG Flags, + OUT PVOID *Bcb, + OUT PVOID *Buffer); + +NTKERNELAPI +BOOLEAN +NTAPI +CcPinMappedData( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + IN ULONG Flags, + IN OUT PVOID *Bcb); + +NTKERNELAPI +BOOLEAN +NTAPI +CcPreparePinWrite( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + IN BOOLEAN Zero, + IN ULONG Flags, + OUT PVOID *Bcb, + OUT PVOID *Buffer); + +NTKERNELAPI +VOID +NTAPI +CcSetDirtyPinnedData( + IN PVOID BcbVoid, + IN PLARGE_INTEGER Lsn OPTIONAL); + +NTKERNELAPI +VOID +NTAPI +CcUnpinData( + IN PVOID Bcb); + +NTKERNELAPI +VOID +NTAPI +CcSetBcbOwnerPointer( + IN PVOID Bcb, + IN PVOID OwnerPointer); + +NTKERNELAPI +VOID +NTAPI +CcUnpinDataForThread( + IN PVOID Bcb, + IN ERESOURCE_THREAD ResourceThreadId); + +NTKERNELAPI +VOID +NTAPI +CcSetAdditionalCacheAttributes( + IN PFILE_OBJECT FileObject, + IN BOOLEAN DisableReadAhead, + IN BOOLEAN DisableWriteBehind); + +NTKERNELAPI +BOOLEAN +NTAPI +CcIsThereDirtyData( + IN PVPB Vpb); + +#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ + +#if (NTDDI_VERSION >= NTDDI_WINXP) + +NTKERNELAPI +VOID +NTAPI +CcMdlWriteAbort( + IN PFILE_OBJECT FileObject, + IN PMDL MdlChain); + +NTKERNELAPI +VOID +NTAPI +CcSetLogHandleForFile( + IN PFILE_OBJECT FileObject, + IN PVOID LogHandle, + IN PFLUSH_TO_LSN FlushToLsnRoutine); + +NTKERNELAPI +LARGE_INTEGER +NTAPI +CcGetDirtyPages( + IN PVOID LogHandle, + IN PDIRTY_PAGE_ROUTINE DirtyPageRoutine, + IN PVOID Context1, + IN PVOID Context2); + +#endif + +#if (NTDDI_VERSION >= NTDDI_WINXP) +NTKERNELAPI +BOOLEAN +NTAPI +CcMapData( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + IN ULONG Flags, + OUT PVOID *Bcb, + OUT PVOID *Buffer); +#elif (NTDDI_VERSION >= NTDDI_WIN2K) +NTKERNELAPI +BOOLEAN +NTAPI +CcMapData( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + IN BOOLEAN Wait, + OUT PVOID *Bcb, + OUT PVOID *Buffer); +#endif + +#if (NTDDI_VERSION >= NTDDI_VISTA) + +NTKERNELAPI +NTSTATUS +NTAPI +CcSetFileSizesEx( + IN PFILE_OBJECT FileObject, + IN PCC_FILE_SIZES FileSizes); + +NTKERNELAPI +PFILE_OBJECT +NTAPI +CcGetFileObjectFromSectionPtrsRef( + IN PSECTION_OBJECT_POINTERS SectionObjectPointer); + +NTKERNELAPI +VOID +NTAPI +CcSetParallelFlushFile( + IN PFILE_OBJECT FileObject, + IN BOOLEAN EnableParallelFlush); + +NTKERNELAPI +BOOLEAN +CcIsThereDirtyDataEx( + IN PVPB Vpb, + IN PULONG NumberOfDirtyPages OPTIONAL); + +#endif + +#if (NTDDI_VERSION >= NTDDI_WIN7) +NTKERNELAPI +VOID +NTAPI +CcCoherencyFlushAndPurgeCache( + IN PSECTION_OBJECT_POINTERS SectionObjectPointer, + IN PLARGE_INTEGER FileOffset OPTIONAL, + IN ULONG Length, + OUT PIO_STATUS_BLOCK IoStatus, + IN ULONG Flags OPTIONAL); +#endif + +#define CcGetFileSizePointer(FO) ( \ + ((PLARGE_INTEGER)((FO)->SectionObjectPointer->SharedCacheMap) + 1) \ +) + +#define UNINITIALIZE_CACHE_MAPS (1) +#define DO_NOT_RETRY_PURGE (2) +#define DO_NOT_PURGE_DIRTY_PAGES (0x4) + +#define CC_FLUSH_AND_PURGE_NO_PURGE (0x1) + +#if (NTDDI_VERSION >= NTDDI_VISTA) +NTKERNELAPI +BOOLEAN +NTAPI +CcPurgeCacheSection( + IN PSECTION_OBJECT_POINTERS SectionObjectPointer, + IN PLARGE_INTEGER FileOffset OPTIONAL, + IN ULONG Length, + IN ULONG Flags); +#elif (NTDDI_VERSION >= NTDDI_WIN2K) +NTKERNELAPI +BOOLEAN +NTAPI +CcPurgeCacheSection( + IN PSECTION_OBJECT_POINTERS SectionObjectPointer, + IN PLARGE_INTEGER FileOffset OPTIONAL, + IN ULONG Length, + IN BOOLEAN UninitializeCacheMaps); +#endif + +#if (NTDDI_VERSION >= NTDDI_WIN7) +NTKERNELAPI +BOOLEAN +NTAPI +CcCopyWriteWontFlush( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length); +#else +#define CcCopyWriteWontFlush(FO, FOFF, LEN) ((LEN) <= 0x10000) +#endif + +#define CcReadAhead(FO, FOFF, LEN) ( \ + if ((LEN) >= 256) { \ + CcScheduleReadAhead((FO), (FOFF), (LEN)); \ + } \ +) + +#define PIN_WAIT (1) +#define PIN_EXCLUSIVE (2) +#define PIN_NO_READ (4) +#define PIN_IF_BCB (8) +#define PIN_CALLER_TRACKS_DIRTY_DATA (32) +#define PIN_HIGH_PRIORITY (64) + +#define MAP_WAIT 1 +#define MAP_NO_READ (16) +#define MAP_HIGH_PRIORITY (64) + +#define IOCTL_REDIR_QUERY_PATH CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 99, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_REDIR_QUERY_PATH_EX CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 100, METHOD_NEITHER, FILE_ANY_ACCESS) + +typedef struct _QUERY_PATH_REQUEST { + ULONG PathNameLength; + PIO_SECURITY_CONTEXT SecurityContext; + WCHAR FilePathName[1]; +} QUERY_PATH_REQUEST, *PQUERY_PATH_REQUEST; + +typedef struct _QUERY_PATH_REQUEST_EX { + PIO_SECURITY_CONTEXT pSecurityContext; + ULONG EaLength; + PVOID pEaBuffer; + UNICODE_STRING PathName; + UNICODE_STRING DomainServiceName; + ULONG_PTR Reserved[ 3 ]; +} QUERY_PATH_REQUEST_EX, *PQUERY_PATH_REQUEST_EX; + +typedef struct _QUERY_PATH_RESPONSE { + ULONG LengthAccepted; +} QUERY_PATH_RESPONSE, *PQUERY_PATH_RESPONSE; + +#define VOLSNAPCONTROLTYPE 0x00000053 +#define IOCTL_VOLSNAP_FLUSH_AND_HOLD_WRITES CTL_CODE(VOLSNAPCONTROLTYPE, 0, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) + +#if (NTDDI_VERSION >= NTDDI_WIN2K) + +NTSYSAPI +NTSTATUS +NTAPI +ZwQueryObject( + IN HANDLE Handle OPTIONAL, + IN OBJECT_INFORMATION_CLASS ObjectInformationClass, + OUT PVOID ObjectInformation OPTIONAL, + IN ULONG ObjectInformationLength, + OUT PULONG ReturnLength OPTIONAL); + +NTSYSAPI +NTSTATUS +NTAPI +ZwNotifyChangeKey( + IN HANDLE KeyHandle, + IN HANDLE EventHandle OPTIONAL, + IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, + IN PVOID ApcContext OPTIONAL, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN ULONG NotifyFilter, + IN BOOLEAN WatchSubtree, + OUT PVOID Buffer, + IN ULONG BufferLength, + IN BOOLEAN Asynchronous); + +NTSYSAPI +NTSTATUS +NTAPI +ZwCreateEvent( + OUT PHANDLE EventHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, + IN EVENT_TYPE EventType, + IN BOOLEAN InitialState); + +NTSYSAPI +NTSTATUS +NTAPI +ZwDeleteFile( + IN POBJECT_ATTRIBUTES ObjectAttributes); + +NTSYSAPI +NTSTATUS +NTAPI +ZwQueryDirectoryFile( + IN HANDLE FileHandle, + IN HANDLE Event OPTIONAL, + IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, + IN PVOID ApcContext OPTIONAL, + OUT PIO_STATUS_BLOCK IoStatusBlock, + OUT PVOID FileInformation, + IN ULONG Length, + IN FILE_INFORMATION_CLASS FileInformationClass, + IN BOOLEAN ReturnSingleEntry, + IN PUNICODE_STRING FileName OPTIONAL, + IN BOOLEAN RestartScan); + +NTSYSAPI +NTSTATUS +NTAPI +ZwSetVolumeInformationFile( + IN HANDLE FileHandle, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN PVOID FsInformation, + IN ULONG Length, + IN FS_INFORMATION_CLASS FsInformationClass); + +NTSYSAPI +NTSTATUS +NTAPI +ZwFsControlFile( + IN HANDLE FileHandle, + IN HANDLE Event OPTIONAL, + IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, + IN PVOID ApcContext OPTIONAL, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN ULONG FsControlCode, + IN PVOID InputBuffer OPTIONAL, + IN ULONG InputBufferLength, + OUT PVOID OutputBuffer OPTIONAL, + IN ULONG OutputBufferLength); + +NTSYSAPI +NTSTATUS +NTAPI +ZwDuplicateObject( + IN HANDLE SourceProcessHandle, + IN HANDLE SourceHandle, + IN HANDLE TargetProcessHandle OPTIONAL, + OUT PHANDLE TargetHandle OPTIONAL, + IN ACCESS_MASK DesiredAccess, + IN ULONG HandleAttributes, + IN ULONG Options); + +NTSYSAPI +NTSTATUS +NTAPI +ZwOpenDirectoryObject( + OUT PHANDLE DirectoryHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes); + +NTSYSAPI +NTSTATUS +NTAPI +ZwAllocateVirtualMemory( + IN HANDLE ProcessHandle, + IN OUT PVOID *BaseAddress, + IN ULONG_PTR ZeroBits, + IN OUT PSIZE_T RegionSize, + IN ULONG AllocationType, + IN ULONG Protect); + +NTSYSAPI +NTSTATUS +NTAPI +ZwFreeVirtualMemory( + IN HANDLE ProcessHandle, + IN OUT PVOID *BaseAddress, + IN OUT PSIZE_T RegionSize, + IN ULONG FreeType); + +NTSYSAPI +NTSTATUS +NTAPI +ZwWaitForSingleObject( + IN HANDLE Handle, + IN BOOLEAN Alertable, + IN PLARGE_INTEGER Timeout OPTIONAL); + +NTSYSAPI +NTSTATUS +NTAPI +ZwSetEvent( + IN HANDLE EventHandle, + OUT PLONG PreviousState OPTIONAL); + +NTSYSAPI +NTSTATUS +NTAPI +ZwFlushVirtualMemory( + IN HANDLE ProcessHandle, + IN OUT PVOID *BaseAddress, + IN OUT PSIZE_T RegionSize, + OUT PIO_STATUS_BLOCK IoStatusBlock); + +NTSYSAPI +NTSTATUS +NTAPI +ZwQueryInformationToken( + IN HANDLE TokenHandle, + IN TOKEN_INFORMATION_CLASS TokenInformationClass, + OUT PVOID TokenInformation, + IN ULONG Length, + OUT PULONG ResultLength); + +NTSYSAPI +NTSTATUS +NTAPI +ZwSetSecurityObject( + IN HANDLE Handle, + IN SECURITY_INFORMATION SecurityInformation, + IN PSECURITY_DESCRIPTOR SecurityDescriptor); + +NTSYSAPI +NTSTATUS +NTAPI +ZwQuerySecurityObject( + IN HANDLE FileHandle, + IN SECURITY_INFORMATION SecurityInformation, + OUT PSECURITY_DESCRIPTOR SecurityDescriptor, + IN ULONG Length, + OUT PULONG ResultLength); + +#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ + +#if (NTDDI_VERSION >= NTDDI_WINXP) + +NTSYSAPI +NTSTATUS +NTAPI +ZwOpenProcessTokenEx( + IN HANDLE ProcessHandle, + IN ACCESS_MASK DesiredAccess, + IN ULONG HandleAttributes, + OUT PHANDLE TokenHandle); + +NTSYSAPI +NTSTATUS +NTAPI +ZwOpenThreadTokenEx( + IN HANDLE ThreadHandle, + IN ACCESS_MASK DesiredAccess, + IN BOOLEAN OpenAsSelf, + IN ULONG HandleAttributes, + OUT PHANDLE TokenHandle); + +#endif + +#if (NTDDI_VERSION >= NTDDI_VISTA) + +NTSYSAPI +NTSTATUS +NTAPI +ZwLockFile( + IN HANDLE FileHandle, + IN HANDLE Event OPTIONAL, + IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, + IN PVOID ApcContext OPTIONAL, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN PLARGE_INTEGER ByteOffset, + IN PLARGE_INTEGER Length, + IN ULONG Key, + IN BOOLEAN FailImmediately, + IN BOOLEAN ExclusiveLock); + +NTSYSAPI +NTSTATUS +NTAPI +ZwUnlockFile( + IN HANDLE FileHandle, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN PLARGE_INTEGER ByteOffset, + IN PLARGE_INTEGER Length, + IN ULONG Key); + +NTSYSAPI +NTSTATUS +NTAPI +ZwQueryQuotaInformationFile( + IN HANDLE FileHandle, + OUT PIO_STATUS_BLOCK IoStatusBlock, + OUT PVOID Buffer, + IN ULONG Length, + IN BOOLEAN ReturnSingleEntry, + IN PVOID SidList, + IN ULONG SidListLength, + IN PSID StartSid OPTIONAL, + IN BOOLEAN RestartScan); + +NTSYSAPI +NTSTATUS +NTAPI +ZwSetQuotaInformationFile( + IN HANDLE FileHandle, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN PVOID Buffer, + IN ULONG Length); + +NTSYSAPI +NTSTATUS +NTAPI +ZwFlushBuffersFile( + IN HANDLE FileHandle, + OUT PIO_STATUS_BLOCK IoStatusBlock); + +#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ + +#if (NTDDI_VERSION >= NTDDI_WIN7) +NTSYSAPI +NTSTATUS +NTAPI +ZwSetInformationToken( + IN HANDLE TokenHandle, + IN TOKEN_INFORMATION_CLASS TokenInformationClass, + IN PVOID TokenInformation, + IN ULONG TokenInformationLength); +#endif + +NTSYSAPI +NTSTATUS +NTAPI +ZwQueryEaFile( + IN HANDLE FileHandle, + OUT PIO_STATUS_BLOCK IoStatusBlock, + OUT PVOID Buffer, + IN ULONG Length, + IN BOOLEAN ReturnSingleEntry, + IN PVOID EaList OPTIONAL, + IN ULONG EaListLength, + IN PULONG EaIndex OPTIONAL, + IN BOOLEAN RestartScan); + +NTSYSAPI +NTSTATUS +NTAPI +ZwSetEaFile( + IN HANDLE FileHandle, + OUT PIO_STATUS_BLOCK IoStatusBlock, + OUT PVOID Buffer, + IN ULONG Length); + +NTSYSAPI +NTSTATUS +NTAPI +ZwDuplicateToken( + IN HANDLE ExistingTokenHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes, + IN BOOLEAN EffectiveOnly, + IN TOKEN_TYPE TokenType, + OUT PHANDLE NewTokenHandle); #pragma pack(push,4) @@ -6863,11 +9029,6 @@ FsRtlAreThereCurrentOrInProgressFileLocks( #include "csq.h" -#ifdef _NTOSKRNL_ -extern PUCHAR FsRtlLegalAnsiCharacterArray; -#else -extern DECLSPEC_IMPORT PUCHAR FsRtlLegalAnsiCharacterArray; -#endif extern PACL SePublicDefaultDacl; extern PACL SeSystemDefaultDacl; @@ -6890,30 +9051,11 @@ extern PACL SeSystemDefaultDacl; #define FILE_VC_QUOTAS_LOG_VIOLATIONS 0x00000004 -#define FSRTL_VOLUME_DISMOUNT 1 -#define FSRTL_VOLUME_DISMOUNT_FAILED 2 -#define FSRTL_VOLUME_LOCK 3 -#define FSRTL_VOLUME_LOCK_FAILED 4 -#define FSRTL_VOLUME_UNLOCK 5 -#define FSRTL_VOLUME_MOUNT 6 - -#define FSRTL_WILD_CHARACTER 0x08 - -#define FSRTL_FAT_LEGAL 0x01 -#define FSRTL_HPFS_LEGAL 0x02 -#define FSRTL_NTFS_LEGAL 0x04 -#define FSRTL_WILD_CHARACTER 0x08 -#define FSRTL_OLE_LEGAL 0x10 -#define FSRTL_NTFS_STREAM_LEGAL 0x14 - #ifdef _X86_ #define HARDWARE_PTE HARDWARE_PTE_X86 #define PHARDWARE_PTE PHARDWARE_PTE_X86 #endif -#define IO_CHECK_CREATE_PARAMETERS 0x0200 -#define IO_ATTACH_DEVICE 0x0400 - #define IO_ATTACH_DEVICE_API 0x80000000 #define IO_TYPE_APC 18 @@ -6932,8 +9074,6 @@ extern PACL SeSystemDefaultDacl; #define MEM_DOS_LIM 0x40000000 -#define MCB_FLAG_RAISE_ON_ALLOCATION_FAILURE 1 - #define OB_TYPE_TYPE 1 #define OB_TYPE_DIRECTORY 2 #define OB_TYPE_SYMBOLIC_LINK 3 @@ -6958,23 +9098,12 @@ extern PACL SeSystemDefaultDacl; #define OB_TYPE_IO_COMPLETION 22 #define OB_TYPE_FILE 23 -#define PIN_WAIT (1) -#define PIN_EXCLUSIVE (2) -#define PIN_NO_READ (4) -#define PIN_IF_BCB (8) - #define SEC_BASED 0x00200000 -#define SECURITY_WORLD_SID_AUTHORITY {0,0,0,0,0,1} -#define SECURITY_WORLD_RID (0x00000000L) - /* end winnt.h */ #define TOKEN_HAS_ADMIN_GROUP 0x08 -#define VACB_MAPPING_GRANULARITY (0x40000) -#define VACB_OFFSET_SHIFT (18) - #if (VER_PRODUCTBUILD >= 1381) #define FSCTL_GET_HFS_INFORMATION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 31, METHOD_BUFFERED, FILE_ANY_ACCESS) #endif /* (VER_PRODUCTBUILD >= 1381) */ @@ -7001,18 +9130,6 @@ extern PACL SeSystemDefaultDacl; #define FSCTL_NETWORK_SET_DOMAIN_NAME CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 120, METHOD_BUFFERED, FILE_ANY_ACCESS) #define FSCTL_NETWORK_REMOTE_BOOT_INIT_SCRT CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 250, METHOD_BUFFERED, FILE_ANY_ACCESS) -#define IOCTL_REDIR_QUERY_PATH CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 99, METHOD_NEITHER, FILE_ANY_ACCESS) - -typedef PVOID OPLOCK, *POPLOCK; - -// -// Forwarders -// -struct _RTL_AVL_TABLE; -struct _RTL_GENERIC_TABLE; - -typedef PVOID PNOTIFY_SYNC; - typedef enum _FILE_STORAGE_TYPE { StorageTypeDefault = 1, StorageTypeDirectory, @@ -7048,17 +9165,6 @@ typedef struct _BITMAP_RANGE { PULONG Bitmap; } BITMAP_RANGE, *PBITMAP_RANGE; -typedef struct _CACHE_UNINITIALIZE_EVENT { - struct _CACHE_UNINITIALIZE_EVENT *Next; - KEVENT Event; -} CACHE_UNINITIALIZE_EVENT, *PCACHE_UNINITIALIZE_EVENT; - -typedef struct _CC_FILE_SIZES { - LARGE_INTEGER AllocationSize; - LARGE_INTEGER FileSize; - LARGE_INTEGER ValidDataLength; -} CC_FILE_SIZES, *PCC_FILE_SIZES; - typedef struct _FILE_COPY_ON_WRITE_INFORMATION { BOOLEAN ReplaceIfExists; HANDLE RootDirectory; @@ -7081,49 +9187,6 @@ typedef struct _FILE_FULL_DIRECTORY_INFORMATION { WCHAR FileName[ANYSIZE_ARRAY]; } FILE_FULL_DIRECTORY_INFORMATION, *PFILE_FULL_DIRECTORY_INFORMATION; -typedef struct _FILE_FS_FULL_SIZE_INFORMATION { - LARGE_INTEGER TotalAllocationUnits; - LARGE_INTEGER CallerAvailableAllocationUnits; - LARGE_INTEGER ActualAvailableAllocationUnits; - ULONG SectorsPerAllocationUnit; - ULONG BytesPerSector; -} FILE_FS_FULL_SIZE_INFORMATION, *PFILE_FS_FULL_SIZE_INFORMATION; - -typedef struct _FILE_FS_LABEL_INFORMATION { - ULONG VolumeLabelLength; - WCHAR VolumeLabel[1]; -} FILE_FS_LABEL_INFORMATION, *PFILE_FS_LABEL_INFORMATION; - -#if (VER_PRODUCTBUILD >= 2195) - -typedef struct _FILE_FS_OBJECT_ID_INFORMATION { - UCHAR ObjectId[16]; - UCHAR ExtendedInfo[48]; -} FILE_FS_OBJECT_ID_INFORMATION, *PFILE_FS_OBJECT_ID_INFORMATION; - -#endif /* (VER_PRODUCTBUILD >= 2195) */ - -typedef struct _FILE_FS_SIZE_INFORMATION { - LARGE_INTEGER TotalAllocationUnits; - LARGE_INTEGER AvailableAllocationUnits; - ULONG SectorsPerAllocationUnit; - ULONG BytesPerSector; -} FILE_FS_SIZE_INFORMATION, *PFILE_FS_SIZE_INFORMATION; - -typedef struct _FILE_FS_VOLUME_INFORMATION { - LARGE_INTEGER VolumeCreationTime; - ULONG VolumeSerialNumber; - ULONG VolumeLabelLength; - BOOLEAN SupportsObjects; - WCHAR VolumeLabel[1]; -} FILE_FS_VOLUME_INFORMATION, *PFILE_FS_VOLUME_INFORMATION; - -typedef struct _FILE_FS_OBJECTID_INFORMATION -{ - UCHAR ObjectId[16]; - UCHAR ExtendedInfo[48]; -} FILE_FS_OBJECTID_INFORMATION, *PFILE_FS_OBJECTID_INFORMATION; - /* raw internal file lock struct returned from FsRtlGetNextFileLock */ typedef struct _FILE_SHARED_LOCK_ENTRY { PVOID Unknown1; @@ -7208,51 +9271,6 @@ typedef struct _FILE_OLE_STATE_BITS_INFORMATION { ULONG StateBitsMask; } FILE_OLE_STATE_BITS_INFORMATION, *PFILE_OLE_STATE_BITS_INFORMATION; -typedef enum _FSRTL_COMPARISON_RESULT -{ - LessThan = -1, - EqualTo = 0, - GreaterThan = 1 -} FSRTL_COMPARISON_RESULT; - -#if (VER_PRODUCTBUILD >= 2600) - -typedef struct _FSRTL_PER_STREAM_CONTEXT { - LIST_ENTRY Links; - PVOID OwnerId; - PVOID InstanceId; - PFREE_FUNCTION FreeCallback; -} FSRTL_PER_STREAM_CONTEXT, *PFSRTL_PER_STREAM_CONTEXT; - -typedef struct _FSRTL_PER_FILEOBJECT_CONTEXT -{ - LIST_ENTRY Links; - PVOID OwnerId; - PVOID InstanceId; -} FSRTL_PER_FILEOBJECT_CONTEXT, *PFSRTL_PER_FILEOBJECT_CONTEXT; - -#endif /* (VER_PRODUCTBUILD >= 2600) */ - -typedef struct _BASE_MCB -{ - ULONG MaximumPairCount; - ULONG PairCount; - USHORT PoolType; - USHORT Flags; - PVOID Mapping; -} BASE_MCB, *PBASE_MCB; - -typedef struct _LARGE_MCB -{ - PKGUARDED_MUTEX GuardedMutex; - BASE_MCB BaseMcb; -} LARGE_MCB, *PLARGE_MCB; - -typedef struct _MCB -{ - LARGE_MCB DummyFieldThatSizesThisStructureCorrectly; -} MCB, *PMCB; - typedef struct _MAPPING_PAIR { ULONGLONG Vcn; ULONGLONG Lcn; @@ -7264,8 +9282,6 @@ typedef struct _GET_RETRIEVAL_DESCRIPTOR { MAPPING_PAIR Pair[1]; } GET_RETRIEVAL_DESCRIPTOR, *PGET_RETRIEVAL_DESCRIPTOR; -#define ASSERT_QUEUE(Q) ASSERT(((Q)->Header.Type & KOBJECT_TYPE_MASK) == QueueObject); - typedef struct _MBCB { CSHORT NodeTypeCode; CSHORT NodeIsInZone; @@ -7328,189 +9344,6 @@ typedef struct _OBJECT_ALL_TYPES_INFO { OBJECT_TYPE_INFO ObjectsTypeInfo[1]; } OBJECT_ALL_TYPES_INFO, *POBJECT_ALL_TYPES_INFO; -typedef enum _RTL_GENERIC_COMPARE_RESULTS -{ - GenericLessThan, - GenericGreaterThan, - GenericEqual -} RTL_GENERIC_COMPARE_RESULTS; - -typedef enum _TABLE_SEARCH_RESULT -{ - TableEmptyTree, - TableFoundNode, - TableInsertAsLeft, - TableInsertAsRight -} TABLE_SEARCH_RESULT; - -typedef NTSTATUS -(NTAPI *PRTL_AVL_MATCH_FUNCTION)( - struct _RTL_AVL_TABLE *Table, - PVOID UserData, - PVOID MatchData -); - -typedef RTL_GENERIC_COMPARE_RESULTS -(NTAPI *PRTL_AVL_COMPARE_ROUTINE) ( - struct _RTL_AVL_TABLE *Table, - PVOID FirstStruct, - PVOID SecondStruct -); - -typedef RTL_GENERIC_COMPARE_RESULTS -(NTAPI *PRTL_GENERIC_COMPARE_ROUTINE) ( - struct _RTL_GENERIC_TABLE *Table, - PVOID FirstStruct, - PVOID SecondStruct -); - -typedef PVOID -(NTAPI *PRTL_GENERIC_ALLOCATE_ROUTINE) ( - struct _RTL_GENERIC_TABLE *Table, - CLONG ByteSize -); - -typedef VOID -(NTAPI *PRTL_GENERIC_FREE_ROUTINE) ( - struct _RTL_GENERIC_TABLE *Table, - PVOID Buffer -); - -typedef PVOID -(NTAPI *PRTL_AVL_ALLOCATE_ROUTINE) ( - struct _RTL_AVL_TABLE *Table, - CLONG ByteSize -); - -typedef VOID -(NTAPI *PRTL_AVL_FREE_ROUTINE) ( - struct _RTL_AVL_TABLE *Table, - PVOID Buffer -); - -typedef struct _PUBLIC_BCB { - CSHORT NodeTypeCode; - CSHORT NodeByteSize; - ULONG MappedLength; - LARGE_INTEGER MappedFileOffset; -} PUBLIC_BCB, *PPUBLIC_BCB; - -typedef struct _QUERY_PATH_REQUEST { - ULONG PathNameLength; - PIO_SECURITY_CONTEXT SecurityContext; - WCHAR FilePathName[1]; -} QUERY_PATH_REQUEST, *PQUERY_PATH_REQUEST; - -typedef struct _QUERY_PATH_RESPONSE { - ULONG LengthAccepted; -} QUERY_PATH_RESPONSE, *PQUERY_PATH_RESPONSE; - -typedef struct _RTL_BALANCED_LINKS -{ - struct _RTL_BALANCED_LINKS *Parent; - struct _RTL_BALANCED_LINKS *LeftChild; - struct _RTL_BALANCED_LINKS *RightChild; - CHAR Balance; - UCHAR Reserved[3]; -} RTL_BALANCED_LINKS, *PRTL_BALANCED_LINKS; - -typedef struct _RTL_GENERIC_TABLE -{ - PRTL_SPLAY_LINKS TableRoot; - LIST_ENTRY InsertOrderList; - PLIST_ENTRY OrderedPointer; - ULONG WhichOrderedElement; - ULONG NumberGenericTableElements; - PRTL_GENERIC_COMPARE_ROUTINE CompareRoutine; - PRTL_GENERIC_ALLOCATE_ROUTINE AllocateRoutine; - PRTL_GENERIC_FREE_ROUTINE FreeRoutine; - PVOID TableContext; -} RTL_GENERIC_TABLE, *PRTL_GENERIC_TABLE; - -#undef PRTL_GENERIC_COMPARE_ROUTINE -#undef PRTL_GENERIC_ALLOCATE_ROUTINE -#undef PRTL_GENERIC_FREE_ROUTINE -#undef RTL_GENERIC_TABLE -#undef PRTL_GENERIC_TABLE - -#define PRTL_GENERIC_COMPARE_ROUTINE PRTL_AVL_COMPARE_ROUTINE -#define PRTL_GENERIC_ALLOCATE_ROUTINE PRTL_AVL_ALLOCATE_ROUTINE -#define PRTL_GENERIC_FREE_ROUTINE PRTL_AVL_FREE_ROUTINE -#define RTL_GENERIC_TABLE RTL_AVL_TABLE -#define PRTL_GENERIC_TABLE PRTL_AVL_TABLE - -#define RtlInitializeGenericTable RtlInitializeGenericTableAvl -#define RtlInsertElementGenericTable RtlInsertElementGenericTableAvl -#define RtlInsertElementGenericTableFull RtlInsertElementGenericTableFullAvl -#define RtlDeleteElementGenericTable RtlDeleteElementGenericTableAvl -#define RtlLookupElementGenericTable RtlLookupElementGenericTableAvl -#define RtlLookupElementGenericTableFull RtlLookupElementGenericTableFullAvl -#define RtlEnumerateGenericTable RtlEnumerateGenericTableAvl -#define RtlEnumerateGenericTableWithoutSplaying RtlEnumerateGenericTableWithoutSplayingAvl -#define RtlGetElementGenericTable RtlGetElementGenericTableAvl -#define RtlNumberGenericTableElements RtlNumberGenericTableElementsAvl -#define RtlIsGenericTableEmpty RtlIsGenericTableEmptyAvl - -typedef struct _RTL_AVL_TABLE -{ - RTL_BALANCED_LINKS BalancedRoot; - PVOID OrderedPointer; - ULONG WhichOrderedElement; - ULONG NumberGenericTableElements; - ULONG DepthOfTree; - PRTL_BALANCED_LINKS RestartKey; - ULONG DeleteCount; - PRTL_AVL_COMPARE_ROUTINE CompareRoutine; - PRTL_AVL_ALLOCATE_ROUTINE AllocateRoutine; - PRTL_AVL_FREE_ROUTINE FreeRoutine; - PVOID TableContext; -} RTL_AVL_TABLE, *PRTL_AVL_TABLE; - -NTSYSAPI -VOID -NTAPI -RtlInitializeGenericTableAvl( - PRTL_AVL_TABLE Table, - PRTL_AVL_COMPARE_ROUTINE CompareRoutine, - PRTL_AVL_ALLOCATE_ROUTINE AllocateRoutine, - PRTL_AVL_FREE_ROUTINE FreeRoutine, - PVOID TableContext -); - -NTSYSAPI -PVOID -NTAPI -RtlInsertElementGenericTableAvl ( - PRTL_AVL_TABLE Table, - PVOID Buffer, - CLONG BufferSize, - PBOOLEAN NewElement OPTIONAL - ); - -NTSYSAPI -BOOLEAN -NTAPI -RtlDeleteElementGenericTableAvl ( - PRTL_AVL_TABLE Table, - PVOID Buffer - ); - -NTSYSAPI -PVOID -NTAPI -RtlLookupElementGenericTableAvl ( - PRTL_AVL_TABLE Table, - PVOID Buffer - ); - -NTSYSAPI -PVOID -NTAPI -RtlEnumerateGenericTableWithoutSplayingAvl ( - PRTL_AVL_TABLE Table, - PVOID *RestartKey - ); - #if defined(USE_LPC6432) #define LPC_CLIENT_ID CLIENT_ID64 #define LPC_SIZE_T ULONGLONG @@ -7575,13 +9408,6 @@ typedef struct _REMOTE_PORT_VIEW LPC_PVOID ViewBase; } REMOTE_PORT_VIEW, *PREMOTE_PORT_VIEW; -typedef struct _TUNNEL { - FAST_MUTEX Mutex; - PRTL_SPLAY_LINKS Cache; - LIST_ENTRY TimerQueue; - USHORT NumEntries; -} TUNNEL, *PTUNNEL; - typedef struct _VAD_HEADER { PVOID StartVPN; PVOID EndVPN; @@ -7596,150 +9422,6 @@ typedef struct _VAD_HEADER { LIST_ENTRY Secured; } VAD_HEADER, *PVAD_HEADER; -#if (VER_PRODUCTBUILD >= 2600) - -typedef BOOLEAN -(NTAPI *PFILTER_REPORT_CHANGE) ( - IN PVOID NotifyContext, - IN PVOID FilterContext -); - -#endif - -NTKERNELAPI -BOOLEAN -NTAPI -CcCanIWrite ( - IN PFILE_OBJECT FileObject, - IN ULONG BytesToWrite, - IN BOOLEAN Wait, - IN BOOLEAN Retrying -); - -NTKERNELAPI -BOOLEAN -NTAPI -CcCopyRead ( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN BOOLEAN Wait, - OUT PVOID Buffer, - OUT PIO_STATUS_BLOCK IoStatus -); - -NTKERNELAPI -BOOLEAN -NTAPI -CcCopyWrite ( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN BOOLEAN Wait, - IN PVOID Buffer -); - -#define CcCopyWriteWontFlush(FO, FOFF, LEN) ((LEN) <= 0x10000) - -typedef VOID (NTAPI *PCC_POST_DEFERRED_WRITE) ( - IN PVOID Context1, - IN PVOID Context2 -); - -NTKERNELAPI -VOID -NTAPI -CcDeferWrite ( - IN PFILE_OBJECT FileObject, - IN PCC_POST_DEFERRED_WRITE PostRoutine, - IN PVOID Context1, - IN PVOID Context2, - IN ULONG BytesToWrite, - IN BOOLEAN Retrying -); - -NTKERNELAPI -VOID -NTAPI -CcFastCopyRead ( - IN PFILE_OBJECT FileObject, - IN ULONG FileOffset, - IN ULONG Length, - IN ULONG PageCount, - OUT PVOID Buffer, - OUT PIO_STATUS_BLOCK IoStatus -); - -NTKERNELAPI -VOID -NTAPI -CcFastCopyWrite ( - IN PFILE_OBJECT FileObject, - IN ULONG FileOffset, - IN ULONG Length, - IN PVOID Buffer -); - -NTKERNELAPI -VOID -NTAPI -CcFlushCache ( - IN PSECTION_OBJECT_POINTERS SectionObjectPointer, - IN PLARGE_INTEGER FileOffset OPTIONAL, - IN ULONG Length, - OUT PIO_STATUS_BLOCK IoStatus OPTIONAL -); - -typedef VOID (NTAPI *PDIRTY_PAGE_ROUTINE) ( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN PLARGE_INTEGER OldestLsn, - IN PLARGE_INTEGER NewestLsn, - IN PVOID Context1, - IN PVOID Context2 -); - -NTKERNELAPI -LARGE_INTEGER -NTAPI -CcGetDirtyPages ( - IN PVOID LogHandle, - IN PDIRTY_PAGE_ROUTINE DirtyPageRoutine, - IN PVOID Context1, - IN PVOID Context2 -); - -NTKERNELAPI -PFILE_OBJECT -NTAPI -CcGetFileObjectFromBcb ( - IN PVOID Bcb -); - -NTKERNELAPI -PFILE_OBJECT -NTAPI -CcGetFileObjectFromSectionPtrs ( - IN PSECTION_OBJECT_POINTERS SectionObjectPointer -); - -#define CcGetFileSizePointer(FO) ( \ - ((PLARGE_INTEGER)((FO)->SectionObjectPointer->SharedCacheMap) + 1) \ -) - -#if (VER_PRODUCTBUILD >= 2195) - -NTKERNELAPI -LARGE_INTEGER -NTAPI -CcGetFlushedValidData ( - IN PSECTION_OBJECT_POINTERS SectionObjectPointer, - IN BOOLEAN BcbListHeld -); - -#endif /* (VER_PRODUCTBUILD >= 2195) */ - NTKERNELAPI LARGE_INTEGER NTAPI @@ -7748,428 +9430,6 @@ CcGetLsnForFileObject ( OUT PLARGE_INTEGER OldestLsn OPTIONAL ); -typedef BOOLEAN (NTAPI *PACQUIRE_FOR_LAZY_WRITE) ( - IN PVOID Context, - IN BOOLEAN Wait -); - -typedef VOID (NTAPI *PRELEASE_FROM_LAZY_WRITE) ( - IN PVOID Context -); - -typedef BOOLEAN (NTAPI *PACQUIRE_FOR_READ_AHEAD) ( - IN PVOID Context, - IN BOOLEAN Wait -); - -typedef VOID (NTAPI *PRELEASE_FROM_READ_AHEAD) ( - IN PVOID Context -); - -typedef struct _CACHE_MANAGER_CALLBACKS { - PACQUIRE_FOR_LAZY_WRITE AcquireForLazyWrite; - PRELEASE_FROM_LAZY_WRITE ReleaseFromLazyWrite; - PACQUIRE_FOR_READ_AHEAD AcquireForReadAhead; - PRELEASE_FROM_READ_AHEAD ReleaseFromReadAhead; -} CACHE_MANAGER_CALLBACKS, *PCACHE_MANAGER_CALLBACKS; - -NTKERNELAPI -VOID -NTAPI -CcInitializeCacheMap ( - IN PFILE_OBJECT FileObject, - IN PCC_FILE_SIZES FileSizes, - IN BOOLEAN PinAccess, - IN PCACHE_MANAGER_CALLBACKS Callbacks, - IN PVOID LazyWriteContext -); - -#define CcIsFileCached(FO) ( \ - ((FO)->SectionObjectPointer != NULL) && \ - (((PSECTION_OBJECT_POINTERS)(FO)->SectionObjectPointer)->SharedCacheMap != NULL) \ -) - -extern ULONG CcFastMdlReadWait; - -NTKERNELAPI -BOOLEAN -NTAPI -CcIsThereDirtyData ( - IN PVPB Vpb -); - -NTKERNELAPI -BOOLEAN -NTAPI -CcMapData ( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN ULONG Flags, - OUT PVOID *Bcb, - OUT PVOID *Buffer -); - -NTKERNELAPI -VOID -NTAPI -CcMdlRead ( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - OUT PMDL *MdlChain, - OUT PIO_STATUS_BLOCK IoStatus -); - -NTKERNELAPI -VOID -NTAPI -CcMdlReadComplete ( - IN PFILE_OBJECT FileObject, - IN PMDL MdlChain -); - -NTKERNELAPI -VOID -NTAPI -CcMdlWriteComplete ( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN PMDL MdlChain -); - -#define MAP_WAIT 1 - -NTKERNELAPI -BOOLEAN -NTAPI -CcPinMappedData ( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN ULONG Flags, - IN OUT PVOID *Bcb -); - -NTKERNELAPI -BOOLEAN -NTAPI -CcPinRead ( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN ULONG Flags, - OUT PVOID *Bcb, - OUT PVOID *Buffer -); - -NTKERNELAPI -VOID -NTAPI -CcPrepareMdlWrite ( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - OUT PMDL *MdlChain, - OUT PIO_STATUS_BLOCK IoStatus -); - -NTKERNELAPI -BOOLEAN -NTAPI -CcPreparePinWrite ( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN BOOLEAN Zero, - IN ULONG Flags, - OUT PVOID *Bcb, - OUT PVOID *Buffer -); - -NTKERNELAPI -BOOLEAN -NTAPI -CcPurgeCacheSection ( - IN PSECTION_OBJECT_POINTERS SectionObjectPointer, - IN PLARGE_INTEGER FileOffset OPTIONAL, - IN ULONG Length, - IN BOOLEAN UninitializeCacheMaps -); - -#define CcReadAhead(FO, FOFF, LEN) ( \ - if ((LEN) >= 256) { \ - CcScheduleReadAhead((FO), (FOFF), (LEN)); \ - } \ -) - -#if (VER_PRODUCTBUILD >= 2195) - -NTKERNELAPI -PVOID -NTAPI -CcRemapBcb ( - IN PVOID Bcb -); - -#endif /* (VER_PRODUCTBUILD >= 2195) */ - -NTKERNELAPI -VOID -NTAPI -CcRepinBcb ( - IN PVOID Bcb -); - -NTKERNELAPI -VOID -NTAPI -CcScheduleReadAhead ( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length -); - -NTKERNELAPI -VOID -NTAPI -CcSetAdditionalCacheAttributes ( - IN PFILE_OBJECT FileObject, - IN BOOLEAN DisableReadAhead, - IN BOOLEAN DisableWriteBehind -); - -NTKERNELAPI -VOID -NTAPI -CcSetBcbOwnerPointer ( - IN PVOID Bcb, - IN PVOID OwnerPointer -); - -NTKERNELAPI -VOID -NTAPI -CcSetDirtyPageThreshold ( - IN PFILE_OBJECT FileObject, - IN ULONG DirtyPageThreshold -); - -NTKERNELAPI -VOID -NTAPI -CcSetDirtyPinnedData ( - IN PVOID BcbVoid, - IN PLARGE_INTEGER Lsn OPTIONAL -); - -NTKERNELAPI -VOID -NTAPI -CcSetFileSizes ( - IN PFILE_OBJECT FileObject, - IN PCC_FILE_SIZES FileSizes -); - -typedef VOID (NTAPI *PFLUSH_TO_LSN) ( - IN PVOID LogHandle, - IN LARGE_INTEGER Lsn -); - -NTKERNELAPI -VOID -NTAPI -CcSetLogHandleForFile ( - IN PFILE_OBJECT FileObject, - IN PVOID LogHandle, - IN PFLUSH_TO_LSN FlushToLsnRoutine -); - -NTKERNELAPI -VOID -NTAPI -CcSetReadAheadGranularity ( - IN PFILE_OBJECT FileObject, - IN ULONG Granularity /* default: PAGE_SIZE */ - /* allowed: 2^n * PAGE_SIZE */ -); - -NTKERNELAPI -BOOLEAN -NTAPI -CcUninitializeCacheMap ( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER TruncateSize OPTIONAL, - IN PCACHE_UNINITIALIZE_EVENT UninitializeCompleteEvent OPTIONAL -); - -NTKERNELAPI -VOID -NTAPI -CcUnpinData ( - IN PVOID Bcb -); - -NTKERNELAPI -VOID -NTAPI -CcUnpinDataForThread ( - IN PVOID Bcb, - IN ERESOURCE_THREAD ResourceThreadId -); - -NTKERNELAPI -VOID -NTAPI -CcUnpinRepinnedBcb ( - IN PVOID Bcb, - IN BOOLEAN WriteThrough, - OUT PIO_STATUS_BLOCK IoStatus -); - -#if (VER_PRODUCTBUILD >= 2195) - -NTKERNELAPI -NTSTATUS -NTAPI -CcWaitForCurrentLazyWriterActivity ( - VOID -); - -#endif /* (VER_PRODUCTBUILD >= 2195) */ - -NTKERNELAPI -BOOLEAN -NTAPI -CcZeroData ( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER StartOffset, - IN PLARGE_INTEGER EndOffset, - IN BOOLEAN Wait -); - -#if (VER_PRODUCTBUILD >= 2600) - -#ifndef __NTOSKRNL__ -NTKERNELAPI -VOID -FASTCALL -ExInitializeRundownProtection ( - IN PEX_RUNDOWN_REF RunRef -); - -NTKERNELAPI -VOID -FASTCALL -ExReInitializeRundownProtection ( - IN PEX_RUNDOWN_REF RunRef -); - -NTKERNELAPI -BOOLEAN -FASTCALL -ExAcquireRundownProtection ( - IN PEX_RUNDOWN_REF RunRef -); - -NTKERNELAPI -BOOLEAN -FASTCALL -ExAcquireRundownProtectionEx ( - IN PEX_RUNDOWN_REF RunRef, - IN ULONG Count -); - -NTKERNELAPI -VOID -FASTCALL -ExReleaseRundownProtection ( - IN PEX_RUNDOWN_REF RunRef -); - -NTKERNELAPI -VOID -FASTCALL -ExReleaseRundownProtectionEx ( - IN PEX_RUNDOWN_REF RunRef, - IN ULONG Count -); - -NTKERNELAPI -VOID -FASTCALL -ExRundownCompleted ( - IN PEX_RUNDOWN_REF RunRef -); - -NTKERNELAPI -VOID -FASTCALL -ExWaitForRundownProtectionRelease ( - IN PEX_RUNDOWN_REF RunRef -); - -#endif -#endif /* (VER_PRODUCTBUILD >= 2600) */ - - -#define FsRtlSetupAdvancedHeader( _advhdr, _fmutx ) \ -{ \ - SetFlag( (_advhdr)->Flags, FSRTL_FLAG_ADVANCED_HEADER ); \ - SetFlag( (_advhdr)->Flags2, FSRTL_FLAG2_SUPPORTS_FILTER_CONTEXTS ); \ - (_advhdr)->Version = FSRTL_FCB_HEADER_V1; \ - InitializeListHead( &(_advhdr)->FilterContexts ); \ - if ((_fmutx) != NULL) { \ - (_advhdr)->FastMutex = (_fmutx); \ - } \ - *((PULONG_PTR)(&(_advhdr)->PushLock)) = 0; \ - /*ExInitializePushLock( &(_advhdr)->PushLock ); API Not avaliable downlevel*/\ - (_advhdr)->FileContextSupportPointer = NULL; \ -} - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlAddBaseMcbEntry ( - IN PBASE_MCB Mcb, - IN LONGLONG Vbn, - IN LONGLONG Lbn, - IN LONGLONG SectorCount -); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlAddLargeMcbEntry ( - IN PLARGE_MCB Mcb, - IN LONGLONG Vbn, - IN LONGLONG Lbn, - IN LONGLONG SectorCount -); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlAddMcbEntry ( - IN PMCB Mcb, - IN VBN Vbn, - IN LBN Lbn, - IN ULONG SectorCount -); - -NTKERNELAPI -VOID -NTAPI -FsRtlAddToTunnelCache ( - IN PTUNNEL Cache, - IN ULONGLONG DirectoryKey, - IN PUNICODE_STRING ShortName, - IN PUNICODE_STRING LongName, - IN BOOLEAN KeyByShortName, - IN ULONG DataLength, - IN PVOID Data -); - NTKERNELAPI PVOID NTAPI @@ -8204,251 +9464,6 @@ FsRtlAllocatePoolWithTag ( IN ULONG Tag ); -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlAreNamesEqual ( - IN PCUNICODE_STRING Name1, - IN PCUNICODE_STRING Name2, - IN BOOLEAN IgnoreCase, - IN PCWCH UpcaseTable OPTIONAL -); - -#define FsRtlAreThereCurrentFileLocks(FL) ( \ - ((FL)->FastIoIsQuestionable) \ -) - -typedef -VOID -(NTAPI*POPLOCK_WAIT_COMPLETE_ROUTINE) ( - IN PVOID Context, - IN PIRP Irp -); - -typedef -VOID -(NTAPI*POPLOCK_FS_PREPOST_IRP) ( - IN PVOID Context, - IN PIRP Irp -); - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlCheckOplock ( - IN POPLOCK Oplock, - IN PIRP Irp, - IN PVOID Context, - IN POPLOCK_WAIT_COMPLETE_ROUTINE CompletionRoutine OPTIONAL, - IN POPLOCK_FS_PREPOST_IRP PostIrpRoutine OPTIONAL -); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlCurrentBatchOplock ( - IN POPLOCK Oplock -); - -NTKERNELAPI -VOID -NTAPI -FsRtlDeleteKeyFromTunnelCache ( - IN PTUNNEL Cache, - IN ULONGLONG DirectoryKey -); - -NTKERNELAPI -VOID -NTAPI -FsRtlDeleteTunnelCache ( - IN PTUNNEL Cache -); - -NTKERNELAPI -VOID -NTAPI -FsRtlDeregisterUncProvider ( - IN HANDLE Handle -); - -NTKERNELAPI -VOID -NTAPI -FsRtlDissectDbcs ( - IN ANSI_STRING Name, - OUT PANSI_STRING FirstPart, - OUT PANSI_STRING RemainingPart -); - -NTKERNELAPI -VOID -NTAPI -FsRtlDissectName ( - IN UNICODE_STRING Name, - OUT PUNICODE_STRING FirstPart, - OUT PUNICODE_STRING RemainingPart -); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlDoesDbcsContainWildCards ( - IN PANSI_STRING Name -); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlDoesNameContainWildCards ( - IN PUNICODE_STRING Name -); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlIsFatDbcsLegal ( - IN ANSI_STRING DbcsName, - IN BOOLEAN WildCardsPermissible, - IN BOOLEAN PathNamePermissible, - IN BOOLEAN LeadingBackslashPermissible - ); - - -#define FsRtlCompleteRequest(IRP,STATUS) { \ - (IRP)->IoStatus.Status = (STATUS); \ - IoCompleteRequest( (IRP), IO_DISK_INCREMENT ); \ -} - -#define FsRtlEnterFileSystem KeEnterCriticalRegion - -#define FsRtlExitFileSystem KeLeaveCriticalRegion - -#define FsRtlFastLock(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11) ( \ - FsRtlPrivateLock(A1, A2, A3, A4, A5, A6, A7, A8, A9, NULL, A10, A11) \ -) - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlFindInTunnelCache ( - IN PTUNNEL Cache, - IN ULONGLONG DirectoryKey, - IN PUNICODE_STRING Name, - OUT PUNICODE_STRING ShortName, - OUT PUNICODE_STRING LongName, - IN OUT PULONG DataLength, - OUT PVOID Data -); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlGetNextBaseMcbEntry ( - IN PBASE_MCB Mcb, - IN ULONG RunIndex, - OUT PLONGLONG Vbn, - OUT PLONGLONG Lbn, - OUT PLONGLONG SectorCount -); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlGetNextLargeMcbEntry ( - IN PLARGE_MCB Mcb, - IN ULONG RunIndex, - OUT PLONGLONG Vbn, - OUT PLONGLONG Lbn, - OUT PLONGLONG SectorCount -); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlGetNextMcbEntry ( - IN PMCB Mcb, - IN ULONG RunIndex, - OUT PVBN Vbn, - OUT PLBN Lbn, - OUT PULONG SectorCount -); - -#define FsRtlGetPerStreamContextPointer(FO) ( \ - (PFSRTL_ADVANCED_FCB_HEADER)(FO)->FsContext \ -) - -NTKERNELAPI -VOID -NTAPI -FsRtlInitializeBaseMcb ( - IN PBASE_MCB Mcb, - IN POOL_TYPE PoolType -); - -NTKERNELAPI -VOID -NTAPI -FsRtlInitializeLargeMcb ( - IN PLARGE_MCB Mcb, - IN POOL_TYPE PoolType -); - -NTKERNELAPI -VOID -NTAPI -FsRtlInitializeMcb ( - IN PMCB Mcb, - IN POOL_TYPE PoolType -); - -NTKERNELAPI -VOID -NTAPI -FsRtlInitializeOplock ( - IN OUT POPLOCK Oplock -); - -NTKERNELAPI -VOID -NTAPI -FsRtlInitializeTunnelCache ( - IN PTUNNEL Cache -); - -#define FsRtlInitPerStreamContext(PSC, O, I, FC) ( \ - (PSC)->OwnerId = (O), \ - (PSC)->InstanceId = (I), \ - (PSC)->FreeCallback = (FC) \ -) - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlInsertPerStreamContext ( - IN PFSRTL_ADVANCED_FCB_HEADER PerStreamContext, - IN PFSRTL_PER_STREAM_CONTEXT Ptr -); - -#define FsRtlIsAnsiCharacterLegalFat(C, WILD) ( \ - FlagOn(FsRtlLegalAnsiCharacterArray[(UCHAR)(C)], (FSRTL_FAT_LEGAL) | \ - ((WILD) ? FSRTL_WILD_CHARACTER : 0 )) \ -) - -#define FsRtlIsAnsiCharacterLegalHpfs(C, WILD) ( \ - FlagOn(FsRtlLegalAnsiCharacterArray[(UCHAR)(C)], (FSRTL_HPFS_LEGAL) | \ - ((WILD) ? FSRTL_WILD_CHARACTER : 0 )) \ -) - -#define FsRtlIsAnsiCharacterLegalNtfs(C, WILD) ( \ - FlagOn(FsRtlLegalAnsiCharacterArray[(UCHAR)(C)], (FSRTL_NTFS_LEGAL) | \ - ((WILD) ? FSRTL_WILD_CHARACTER : 0 )) \ -) - -#define FsRtlIsAnsiCharacterWild(C) ( \ - FlagOn(FsRtlLegalAnsiCharacterArray[(UCHAR)(C)], FSRTL_WILD_CHARACTER ) \ -) - NTKERNELAPI BOOLEAN NTAPI @@ -8459,142 +9474,6 @@ FsRtlIsFatDbcsLegal ( IN BOOLEAN LeadingBackslashPermissible ); -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlIsHpfsDbcsLegal ( - IN ANSI_STRING DbcsName, - IN BOOLEAN WildCardsPermissible, - IN BOOLEAN PathNamePermissible, - IN BOOLEAN LeadingBackslashPermissible -); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlIsNameInExpression ( - IN PUNICODE_STRING Expression, - IN PUNICODE_STRING Name, - IN BOOLEAN IgnoreCase, - IN PWCHAR UpcaseTable OPTIONAL -); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlIsNtstatusExpected ( - IN NTSTATUS Ntstatus -); - -#define NLS_OEM_LEAD_BYTE_INFO NlsOemLeadByteInfo - -extern PUSHORT NlsOemLeadByteInfo; - -#define FsRtlIsLeadDbcsCharacter(DBCS_CHAR) ( \ - (BOOLEAN)((UCHAR)(DBCS_CHAR) < 0x80 ? FALSE : \ - (NLS_MB_CODE_PAGE_TAG && \ - (NLS_OEM_LEAD_BYTE_INFO[(UCHAR)(DBCS_CHAR)] != 0))) \ -) - -#define FsRtlIsUnicodeCharacterWild(C) ( \ - (((C) >= 0x40) ? \ - FALSE : \ - FlagOn(FsRtlLegalAnsiCharacterArray[(C)], FSRTL_WILD_CHARACTER )) \ -) - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlLookupBaseMcbEntry ( - IN PBASE_MCB Mcb, - IN LONGLONG Vbn, - OUT PLONGLONG Lbn OPTIONAL, - OUT PLONGLONG SectorCountFromLbn OPTIONAL, - OUT PLONGLONG StartingLbn OPTIONAL, - OUT PLONGLONG SectorCountFromStartingLbn OPTIONAL, - OUT PULONG Index OPTIONAL -); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlLookupLargeMcbEntry ( - IN PLARGE_MCB Mcb, - IN LONGLONG Vbn, - OUT PLONGLONG Lbn OPTIONAL, - OUT PLONGLONG SectorCountFromLbn OPTIONAL, - OUT PLONGLONG StartingLbn OPTIONAL, - OUT PLONGLONG SectorCountFromStartingLbn OPTIONAL, - OUT PULONG Index OPTIONAL -); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlLookupLastBaseMcbEntry ( - IN PBASE_MCB Mcb, - OUT PLONGLONG Vbn, - OUT PLONGLONG Lbn -); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlLookupLastLargeMcbEntry ( - IN PLARGE_MCB Mcb, - OUT PLONGLONG Vbn, - OUT PLONGLONG Lbn -); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlLookupLastMcbEntry ( - IN PMCB Mcb, - OUT PVBN Vbn, - OUT PLBN Lbn -); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlLookupLastBaseMcbEntryAndIndex ( - IN PBASE_MCB OpaqueMcb, - IN OUT PLONGLONG LargeVbn, - IN OUT PLONGLONG LargeLbn, - IN OUT PULONG Index -); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlLookupLastLargeMcbEntryAndIndex ( - IN PLARGE_MCB OpaqueMcb, - OUT PLONGLONG LargeVbn, - OUT PLONGLONG LargeLbn, - OUT PULONG Index -); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlLookupMcbEntry ( - IN PMCB Mcb, - IN VBN Vbn, - OUT PLBN Lbn, - OUT PULONG SectorCount OPTIONAL, - OUT PULONG Index -); - -NTKERNELAPI -PFSRTL_PER_STREAM_CONTEXT -NTAPI -FsRtlLookupPerStreamContextInternal ( - IN PFSRTL_ADVANCED_FCB_HEADER StreamContext, - IN PVOID OwnerId OPTIONAL, - IN PVOID InstanceId OPTIONAL -); - NTKERNELAPI BOOLEAN NTAPI @@ -8612,14 +9491,6 @@ FsRtlMdlWriteComplete ( IN PMDL MdlChain ); -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlNormalizeNtstatus ( - IN NTSTATUS Exception, - IN NTSTATUS GenericException -); - NTKERNELAPI VOID NTAPI @@ -8633,306 +9504,6 @@ FsRtlNotifyChangeDirectory ( IN PIRP NotifyIrp ); -NTKERNELAPI -VOID -NTAPI -FsRtlNotifyCleanup ( - IN PNOTIFY_SYNC NotifySync, - IN PLIST_ENTRY NotifyList, - IN PVOID FsContext -); - -typedef BOOLEAN (NTAPI *PCHECK_FOR_TRAVERSE_ACCESS) ( - IN PVOID NotifyContext, - IN PVOID TargetContext, - IN PSECURITY_SUBJECT_CONTEXT SubjectContext -); - -NTKERNELAPI -VOID -NTAPI -FsRtlNotifyFilterChangeDirectory ( - IN PNOTIFY_SYNC NotifySync, - IN PLIST_ENTRY NotifyList, - IN PVOID FsContext, - IN PSTRING FullDirectoryName, - IN BOOLEAN WatchTree, - IN BOOLEAN IgnoreBuffer, - IN ULONG CompletionFilter, - IN PIRP NotifyIrp, - IN PCHECK_FOR_TRAVERSE_ACCESS TraverseCallback OPTIONAL, - IN PSECURITY_SUBJECT_CONTEXT SubjectContext OPTIONAL, - IN PFILTER_REPORT_CHANGE FilterCallback OPTIONAL); - -NTKERNELAPI -VOID -NTAPI -FsRtlNotifyFilterReportChange ( - IN PNOTIFY_SYNC NotifySync, - IN PLIST_ENTRY NotifyList, - IN PSTRING FullTargetName, - IN USHORT TargetNameOffset, - IN PSTRING StreamName OPTIONAL, - IN PSTRING NormalizedParentName OPTIONAL, - IN ULONG FilterMatch, - IN ULONG Action, - IN PVOID TargetContext, - IN PVOID FilterContext); - -NTKERNELAPI -VOID -NTAPI -FsRtlNotifyFullChangeDirectory ( - IN PNOTIFY_SYNC NotifySync, - IN PLIST_ENTRY NotifyList, - IN PVOID FsContext, - IN PSTRING FullDirectoryName, - IN BOOLEAN WatchTree, - IN BOOLEAN IgnoreBuffer, - IN ULONG CompletionFilter, - IN PIRP NotifyIrp, - IN PCHECK_FOR_TRAVERSE_ACCESS TraverseCallback OPTIONAL, - IN PSECURITY_SUBJECT_CONTEXT SubjectContext OPTIONAL -); - -NTKERNELAPI -VOID -NTAPI -FsRtlNotifyFullReportChange ( - IN PNOTIFY_SYNC NotifySync, - IN PLIST_ENTRY NotifyList, - IN PSTRING FullTargetName, - IN USHORT TargetNameOffset, - IN PSTRING StreamName OPTIONAL, - IN PSTRING NormalizedParentName OPTIONAL, - IN ULONG FilterMatch, - IN ULONG Action, - IN PVOID TargetContext -); - -NTKERNELAPI -VOID -NTAPI -FsRtlNotifyInitializeSync ( - IN PNOTIFY_SYNC *NotifySync -); - -NTKERNELAPI -VOID -NTAPI -FsRtlNotifyUninitializeSync ( - IN PNOTIFY_SYNC *NotifySync -); - -#if (VER_PRODUCTBUILD >= 2195) - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlNotifyVolumeEvent ( - IN PFILE_OBJECT FileObject, - IN ULONG EventCode -); - -#endif /* (VER_PRODUCTBUILD >= 2195) */ - -NTKERNELAPI -ULONG -NTAPI -FsRtlNumberOfRunsInBaseMcb ( - IN PBASE_MCB Mcb -); - -NTKERNELAPI -ULONG -NTAPI -FsRtlNumberOfRunsInLargeMcb ( - IN PLARGE_MCB Mcb -); - -NTKERNELAPI -ULONG -NTAPI -FsRtlNumberOfRunsInMcb ( - IN PMCB Mcb -); - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlOplockFsctrl ( - IN POPLOCK Oplock, - IN PIRP Irp, - IN ULONG OpenCount -); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlOplockIsFastIoPossible ( - IN POPLOCK Oplock -); - -typedef VOID -(NTAPI *PFSRTL_STACK_OVERFLOW_ROUTINE) ( - IN PVOID Context, - IN PKEVENT Event -); - -NTKERNELAPI -VOID -NTAPI -FsRtlPostPagingFileStackOverflow ( - IN PVOID Context, - IN PKEVENT Event, - IN PFSRTL_STACK_OVERFLOW_ROUTINE StackOverflowRoutine -); - -NTKERNELAPI -VOID -NTAPI -FsRtlPostStackOverflow ( - IN PVOID Context, - IN PKEVENT Event, - IN PFSRTL_STACK_OVERFLOW_ROUTINE StackOverflowRoutine -); - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlRegisterUncProvider ( - IN OUT PHANDLE MupHandle, - IN PUNICODE_STRING RedirectorDeviceName, - IN BOOLEAN MailslotsSupported -); - -NTKERNELAPI -VOID -NTAPI -FsRtlRemoveBaseMcbEntry ( - IN PBASE_MCB Mcb, - IN LONGLONG Vbn, - IN LONGLONG SectorCount -); - -NTKERNELAPI -VOID -NTAPI -FsRtlRemoveLargeMcbEntry ( - IN PLARGE_MCB Mcb, - IN LONGLONG Vbn, - IN LONGLONG SectorCount -); - -NTKERNELAPI -VOID -NTAPI -FsRtlRemoveMcbEntry ( - IN PMCB Mcb, - IN VBN Vbn, - IN ULONG SectorCount -); - -NTKERNELAPI -PFSRTL_PER_STREAM_CONTEXT -NTAPI -FsRtlRemovePerStreamContext ( - IN PFSRTL_ADVANCED_FCB_HEADER StreamContext, - IN PVOID OwnerId OPTIONAL, - IN PVOID InstanceId OPTIONAL -); - -NTKERNELAPI -VOID -NTAPI -FsRtlResetBaseMcb ( - IN PBASE_MCB Mcb -); - -NTKERNELAPI -VOID -NTAPI -FsRtlResetLargeMcb ( - IN PLARGE_MCB Mcb, - IN BOOLEAN SelfSynchronized -); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlSplitBaseMcb ( - IN PBASE_MCB Mcb, - IN LONGLONG Vbn, - IN LONGLONG Amount -); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlSplitLargeMcb ( - IN PLARGE_MCB Mcb, - IN LONGLONG Vbn, - IN LONGLONG Amount -); - -#define FsRtlSupportsPerStreamContexts(FO) ( \ - (BOOLEAN)((NULL != FsRtlGetPerStreamContextPointer(FO) && \ - FlagOn(FsRtlGetPerStreamContextPointer(FO)->Flags2, \ - FSRTL_FLAG2_SUPPORTS_FILTER_CONTEXTS)) \ -) - -NTKERNELAPI -VOID -NTAPI -FsRtlTruncateBaseMcb ( - IN PBASE_MCB Mcb, - IN LONGLONG Vbn -); - -NTKERNELAPI -VOID -NTAPI -FsRtlTruncateLargeMcb ( - IN PLARGE_MCB Mcb, - IN LONGLONG Vbn -); - -NTKERNELAPI -VOID -NTAPI -FsRtlTruncateMcb ( - IN PMCB Mcb, - IN VBN Vbn -); - -NTKERNELAPI -VOID -NTAPI -FsRtlUninitializeBaseMcb ( - IN PBASE_MCB Mcb -); - -NTKERNELAPI -VOID -NTAPI -FsRtlUninitializeLargeMcb ( - IN PLARGE_MCB Mcb -); - -NTKERNELAPI -VOID -NTAPI -FsRtlUninitializeMcb ( - IN PMCB Mcb -); - -NTKERNELAPI -VOID -NTAPI -FsRtlUninitializeOplock ( - IN OUT POPLOCK Oplock -); - NTKERNELAPI NTSTATUS NTAPI @@ -8969,23 +9540,6 @@ ObReferenceObjectByName ( OUT PVOID *Object ); -#if (NTDDI_VERSION >= NTDDI_WIN2K) - -NTKERNELAPI -NTSTATUS -NTAPI -PsAssignImpersonationToken( - IN PETHREAD Thread, - IN HANDLE Token OPTIONAL); - -NTKERNELAPI -HANDLE -NTAPI -PsReferencePrimaryToken( - IN OUT PEPROCESS Process); - -#endif - #define PsDereferenceImpersonationToken(T) \ {if (ARGUMENT_PRESENT(T)) { \ (ObDereferenceObject((T))); \ @@ -9003,14 +9557,6 @@ PsLookupProcessThreadByCid ( OUT PETHREAD *Thread ); -NTSYSAPI -VOID -NTAPI -RtlSecondsSince1970ToTime ( - IN ULONG SecondsSince1970, - OUT PLARGE_INTEGER Time -); - NTSYSAPI NTSTATUS NTAPI @@ -9021,105 +9567,6 @@ RtlSetSaclSecurityDescriptor ( IN BOOLEAN SaclDefaulted ); -NTSYSAPI -NTSTATUS -NTAPI -RtlUnicodeStringToCountedOemString ( - IN OUT POEM_STRING DestinationString, - IN PCUNICODE_STRING SourceString, - IN BOOLEAN AllocateDestinationString -); - -/* RTL Splay Tree Functions */ -NTSYSAPI -PRTL_SPLAY_LINKS -NTAPI -RtlSplay(PRTL_SPLAY_LINKS Links); - -NTSYSAPI -PRTL_SPLAY_LINKS -NTAPI -RtlDelete(PRTL_SPLAY_LINKS Links); - -NTSYSAPI -VOID -NTAPI -RtlDeleteNoSplay( - PRTL_SPLAY_LINKS Links, - PRTL_SPLAY_LINKS *Root -); - -NTSYSAPI -PRTL_SPLAY_LINKS -NTAPI -RtlSubtreeSuccessor(PRTL_SPLAY_LINKS Links); - -NTSYSAPI -PRTL_SPLAY_LINKS -NTAPI -RtlSubtreePredecessor(PRTL_SPLAY_LINKS Links); - -NTSYSAPI -PRTL_SPLAY_LINKS -NTAPI -RtlRealSuccessor(PRTL_SPLAY_LINKS Links); - -NTSYSAPI -PRTL_SPLAY_LINKS -NTAPI -RtlRealPredecessor(PRTL_SPLAY_LINKS Links); - -#define RtlIsLeftChild(Links) \ - (RtlLeftChild(RtlParent(Links)) == (PRTL_SPLAY_LINKS)(Links)) - -#define RtlIsRightChild(Links) \ - (RtlRightChild(RtlParent(Links)) == (PRTL_SPLAY_LINKS)(Links)) - -#define RtlRightChild(Links) \ - ((PRTL_SPLAY_LINKS)(Links))->RightChild - -#define RtlIsRoot(Links) \ - (RtlParent(Links) == (PRTL_SPLAY_LINKS)(Links)) - -#define RtlLeftChild(Links) \ - ((PRTL_SPLAY_LINKS)(Links))->LeftChild - -#define RtlParent(Links) \ - ((PRTL_SPLAY_LINKS)(Links))->Parent - -#define RtlInitializeSplayLinks(Links) \ - { \ - PRTL_SPLAY_LINKS _SplayLinks; \ - _SplayLinks = (PRTL_SPLAY_LINKS)(Links); \ - _SplayLinks->Parent = _SplayLinks; \ - _SplayLinks->LeftChild = NULL; \ - _SplayLinks->RightChild = NULL; \ - } - -#define RtlInsertAsLeftChild(ParentLinks,ChildLinks) \ - { \ - PRTL_SPLAY_LINKS _SplayParent; \ - PRTL_SPLAY_LINKS _SplayChild; \ - _SplayParent = (PRTL_SPLAY_LINKS)(ParentLinks); \ - _SplayChild = (PRTL_SPLAY_LINKS)(ChildLinks); \ - _SplayParent->LeftChild = _SplayChild; \ - _SplayChild->Parent = _SplayParent; \ - } - -#define RtlInsertAsRightChild(ParentLinks,ChildLinks) \ - { \ - PRTL_SPLAY_LINKS _SplayParent; \ - PRTL_SPLAY_LINKS _SplayChild; \ - _SplayParent = (PRTL_SPLAY_LINKS)(ParentLinks); \ - _SplayChild = (PRTL_SPLAY_LINKS)(ChildLinks); \ - _SplayParent->RightChild = _SplayChild; \ - _SplayChild->Parent = _SplayParent; \ - } - -// -// RTL time functions -// - #define SeEnableAccessToExports() SeExports = *(PSE_EXPORTS *)SeExports; #if (VER_PRODUCTBUILD >= 2195) @@ -9145,18 +9592,6 @@ ZwAlertThread ( IN HANDLE ThreadHandle ); -NTSYSAPI -NTSTATUS -NTAPI -ZwAllocateVirtualMemory ( - IN HANDLE ProcessHandle, - IN OUT PVOID *BaseAddress, - IN ULONG_PTR ZeroBits, - IN OUT PSIZE_T RegionSize, - IN ULONG AllocationType, - IN ULONG Protect -); - NTSYSAPI NTSTATUS NTAPI @@ -9202,19 +9637,6 @@ ZwCloseObjectAuditAlarm ( IN BOOLEAN GenerateOnClose ); -NTSYSAPI -NTSTATUS -NTAPI -ZwCreateSection ( - OUT PHANDLE SectionHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, - IN PLARGE_INTEGER MaximumSize OPTIONAL, - IN ULONG SectionPageProtection, - IN ULONG AllocationAttributes, - IN HANDLE FileHandle OPTIONAL -); - NTSYSAPI NTSTATUS NTAPI @@ -9225,71 +9647,6 @@ ZwCreateSymbolicLinkObject ( IN PUNICODE_STRING TargetName ); -NTSYSAPI -NTSTATUS -NTAPI -ZwDeleteFile ( - IN POBJECT_ATTRIBUTES ObjectAttributes -); - -NTSYSAPI -NTSTATUS -NTAPI -ZwDeleteValueKey ( - IN HANDLE Handle, - IN PUNICODE_STRING Name -); - - -#if (NTDDI_VERSION >= NTDDI_WIN2K) -NTSYSAPI -NTSTATUS -NTAPI -ZwDeviceIoControlFile ( - IN HANDLE FileHandle, - IN HANDLE Event OPTIONAL, - IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, - IN PVOID ApcContext OPTIONAL, - OUT PIO_STATUS_BLOCK IoStatusBlock, - IN ULONG IoControlCode, - IN PVOID InputBuffer OPTIONAL, - IN ULONG InputBufferLength, - OUT PVOID OutputBuffer OPTIONAL, - IN ULONG OutputBufferLength); -#endif - -NTSYSAPI -NTSTATUS -NTAPI -ZwDisplayString ( - IN PUNICODE_STRING String -); - -NTSYSAPI -NTSTATUS -NTAPI -ZwDuplicateObject ( - IN HANDLE SourceProcessHandle, - IN HANDLE SourceHandle, - IN HANDLE TargetProcessHandle OPTIONAL, - OUT PHANDLE TargetHandle OPTIONAL, - IN ACCESS_MASK DesiredAccess, - IN ULONG HandleAttributes, - IN ULONG Options -); - -NTSYSAPI -NTSTATUS -NTAPI -ZwDuplicateToken ( - IN HANDLE ExistingTokenHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes, - IN BOOLEAN EffectiveOnly, - IN TOKEN_TYPE TokenType, - OUT PHANDLE NewTokenHandle -); - NTSYSAPI NTSTATUS NTAPI @@ -9309,46 +9666,6 @@ ZwFlushBuffersFile( #if (VER_PRODUCTBUILD >= 2195) -NTSYSAPI -NTSTATUS -NTAPI -ZwFlushVirtualMemory ( - IN HANDLE ProcessHandle, - IN OUT PVOID *BaseAddress, - IN OUT PULONG FlushSize, - OUT PIO_STATUS_BLOCK IoStatusBlock -); - -#endif /* (VER_PRODUCTBUILD >= 2195) */ - -NTSYSAPI -NTSTATUS -NTAPI -ZwFreeVirtualMemory ( - IN HANDLE ProcessHandle, - IN OUT PVOID *BaseAddress, - IN OUT PSIZE_T RegionSize, - IN ULONG FreeType -); - -NTSYSAPI -NTSTATUS -NTAPI -ZwFsControlFile ( - IN HANDLE FileHandle, - IN HANDLE Event OPTIONAL, - IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, - IN PVOID ApcContext OPTIONAL, - OUT PIO_STATUS_BLOCK IoStatusBlock, - IN ULONG FsControlCode, - IN PVOID InputBuffer OPTIONAL, - IN ULONG InputBufferLength, - OUT PVOID OutputBuffer OPTIONAL, - IN ULONG OutputBufferLength -); - -#if (VER_PRODUCTBUILD >= 2195) - NTSYSAPI NTSTATUS NTAPI @@ -9361,14 +9678,6 @@ ZwInitiatePowerAction ( #endif /* (VER_PRODUCTBUILD >= 2195) */ -NTSYSAPI -NTSTATUS -NTAPI -ZwLoadDriver ( - /* "\\Registry\\Machine\\System\\CurrentControlSet\\Services\\" */ - IN PUNICODE_STRING RegistryPath -); - NTSYSAPI NTSTATUS NTAPI @@ -9377,41 +9686,6 @@ ZwLoadKey ( IN POBJECT_ATTRIBUTES FileObjectAttributes ); -NTSYSAPI -NTSTATUS -NTAPI -ZwNotifyChangeKey ( - IN HANDLE KeyHandle, - IN HANDLE EventHandle OPTIONAL, - IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, - IN PVOID ApcContext OPTIONAL, - OUT PIO_STATUS_BLOCK IoStatusBlock, - IN ULONG NotifyFilter, - IN BOOLEAN WatchSubtree, - IN PVOID Buffer, - IN ULONG BufferLength, - IN BOOLEAN Asynchronous -); - -NTSYSAPI -NTSTATUS -NTAPI -ZwOpenDirectoryObject ( - OUT PHANDLE DirectoryHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes -); - -NTSYSAPI -NTSTATUS -NTAPI -ZwOpenProcess ( - OUT PHANDLE ProcessHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes, - IN PCLIENT_ID ClientId OPTIONAL -); - NTSYSAPI NTSTATUS NTAPI @@ -9441,21 +9715,6 @@ ZwOpenThreadToken ( OUT PHANDLE TokenHandle ); -#if (VER_PRODUCTBUILD >= 2195) - -NTSYSAPI -NTSTATUS -NTAPI -ZwPowerInformation ( - IN POWER_INFORMATION_LEVEL PowerInformationLevel, - IN PVOID InputBuffer OPTIONAL, - IN ULONG InputBufferLength, - OUT PVOID OutputBuffer OPTIONAL, - IN ULONG OutputBufferLength -); - -#endif /* (VER_PRODUCTBUILD >= 2195) */ - NTSYSAPI NTSTATUS NTAPI @@ -9472,23 +9731,6 @@ ZwQueryDefaultLocale ( OUT PLCID Locale ); -NTSYSAPI -NTSTATUS -NTAPI -ZwQueryDirectoryFile ( - IN HANDLE FileHandle, - IN HANDLE Event OPTIONAL, - IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, - IN PVOID ApcContext OPTIONAL, - OUT PIO_STATUS_BLOCK IoStatusBlock, - OUT PVOID FileInformation, - IN ULONG Length, - IN FILE_INFORMATION_CLASS FileInformationClass, - IN BOOLEAN ReturnSingleEntry, - IN PUNICODE_STRING FileName OPTIONAL, - IN BOOLEAN RestartScan -); - #if (VER_PRODUCTBUILD >= 2195) NTSYSAPI @@ -9504,21 +9746,6 @@ ZwQueryDirectoryObject ( OUT PULONG ReturnLength OPTIONAL ); -NTSYSAPI -NTSTATUS -NTAPI -ZwQueryEaFile ( - IN HANDLE FileHandle, - OUT PIO_STATUS_BLOCK IoStatusBlock, - OUT PVOID Buffer, - IN ULONG Length, - IN BOOLEAN ReturnSingleEntry, - IN PVOID EaList OPTIONAL, - IN ULONG EaListLength, - IN PULONG EaIndex OPTIONAL, - IN BOOLEAN RestartScan -); - #endif /* (VER_PRODUCTBUILD >= 2195) */ NTSYSAPI @@ -9532,39 +9759,6 @@ ZwQueryInformationProcess ( OUT PULONG ReturnLength OPTIONAL ); -NTSYSAPI -NTSTATUS -NTAPI -ZwQueryInformationToken ( - IN HANDLE TokenHandle, - IN TOKEN_INFORMATION_CLASS TokenInformationClass, - OUT PVOID TokenInformation, - IN ULONG Length, - OUT PULONG ResultLength -); - -NTSYSAPI -NTSTATUS -NTAPI -ZwQuerySecurityObject ( - IN HANDLE FileHandle, - IN SECURITY_INFORMATION SecurityInformation, - OUT PSECURITY_DESCRIPTOR SecurityDescriptor, - IN ULONG Length, - OUT PULONG ResultLength -); - -NTSYSAPI -NTSTATUS -NTAPI -ZwQueryVolumeInformationFile ( - IN HANDLE FileHandle, - OUT PIO_STATUS_BLOCK IoStatusBlock, - OUT PVOID FsInformation, - IN ULONG Length, - IN FS_INFORMATION_CLASS FsInformationClass -); - NTSYSAPI NTSTATUS NTAPI @@ -9620,26 +9814,8 @@ ZwSetDefaultUILanguage ( IN LANGID LanguageId ); -NTSYSAPI -NTSTATUS -NTAPI -ZwSetEaFile ( - IN HANDLE FileHandle, - OUT PIO_STATUS_BLOCK IoStatusBlock, - OUT PVOID Buffer, - IN ULONG Length -); - #endif /* (VER_PRODUCTBUILD >= 2195) */ -NTSYSAPI -NTSTATUS -NTAPI -ZwSetEvent ( - IN HANDLE EventHandle, - OUT PLONG PreviousState OPTIONAL -); - NTSYSAPI NTSTATUS NTAPI @@ -9650,19 +9826,6 @@ ZwSetInformationProcess ( IN ULONG ProcessInformationLength ); -#if (VER_PRODUCTBUILD >= 2195) - -NTSYSAPI -NTSTATUS -NTAPI -ZwSetSecurityObject ( - IN HANDLE Handle, - IN SECURITY_INFORMATION SecurityInformation, - IN PSECURITY_DESCRIPTOR SecurityDescriptor -); - -#endif /* (VER_PRODUCTBUILD >= 2195) */ - NTSYSAPI NTSTATUS NTAPI @@ -9671,37 +9834,6 @@ ZwSetSystemTime ( OUT PLARGE_INTEGER OldTime OPTIONAL ); -#if (VER_PRODUCTBUILD >= 2195) - -NTSYSAPI -NTSTATUS -NTAPI -ZwSetVolumeInformationFile ( - IN HANDLE FileHandle, - OUT PIO_STATUS_BLOCK IoStatusBlock, - IN PVOID FsInformation, - IN ULONG Length, - IN FS_INFORMATION_CLASS FsInformationClass -); - -#endif /* (VER_PRODUCTBUILD >= 2195) */ - -NTSYSAPI -NTSTATUS -NTAPI -ZwTerminateProcess ( - IN HANDLE ProcessHandle OPTIONAL, - IN NTSTATUS ExitStatus -); - -NTSYSAPI -NTSTATUS -NTAPI -ZwUnloadDriver ( - /* "\\Registry\\Machine\\System\\CurrentControlSet\\Services\\" */ - IN PUNICODE_STRING RegistryPath -); - NTSYSAPI NTSTATUS NTAPI @@ -9709,16 +9841,6 @@ ZwUnloadKey ( IN POBJECT_ATTRIBUTES KeyObjectAttributes ); -#if (NTDDI_VERSION >= NTDDI_WIN2K) -NTSYSAPI -NTSTATUS -NTAPI -ZwWaitForSingleObject ( - IN HANDLE Handle, - IN BOOLEAN Alertable, - IN PLARGE_INTEGER Timeout OPTIONAL); -#endif - NTSYSAPI NTSTATUS NTAPI From 0cb69766f39bdb2d73c163b52c113b5761f2c50f Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Tue, 20 Apr 2010 08:30:10 +0000 Subject: [PATCH 012/131] - Sync comdlg32, crypt32, gdiplus, hhctrl.ocx to Wine-1.1.43. svn path=/trunk/; revision=46955 --- reactos/dll/win32/comdlg32/filedlg.c | 16 +- reactos/dll/win32/comdlg32/fontdlg.c | 12 +- reactos/dll/win32/comdlg32/printdlg.c | 8 +- reactos/dll/win32/crypt32/decode.c | 4 +- reactos/dll/win32/gdiplus/brush.c | 12 +- reactos/dll/win32/gdiplus/font.c | 24 +- reactos/dll/win32/gdiplus/gdiplus.spec | 2 +- reactos/dll/win32/gdiplus/gdiplus_private.h | 24 + reactos/dll/win32/gdiplus/graphics.c | 986 +++++++++++++------- reactos/dll/win32/gdiplus/image.c | 209 ++++- reactos/dll/win32/hhctrl.ocx/hhctrl.c | 2 +- reactos/include/psdk/gdiplusflat.h | 3 +- 12 files changed, 926 insertions(+), 376 deletions(-) diff --git a/reactos/dll/win32/comdlg32/filedlg.c b/reactos/dll/win32/comdlg32/filedlg.c index 58b57ccbbac..64cb3935ab2 100644 --- a/reactos/dll/win32/comdlg32/filedlg.c +++ b/reactos/dll/win32/comdlg32/filedlg.c @@ -176,7 +176,7 @@ static SIZE MemDialogSize = { 0, 0}; /* keep size of the (resizable) dialog */ /* Internal functions used by the dialog */ static LRESULT FILEDLG95_ResizeControls(HWND hwnd, WPARAM wParam, LPARAM lParam); static LRESULT FILEDLG95_FillControls(HWND hwnd, WPARAM wParam, LPARAM lParam); -static LRESULT FILEDLG95_OnWMCommand(HWND hwnd, WPARAM wParam, LPARAM lParam); +static LRESULT FILEDLG95_OnWMCommand(HWND hwnd, WPARAM wParam); static LRESULT FILEDLG95_OnWMGetIShellBrowser(HWND hwnd); static BOOL FILEDLG95_OnOpen(HWND hwnd); static LRESULT FILEDLG95_InitControls(HWND hwnd); @@ -240,7 +240,7 @@ static BOOL GetFileName95(FileOpenDlgInfos *fodInfos) { LRESULT lRes; - LPCVOID template; + LPVOID template; HRSRC hRes; HANDLE hDlgTmpl = 0; HRESULT hr; @@ -991,7 +991,7 @@ static LRESULT FILEDLG95_OnWMGetMMI( HWND hwnd, LPMINMAXINFO mmiptr) * vertically or horizontally to get out of the way. Only the "grip" * is moved in both directions to stay in the corner. */ -static LRESULT FILEDLG95_OnWMSize(HWND hwnd, WPARAM wParam, LPARAM lParam) +static LRESULT FILEDLG95_OnWMSize(HWND hwnd, WPARAM wParam) { RECT rc, rcview; int chgx, chgy; @@ -1223,11 +1223,11 @@ INT_PTR CALLBACK FileOpenDlgProc95(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM l return 0; } case WM_SIZE: - return FILEDLG95_OnWMSize(hwnd, wParam, lParam); + return FILEDLG95_OnWMSize(hwnd, wParam); case WM_GETMINMAXINFO: return FILEDLG95_OnWMGetMMI( hwnd, (LPMINMAXINFO)lParam); case WM_COMMAND: - return FILEDLG95_OnWMCommand(hwnd, wParam, lParam); + return FILEDLG95_OnWMCommand(hwnd, wParam); case WM_DRAWITEM: { switch(((LPDRAWITEMSTRUCT)lParam)->CtlID) @@ -1733,7 +1733,7 @@ void FILEDLG95_Clean(HWND hwnd) * * WM_COMMAND message handler */ -static LRESULT FILEDLG95_OnWMCommand(HWND hwnd, WPARAM wParam, LPARAM lParam) +static LRESULT FILEDLG95_OnWMCommand(HWND hwnd, WPARAM wParam) { WORD wNotifyCode = HIWORD(wParam); /* notification code */ WORD wID = LOWORD(wParam); /* item, control, or accelerator identifier */ @@ -3799,7 +3799,7 @@ BOOL FD32_GetTemplate(PFD31_DATA lfs) /*********************************************************************** * FD32_WMMeasureItem [internal] */ -static LONG FD32_WMMeasureItem(HWND hWnd, WPARAM wParam, LPARAM lParam) +static LONG FD32_WMMeasureItem(LPARAM lParam) { LPMEASUREITEMSTRUCT lpmeasure; @@ -3832,7 +3832,7 @@ static INT_PTR CALLBACK FD32_FileOpenDlgProc(HWND hWnd, UINT wMsg, return FD31_WMInitDialog(hWnd, wParam, lParam); case WM_MEASUREITEM: - return FD32_WMMeasureItem(hWnd, wParam, lParam); + return FD32_WMMeasureItem(lParam); case WM_DRAWITEM: return FD31_WMDrawItem(hWnd, wParam, lParam, !lfs->open, (DRAWITEMSTRUCT *)lParam); diff --git a/reactos/dll/win32/comdlg32/fontdlg.c b/reactos/dll/win32/comdlg32/fontdlg.c index 1ad881c72d2..80f1ad9345b 100644 --- a/reactos/dll/win32/comdlg32/fontdlg.c +++ b/reactos/dll/win32/comdlg32/fontdlg.c @@ -766,7 +766,7 @@ static LRESULT CFn_WMInitDialog(HWND hDlg, LPARAM lParam, LPCHOOSEFONTW lpcf) /*********************************************************************** * CFn_WMMeasureItem [internal] */ -static LRESULT CFn_WMMeasureItem(HWND hDlg, WPARAM wParam, LPARAM lParam) +static LRESULT CFn_WMMeasureItem(HWND hDlg, LPARAM lParam) { HDC hdc; HFONT hfontprev; @@ -794,7 +794,7 @@ static LRESULT CFn_WMMeasureItem(HWND hDlg, WPARAM wParam, LPARAM lParam) /*********************************************************************** * CFn_WMDrawItem [internal] */ -static LRESULT CFn_WMDrawItem(HWND hDlg, WPARAM wParam, LPARAM lParam) +static LRESULT CFn_WMDrawItem(LPARAM lParam) { HBRUSH hBrush; WCHAR buffer[40]; @@ -1190,9 +1190,9 @@ static INT_PTR CALLBACK FormatCharDlgProcA(HWND hDlg, UINT uMsg, WPARAM wParam, switch (uMsg) { case WM_MEASUREITEM: - return CFn_WMMeasureItem(hDlg, wParam, lParam); + return CFn_WMMeasureItem(hDlg,lParam); case WM_DRAWITEM: - return CFn_WMDrawItem(hDlg, wParam, lParam); + return CFn_WMDrawItem(lParam); case WM_COMMAND: return CFn_WMCommand(hDlg, wParam, lParam, lpcfw); case WM_DESTROY: @@ -1239,9 +1239,9 @@ static INT_PTR CALLBACK FormatCharDlgProcW(HWND hDlg, UINT uMsg, WPARAM wParam, switch (uMsg) { case WM_MEASUREITEM: - return CFn_WMMeasureItem(hDlg, wParam, lParam); + return CFn_WMMeasureItem(hDlg, lParam); case WM_DRAWITEM: - return CFn_WMDrawItem(hDlg, wParam, lParam); + return CFn_WMDrawItem(lParam); case WM_COMMAND: return CFn_WMCommand(hDlg, wParam, lParam, lpcf); case WM_DESTROY: diff --git a/reactos/dll/win32/comdlg32/printdlg.c b/reactos/dll/win32/comdlg32/printdlg.c index f653251ed16..74a06ffa3d5 100644 --- a/reactos/dll/win32/comdlg32/printdlg.c +++ b/reactos/dll/win32/comdlg32/printdlg.c @@ -1504,7 +1504,7 @@ static LRESULT PRINTDLG_WMInitDialogW(HWND hDlg, * PRINTDLG_WMCommand [internal] */ static LRESULT PRINTDLG_WMCommandA(HWND hDlg, WPARAM wParam, - LPARAM lParam, PRINT_PTRA* PrintStructures) + PRINT_PTRA* PrintStructures) { LPPRINTDLGA lppd = PrintStructures->lpPrintDlg; UINT PrinterComboID = (lppd->Flags & PD_PRINTSETUP) ? cmb1 : cmb4; @@ -1658,7 +1658,7 @@ static LRESULT PRINTDLG_WMCommandA(HWND hDlg, WPARAM wParam, } static LRESULT PRINTDLG_WMCommandW(HWND hDlg, WPARAM wParam, - LPARAM lParam, PRINT_PTRW* PrintStructures) + PRINT_PTRW* PrintStructures) { LPPRINTDLGW lppd = PrintStructures->lpPrintDlg; UINT PrinterComboID = (lppd->Flags & PD_PRINTSETUP) ? cmb1 : cmb4; @@ -1846,7 +1846,7 @@ static INT_PTR CALLBACK PrintDlgProcA(HWND hDlg, UINT uMsg, WPARAM wParam, switch (uMsg) { case WM_COMMAND: - return PRINTDLG_WMCommandA(hDlg, wParam, lParam, PrintStructures); + return PRINTDLG_WMCommandA(hDlg, wParam, PrintStructures); case WM_DESTROY: DestroyIcon(PrintStructures->hCollateIcon); @@ -1892,7 +1892,7 @@ static INT_PTR CALLBACK PrintDlgProcW(HWND hDlg, UINT uMsg, WPARAM wParam, switch (uMsg) { case WM_COMMAND: - return PRINTDLG_WMCommandW(hDlg, wParam, lParam, PrintStructures); + return PRINTDLG_WMCommandW(hDlg, wParam, PrintStructures); case WM_DESTROY: DestroyIcon(PrintStructures->hCollateIcon); diff --git a/reactos/dll/win32/crypt32/decode.c b/reactos/dll/win32/crypt32/decode.c index fb3d36e8124..655a5b2c5d6 100644 --- a/reactos/dll/win32/crypt32/decode.c +++ b/reactos/dll/win32/crypt32/decode.c @@ -523,9 +523,11 @@ static BOOL CRYPT_AsnDecodeSequence(struct AsnDecodeSequenceItem items[], for (i = 0; i < cItem; i++) { - bytesNeeded += items[i].size; + if (items[i].size > items[i].minSize) + bytesNeeded += items[i].size - items[i].minSize; structSize = max( structSize, items[i].offset + items[i].minSize ); } + bytesNeeded += structSize; if (pcbDecoded) *pcbDecoded = 1 + lenBytes + cbDecoded; if (!pvStructInfo) diff --git a/reactos/dll/win32/gdiplus/brush.c b/reactos/dll/win32/gdiplus/brush.c index 2d28004c95d..67be6b49836 100644 --- a/reactos/dll/win32/gdiplus/brush.c +++ b/reactos/dll/win32/gdiplus/brush.c @@ -1194,6 +1194,16 @@ GpStatus WINGDIPAPI GdipGetPathGradientSurroundColorsWithCount(GpPathGradient return NotImplemented; } +GpStatus WINGDIPAPI GdipGetPathGradientSurroundColorCount(GpPathGradient *brush, INT *count) +{ + TRACE("(%p, %p)\n", brush, count); + + if (!brush || !count) + return InvalidParameter; + + return NotImplemented; +} + GpStatus WINGDIPAPI GdipGetPathGradientWrapMode(GpPathGradient *brush, GpWrapMode *wrapmode) { @@ -1559,7 +1569,7 @@ GpStatus WINGDIPAPI GdipSetPathGradientSigmaBlend(GpPathGradient *grad, } GpStatus WINGDIPAPI GdipSetPathGradientSurroundColorsWithCount(GpPathGradient - *grad, ARGB *argb, INT *count) + *grad, GDIPCONST ARGB *argb, INT *count) { static int calls; diff --git a/reactos/dll/win32/gdiplus/font.c b/reactos/dll/win32/gdiplus/font.c index fda5428a7dd..3a29771c710 100644 --- a/reactos/dll/win32/gdiplus/font.c +++ b/reactos/dll/win32/gdiplus/font.c @@ -489,6 +489,7 @@ GpStatus WINGDIPAPI GdipGetFontHeightGivenDPI(GDIPCONST GpFont *font, REAL dpi, switch (font->unit) { case UnitPixel: + case UnitWorld: *height = font_height; break; case UnitPoint: @@ -520,7 +521,7 @@ GpStatus WINGDIPAPI GdipGetFontHeightGivenDPI(GDIPCONST GpFont *font, REAL dpi, static INT CALLBACK is_font_installed_proc(const LOGFONTW *elf, const TEXTMETRICW *ntm, DWORD type, LPARAM lParam) { - if (!ntm) + if (!ntm || type == RASTER_FONTTYPE) { return 1; } @@ -642,12 +643,14 @@ GpStatus WINGDIPAPI GdipCloneFontFamily(GpFontFamily* FontFamily, GpFontFamily** GpStatus WINGDIPAPI GdipGetFamilyName (GDIPCONST GpFontFamily *family, WCHAR *name, LANGID language) { + static int lang_fixme; + if (family == NULL) return InvalidParameter; TRACE("%p, %p, %d\n", family, name, language); - if (language != LANG_NEUTRAL) + if (language != LANG_NEUTRAL && !lang_fixme++) FIXME("No support for handling of multiple languages!\n"); lstrcpynW (name, family->FamilyName, LF_FACESIZE); @@ -826,15 +829,21 @@ GpStatus WINGDIPAPI GdipGetGenericFontFamilySerif(GpFontFamily **nativeFamily) */ GpStatus WINGDIPAPI GdipGetGenericFontFamilySansSerif(GpFontFamily **nativeFamily) { - /* FIXME: On Windows this is called Microsoft Sans Serif, this shouldn't - * affect anything */ - static const WCHAR MSSansSerif[] = {'M','S',' ','S','a','n','s',' ','S','e','r','i','f','\0'}; + GpStatus stat; + static const WCHAR MicrosoftSansSerif[] = {'M','i','c','r','o','s','o','f','t',' ','S','a','n','s',' ','S','e','r','i','f','\0'}; + static const WCHAR Tahoma[] = {'T','a','h','o','m','a','\0'}; TRACE("(%p)\n", nativeFamily); if (nativeFamily == NULL) return InvalidParameter; - return GdipCreateFontFamilyFromName(MSSansSerif, NULL, nativeFamily); + stat = GdipCreateFontFamilyFromName(MicrosoftSansSerif, NULL, nativeFamily); + + if (stat == FontFamilyNotFound) + /* FIXME: Microsoft Sans Serif is not installed on Wine. */ + stat = GdipCreateFontFamilyFromName(Tahoma, NULL, nativeFamily); + + return stat; } /***************************************************************************** @@ -957,6 +966,9 @@ static INT CALLBACK add_font_proc(const LOGFONTW *lfw, const TEXTMETRICW *ntm, GpFontCollection* fonts = (GpFontCollection*)lParam; int i; + if (type == RASTER_FONTTYPE) + return 1; + /* skip duplicates */ for (i=0; icount; i++) if (strcmpiW(lfw->lfFaceName, fonts->FontFamilies[i]->FamilyName) == 0) diff --git a/reactos/dll/win32/gdiplus/gdiplus.spec b/reactos/dll/win32/gdiplus/gdiplus.spec index e6cea5ad443..14e7fbff4a8 100644 --- a/reactos/dll/win32/gdiplus/gdiplus.spec +++ b/reactos/dll/win32/gdiplus/gdiplus.spec @@ -338,7 +338,7 @@ @ stub GdipGetPathGradientPresetBlendCount @ stdcall GdipGetPathGradientRect(ptr ptr) @ stdcall GdipGetPathGradientRectI(ptr ptr) -@ stub GdipGetPathGradientSurroundColorCount +@ stdcall GdipGetPathGradientSurroundColorCount(ptr ptr) @ stdcall GdipGetPathGradientSurroundColorsWithCount(ptr ptr ptr) @ stub GdipGetPathGradientTransform @ stdcall GdipGetPathGradientWrapMode(ptr ptr) diff --git a/reactos/dll/win32/gdiplus/gdiplus_private.h b/reactos/dll/win32/gdiplus/gdiplus_private.h index ca1cba6175c..5ff71255b9d 100644 --- a/reactos/dll/win32/gdiplus/gdiplus_private.h +++ b/reactos/dll/win32/gdiplus/gdiplus_private.h @@ -78,6 +78,29 @@ static inline REAL deg2rad(REAL degrees) return M_PI * degrees / 180.0; } +static inline ARGB color_over(ARGB bg, ARGB fg) +{ + BYTE b, g, r, a; + BYTE bg_alpha, fg_alpha; + + fg_alpha = (fg>>24)&0xff; + + if (fg_alpha == 0xff) return fg; + + if (fg_alpha == 0) return bg; + + bg_alpha = (((bg>>24)&0xff) * (0xff-fg_alpha)) / 0xff; + + if (bg_alpha == 0) return fg; + + a = bg_alpha + fg_alpha; + b = ((bg&0xff)*bg_alpha + (fg&0xff)*fg_alpha)*0xff/a; + g = (((bg>>8)&0xff)*bg_alpha + ((fg>>8)&0xff)*fg_alpha)*0xff/a; + r = (((bg>>16)&0xff)*bg_alpha + ((fg>>16)&0xff)*fg_alpha)*0xff/a; + + return (a<<24)|(r<<16)|(g<<8)|b; +} + extern const char *debugstr_rectf(CONST RectF* rc); extern const char *debugstr_pointf(CONST PointF* pt); @@ -112,6 +135,7 @@ struct GpGraphics{ HDC hdc; HWND hwnd; BOOL owndc; + GpImage *image; SmoothingMode smoothing; CompositingQuality compqual; InterpolationMode interpolation; diff --git a/reactos/dll/win32/gdiplus/graphics.c b/reactos/dll/win32/gdiplus/graphics.c index 1fd870e3d42..7a6fad301c9 100644 --- a/reactos/dll/win32/gdiplus/graphics.c +++ b/reactos/dll/win32/gdiplus/graphics.c @@ -173,6 +173,74 @@ static void transform_and_round_points(GpGraphics *graphics, POINT *pti, } } +/* Draw non-premultiplied ARGB data to the given graphics object */ +static GpStatus alpha_blend_pixels(GpGraphics *graphics, INT dst_x, INT dst_y, + const BYTE *src, INT src_width, INT src_height, INT src_stride) +{ + if (graphics->image && graphics->image->type == ImageTypeBitmap) + { + GpBitmap *dst_bitmap = (GpBitmap*)graphics->image; + INT x, y; + + for (x=0; xhdc, dst_x, dst_y, src_width, src_height, + hdc, 0, 0, src_width, src_height, bf); + + SelectObject(hdc, old_hbm); + DeleteDC(hdc); + DeleteObject(hbitmap); + + return Ok; + } +} + static ARGB blend_colors(ARGB start, ARGB end, REAL position) { ARGB result=0; @@ -1273,10 +1341,10 @@ GpStatus WINGDIPAPI GdipCreateMetafileFromWmf(HMETAFILE hwmf, BOOL delete, (*metafile)->bounds.X = ((REAL) placeable->BoundingBox.Left) / ((REAL) placeable->Inch); (*metafile)->bounds.Y = ((REAL) placeable->BoundingBox.Top) / ((REAL) placeable->Inch); (*metafile)->bounds.Width = ((REAL) (placeable->BoundingBox.Right - - placeable->BoundingBox.Left)) / ((REAL) placeable->Inch); + - placeable->BoundingBox.Left)); (*metafile)->bounds.Height = ((REAL) (placeable->BoundingBox.Bottom - - placeable->BoundingBox.Top)) / ((REAL) placeable->Inch); - (*metafile)->unit = UnitInch; + - placeable->BoundingBox.Top)); + (*metafile)->unit = UnitPixel; if(delete) DeleteMetaFile(hwmf); @@ -1866,15 +1934,15 @@ GpStatus WINGDIPAPI GdipDrawImagePointsI(GpGraphics *graphics, GpImage *image, return NotImplemented; } -/* FIXME: partially implemented (only works for rectangular parallelograms) */ GpStatus WINGDIPAPI GdipDrawImagePointsRect(GpGraphics *graphics, GpImage *image, GDIPCONST GpPointF *points, INT count, REAL srcx, REAL srcy, REAL srcwidth, REAL srcheight, GpUnit srcUnit, GDIPCONST GpImageAttributes* imageAttributes, DrawImageAbort callback, VOID * callbackData) { - GpPointF ptf[3]; - POINT pti[3]; + GpPointF ptf[4]; + POINT pti[4]; REAL dx, dy; + GpStatus stat; TRACE("(%p, %p, %p, %d, %f, %f, %f, %f, %d, %p, %p, %p)\n", graphics, image, points, count, srcx, srcy, srcwidth, srcheight, srcUnit, imageAttributes, callback, @@ -1887,10 +1955,13 @@ GpStatus WINGDIPAPI GdipDrawImagePointsRect(GpGraphics *graphics, GpImage *image debugstr_pointf(&points[2])); memcpy(ptf, points, 3 * sizeof(GpPointF)); - transform_and_round_points(graphics, pti, ptf, 3); + ptf[3].X = ptf[2].X + ptf[1].X - ptf[0].X; + ptf[3].Y = ptf[2].Y + ptf[1].Y - ptf[0].Y; + transform_and_round_points(graphics, pti, ptf, 4); if (image->picture) { + /* FIXME: partially implemented (only works for rectangular parallelograms) */ if(srcUnit == UnitInch) dx = dy = (REAL) INCH_HIMETRIC; else if(srcUnit == UnitPixel){ @@ -1914,10 +1985,8 @@ GpStatus WINGDIPAPI GdipDrawImagePointsRect(GpGraphics *graphics, GpImage *image } else if (image->type == ImageTypeBitmap && ((GpBitmap*)image)->hbitmap) { - HDC hdc; GpBitmap* bitmap = (GpBitmap*)image; - int temp_hdc=0, temp_bitmap=0; - HBITMAP hbitmap, old_hbm=NULL; + int use_software=0; if (srcUnit == UnitInch) dx = dy = 96.0; /* FIXME: use the image resolution */ @@ -1926,83 +1995,233 @@ GpStatus WINGDIPAPI GdipDrawImagePointsRect(GpGraphics *graphics, GpImage *image else return NotImplemented; - if (!(bitmap->format == PixelFormat16bppRGB555 || - bitmap->format == PixelFormat24bppRGB || - bitmap->format == PixelFormat32bppRGB || - bitmap->format == PixelFormat32bppPARGB)) + if (imageAttributes || + (graphics->image && graphics->image->type == ImageTypeBitmap) || + ptf[1].Y != ptf[0].Y || ptf[2].X != ptf[0].X) + use_software = 1; + + if (use_software) { - BITMAPINFOHEADER bih; - BYTE *temp_bits; - PixelFormat dst_format; + RECT src_area, dst_area; + int i, x, y, stride; + GpMatrix *dst_to_src; + REAL m11, m12, m21, m22, mdx, mdy; + LPBYTE data; - /* we can't draw a bitmap of this format directly */ - hdc = CreateCompatibleDC(0); - temp_hdc = 1; - temp_bitmap = 1; + src_area.left = srcx*dx; + src_area.top = srcy*dy; + src_area.right = (srcx+srcwidth)*dx; + src_area.bottom = (srcy+srcheight)*dy; - bih.biSize = sizeof(BITMAPINFOHEADER); - bih.biWidth = bitmap->width; - bih.biHeight = -bitmap->height; - bih.biPlanes = 1; - bih.biBitCount = 32; - bih.biCompression = BI_RGB; - bih.biSizeImage = 0; - bih.biXPelsPerMeter = 0; - bih.biYPelsPerMeter = 0; - bih.biClrUsed = 0; - bih.biClrImportant = 0; + dst_area.left = dst_area.right = pti[0].x; + dst_area.top = dst_area.bottom = pti[0].y; + for (i=1; i<4; i++) + { + if (dst_area.left > pti[i].x) dst_area.left = pti[i].x; + if (dst_area.right < pti[i].x) dst_area.right = pti[i].x; + if (dst_area.top > pti[i].y) dst_area.top = pti[i].y; + if (dst_area.bottom < pti[i].y) dst_area.bottom = pti[i].y; + } - hbitmap = CreateDIBSection(hdc, (BITMAPINFO*)&bih, DIB_RGB_COLORS, - (void**)&temp_bits, NULL, 0); + m11 = (ptf[1].X - ptf[0].X) / srcwidth; + m21 = (ptf[2].X - ptf[0].X) / srcheight; + mdx = ptf[0].X - m11 * srcx - m21 * srcy; + m12 = (ptf[1].Y - ptf[0].Y) / srcwidth; + m22 = (ptf[2].Y - ptf[0].Y) / srcheight; + mdy = ptf[0].Y - m12 * srcx - m22 * srcy; + + stat = GdipCreateMatrix2(m11, m12, m21, m22, mdx, mdy, &dst_to_src); + if (stat != Ok) return stat; + + stat = GdipInvertMatrix(dst_to_src); + if (stat != Ok) + { + GdipDeleteMatrix(dst_to_src); + return stat; + } + + data = GdipAlloc(sizeof(ARGB) * (dst_area.right - dst_area.left) * (dst_area.bottom - dst_area.top)); + if (!data) + { + GdipDeleteMatrix(dst_to_src); + return OutOfMemory; + } + + stride = sizeof(ARGB) * (dst_area.right - dst_area.left); + + for (x=dst_area.left; x= src_area.right || + src_y < src_area.top || src_y >= src_area.bottom) + /* FIXME: Use wrapmode */ + *src_color = 0; + else + GdipBitmapGetPixel(bitmap, src_x, src_y, src_color); + } + } + + GdipDeleteMatrix(dst_to_src); + + if (imageAttributes) + { + if (imageAttributes->colorkeys[ColorAdjustTypeBitmap].enabled || + imageAttributes->colorkeys[ColorAdjustTypeDefault].enabled) + { + static int fixme; + if (!fixme++) + FIXME("Color keying not implemented\n"); + } + + if (imageAttributes->colorremaptables[ColorAdjustTypeBitmap].enabled || + imageAttributes->colorremaptables[ColorAdjustTypeDefault].enabled) + { + const struct color_remap_table *table; + + if (imageAttributes->colorremaptables[ColorAdjustTypeBitmap].enabled) + table = &imageAttributes->colorremaptables[ColorAdjustTypeBitmap]; + else + table = &imageAttributes->colorremaptables[ColorAdjustTypeDefault]; + + for (x=dst_area.left; xmapsize; i++) + { + if (*src_color == table->colormap[i].oldColor.Argb) + { + *src_color = table->colormap[i].newColor.Argb; + break; + } + } + } + } + + if (imageAttributes->colormatrices[ColorAdjustTypeBitmap].enabled || + imageAttributes->colormatrices[ColorAdjustTypeDefault].enabled) + { + static int fixme; + if (!fixme++) + FIXME("Color transforms not implemented\n"); + } + + if (imageAttributes->gamma_enabled[ColorAdjustTypeBitmap] || + imageAttributes->gamma_enabled[ColorAdjustTypeDefault]) + { + static int fixme; + if (!fixme++) + FIXME("Gamma adjustment not implemented\n"); + } + } + + stat = alpha_blend_pixels(graphics, dst_area.left, dst_area.top, + data, dst_area.right - dst_area.left, dst_area.bottom - dst_area.top, stride); + + GdipFree(data); + + return stat; + } + else + { + HDC hdc; + int temp_hdc=0, temp_bitmap=0; + HBITMAP hbitmap, old_hbm=NULL; + + if (!(bitmap->format == PixelFormat16bppRGB555 || + bitmap->format == PixelFormat24bppRGB || + bitmap->format == PixelFormat32bppRGB || + bitmap->format == PixelFormat32bppPARGB)) + { + BITMAPINFOHEADER bih; + BYTE *temp_bits; + PixelFormat dst_format; + + /* we can't draw a bitmap of this format directly */ + hdc = CreateCompatibleDC(0); + temp_hdc = 1; + temp_bitmap = 1; + + bih.biSize = sizeof(BITMAPINFOHEADER); + bih.biWidth = bitmap->width; + bih.biHeight = -bitmap->height; + bih.biPlanes = 1; + bih.biBitCount = 32; + bih.biCompression = BI_RGB; + bih.biSizeImage = 0; + bih.biXPelsPerMeter = 0; + bih.biYPelsPerMeter = 0; + bih.biClrUsed = 0; + bih.biClrImportant = 0; + + hbitmap = CreateDIBSection(hdc, (BITMAPINFO*)&bih, DIB_RGB_COLORS, + (void**)&temp_bits, NULL, 0); + + if (bitmap->format & (PixelFormatAlpha|PixelFormatPAlpha)) + dst_format = PixelFormat32bppPARGB; + else + dst_format = PixelFormat32bppRGB; + + convert_pixels(bitmap->width, bitmap->height, + bitmap->width*4, temp_bits, dst_format, + bitmap->stride, bitmap->bits, bitmap->format, bitmap->image.palette_entries); + } + else + { + hbitmap = bitmap->hbitmap; + hdc = bitmap->hdc; + temp_hdc = (hdc == 0); + } + + if (temp_hdc) + { + if (!hdc) hdc = CreateCompatibleDC(0); + old_hbm = SelectObject(hdc, hbitmap); + } if (bitmap->format & (PixelFormatAlpha|PixelFormatPAlpha)) - dst_format = PixelFormat32bppPARGB; + { + BLENDFUNCTION bf; + + bf.BlendOp = AC_SRC_OVER; + bf.BlendFlags = 0; + bf.SourceConstantAlpha = 255; + bf.AlphaFormat = AC_SRC_ALPHA; + + GdiAlphaBlend(graphics->hdc, pti[0].x, pti[0].y, pti[1].x-pti[0].x, pti[2].y-pti[0].y, + hdc, srcx*dx, srcy*dy, srcwidth*dx, srcheight*dy, bf); + } else - dst_format = PixelFormat32bppRGB; + { + StretchBlt(graphics->hdc, pti[0].x, pti[0].y, pti[1].x-pti[0].x, pti[2].y-pti[0].y, + hdc, srcx*dx, srcy*dy, srcwidth*dx, srcheight*dy, SRCCOPY); + } - convert_pixels(bitmap->width, bitmap->height, - bitmap->width*4, temp_bits, dst_format, - bitmap->stride, bitmap->bits, bitmap->format, bitmap->image.palette_entries); + if (temp_hdc) + { + SelectObject(hdc, old_hbm); + DeleteDC(hdc); + } + + if (temp_bitmap) + DeleteObject(hbitmap); } - else - { - hbitmap = bitmap->hbitmap; - hdc = bitmap->hdc; - temp_hdc = (hdc == 0); - } - - if (temp_hdc) - { - if (!hdc) hdc = CreateCompatibleDC(0); - old_hbm = SelectObject(hdc, hbitmap); - } - - if (bitmap->format & (PixelFormatAlpha|PixelFormatPAlpha)) - { - BLENDFUNCTION bf; - - bf.BlendOp = AC_SRC_OVER; - bf.BlendFlags = 0; - bf.SourceConstantAlpha = 255; - bf.AlphaFormat = AC_SRC_ALPHA; - - GdiAlphaBlend(graphics->hdc, pti[0].x, pti[0].y, pti[1].x-pti[0].x, pti[2].y-pti[0].y, - hdc, srcx*dx, srcy*dy, srcwidth*dx, srcheight*dy, bf); - } - else - { - StretchBlt(graphics->hdc, pti[0].x, pti[0].y, pti[1].x-pti[0].x, pti[2].y-pti[0].y, - hdc, srcx*dx, srcy*dy, srcwidth*dx, srcheight*dy, SRCCOPY); - } - - if (temp_hdc) - { - SelectObject(hdc, old_hbm); - DeleteDC(hdc); - } - - if (temp_bitmap) - DeleteObject(hbitmap); } else { @@ -2403,208 +2622,6 @@ GpStatus WINGDIPAPI GdipDrawRectanglesI(GpGraphics *graphics, GpPen *pen, return ret; } -GpStatus WINGDIPAPI GdipDrawString(GpGraphics *graphics, GDIPCONST WCHAR *string, - INT length, GDIPCONST GpFont *font, GDIPCONST RectF *rect, - GDIPCONST GpStringFormat *format, GDIPCONST GpBrush *brush) -{ - HRGN rgn = NULL; - HFONT gdifont; - LOGFONTW lfw; - TEXTMETRICW textmet; - GpPointF pt[3], rectcpy[4]; - POINT corners[4]; - WCHAR* stringdup; - REAL angle, ang_cos, ang_sin, rel_width, rel_height; - INT sum = 0, height = 0, offsety = 0, fit, fitcpy, save_state, i, j, lret, nwidth, - nheight, lineend; - SIZE size; - POINT drawbase; - UINT drawflags; - RECT drawcoord; - - TRACE("(%p, %s, %i, %p, %s, %p, %p)\n", graphics, debugstr_wn(string, length), - length, font, debugstr_rectf(rect), format, brush); - - if(!graphics || !string || !font || !brush || !rect) - return InvalidParameter; - - if((brush->bt != BrushTypeSolidColor)){ - FIXME("not implemented for given parameters\n"); - return NotImplemented; - } - - if(format){ - TRACE("may be ignoring some format flags: attr %x\n", format->attr); - - /* Should be no need to explicitly test for StringAlignmentNear as - * that is default behavior if no alignment is passed. */ - if(format->vertalign != StringAlignmentNear){ - RectF bounds; - GdipMeasureString(graphics, string, length, font, rect, format, &bounds, 0, 0); - - if(format->vertalign == StringAlignmentCenter) - offsety = (rect->Height - bounds.Height) / 2; - else if(format->vertalign == StringAlignmentFar) - offsety = (rect->Height - bounds.Height); - } - } - - if(length == -1) length = lstrlenW(string); - - stringdup = GdipAlloc(length * sizeof(WCHAR)); - if(!stringdup) return OutOfMemory; - - save_state = SaveDC(graphics->hdc); - SetBkMode(graphics->hdc, TRANSPARENT); - SetTextColor(graphics->hdc, brush->lb.lbColor); - - pt[0].X = 0.0; - pt[0].Y = 0.0; - pt[1].X = 1.0; - pt[1].Y = 0.0; - pt[2].X = 0.0; - pt[2].Y = 1.0; - GdipTransformPoints(graphics, CoordinateSpaceDevice, CoordinateSpaceWorld, pt, 3); - angle = -gdiplus_atan2((pt[1].Y - pt[0].Y), (pt[1].X - pt[0].X)); - ang_cos = cos(angle); - ang_sin = sin(angle); - rel_width = sqrt((pt[1].Y-pt[0].Y)*(pt[1].Y-pt[0].Y)+ - (pt[1].X-pt[0].X)*(pt[1].X-pt[0].X)); - rel_height = sqrt((pt[2].Y-pt[0].Y)*(pt[2].Y-pt[0].Y)+ - (pt[2].X-pt[0].X)*(pt[2].X-pt[0].X)); - - rectcpy[3].X = rectcpy[0].X = rect->X; - rectcpy[1].Y = rectcpy[0].Y = rect->Y + offsety; - rectcpy[2].X = rectcpy[1].X = rect->X + rect->Width; - rectcpy[3].Y = rectcpy[2].Y = rect->Y + offsety + rect->Height; - transform_and_round_points(graphics, corners, rectcpy, 4); - - if (roundr(rect->Width) == 0) - nwidth = INT_MAX; - else - nwidth = roundr(rel_width * rect->Width); - - if (roundr(rect->Height) == 0) - nheight = INT_MAX; - else - nheight = roundr(rel_height * rect->Height); - - if (roundr(rect->Width) != 0 && roundr(rect->Height) != 0) - { - /* FIXME: If only the width or only the height is 0, we should probably still clip */ - rgn = CreatePolygonRgn(corners, 4, ALTERNATE); - SelectClipRgn(graphics->hdc, rgn); - } - - /* Use gdi to find the font, then perform transformations on it (height, - * width, angle). */ - SelectObject(graphics->hdc, CreateFontIndirectW(&font->lfw)); - GetTextMetricsW(graphics->hdc, &textmet); - lfw = font->lfw; - - lfw.lfHeight = roundr(((REAL)lfw.lfHeight) * rel_height); - lfw.lfWidth = roundr(textmet.tmAveCharWidth * rel_width); - - lfw.lfEscapement = lfw.lfOrientation = roundr((angle / M_PI) * 1800.0); - - gdifont = CreateFontIndirectW(&lfw); - DeleteObject(SelectObject(graphics->hdc, CreateFontIndirectW(&lfw))); - - for(i = 0, j = 0; i < length; i++){ - if(!isprintW(string[i]) && (string[i] != '\n')) - continue; - - stringdup[j] = string[i]; - j++; - } - - length = j; - - if (!format || format->align == StringAlignmentNear) - { - drawbase.x = corners[0].x; - drawbase.y = corners[0].y; - drawflags = DT_NOCLIP | DT_EXPANDTABS; - } - else if (format->align == StringAlignmentCenter) - { - drawbase.x = (corners[0].x + corners[1].x)/2; - drawbase.y = (corners[0].y + corners[1].y)/2; - drawflags = DT_NOCLIP | DT_EXPANDTABS | DT_CENTER; - } - else /* (format->align == StringAlignmentFar) */ - { - drawbase.x = corners[1].x; - drawbase.y = corners[1].y; - drawflags = DT_NOCLIP | DT_EXPANDTABS | DT_RIGHT; - } - - while(sum < length){ - drawcoord.left = drawcoord.right = drawbase.x + roundr(ang_sin * (REAL) height); - drawcoord.top = drawcoord.bottom = drawbase.y + roundr(ang_cos * (REAL) height); - - GetTextExtentExPointW(graphics->hdc, stringdup + sum, length - sum, - nwidth, &fit, NULL, &size); - fitcpy = fit; - - if(fit == 0){ - DrawTextW(graphics->hdc, stringdup + sum, 1, &drawcoord, drawflags); - break; - } - - for(lret = 0; lret < fit; lret++) - if(*(stringdup + sum + lret) == '\n') - break; - - /* Line break code (may look strange, but it imitates windows). */ - if(lret < fit) - lineend = fit = lret; /* this is not an off-by-one error */ - else if(fit < (length - sum)){ - if(*(stringdup + sum + fit) == ' ') - while(*(stringdup + sum + fit) == ' ') - fit++; - else - while(*(stringdup + sum + fit - 1) != ' '){ - fit--; - - if(*(stringdup + sum + fit) == '\t') - break; - - if(fit == 0){ - fit = fitcpy; - break; - } - } - lineend = fit; - while(*(stringdup + sum + lineend - 1) == ' ' || - *(stringdup + sum + lineend - 1) == '\t') - lineend--; - } - else - lineend = fit; - DrawTextW(graphics->hdc, stringdup + sum, min(length - sum, lineend), - &drawcoord, drawflags); - - sum += fit + (lret < fitcpy ? 1 : 0); - height += size.cy; - - if(height > nheight) - break; - - /* Stop if this was a linewrap (but not if it was a linebreak). */ - if((lret == fitcpy) && format && (format->attr & StringFormatFlagsNoWrap)) - break; - } - - GdipFree(stringdup); - DeleteObject(rgn); - DeleteObject(gdifont); - - RestoreDC(graphics->hdc, save_state); - - return Ok; -} - GpStatus WINGDIPAPI GdipFillClosedCurve2(GpGraphics *graphics, GpBrush *brush, GDIPCONST GpPointF *points, INT count, REAL tension, GpFillMode fill) { @@ -3074,8 +3091,6 @@ GpStatus WINGDIPAPI GdipFillRegion(GpGraphics* graphics, GpBrush* brush, GpStatus WINGDIPAPI GdipFlush(GpGraphics *graphics, GpFlushIntention intention) { - static int calls; - TRACE("(%p,%u)\n", graphics, intention); if(!graphics) @@ -3084,10 +3099,12 @@ GpStatus WINGDIPAPI GdipFlush(GpGraphics *graphics, GpFlushIntention intention) if(graphics->busy) return ObjectBusy; - if(!(calls++)) - FIXME("not implemented\n"); + /* We have no internal operation queue, so there's no need to clear it. */ - return NotImplemented; + if (graphics->hdc) + GdiFlush(); + + return Ok; } /***************************************************************************** @@ -3465,61 +3482,37 @@ GpStatus WINGDIPAPI GdipIsVisibleRectI(GpGraphics *graphics, INT x, INT y, INT w return GdipIsVisibleRect(graphics, (REAL)x, (REAL)y, (REAL)width, (REAL)height, result); } -GpStatus WINGDIPAPI GdipMeasureCharacterRanges(GpGraphics* graphics, - GDIPCONST WCHAR* string, INT length, GDIPCONST GpFont* font, - GDIPCONST RectF* layoutRect, GDIPCONST GpStringFormat *stringFormat, - INT regionCount, GpRegion** regions) -{ - FIXME("stub: %p %s %d %p %p %p %d %p\n", graphics, debugstr_w(string), - length, font, layoutRect, stringFormat, regionCount, regions); +typedef GpStatus (*gdip_format_string_callback)(GpGraphics *graphics, + GDIPCONST WCHAR *string, INT index, INT length, GDIPCONST GpFont *font, + GDIPCONST RectF *rect, GDIPCONST GpStringFormat *format, + INT lineno, const RectF *bounds, void *user_data); - if (!(graphics && string && font && layoutRect && stringFormat && regions)) - return InvalidParameter; - - return NotImplemented; -} - -/* Find the smallest rectangle that bounds the text when it is printed in rect - * according to the format options listed in format. If rect has 0 width and - * height, then just find the smallest rectangle that bounds the text when it's - * printed at location (rect->X, rect-Y). */ -GpStatus WINGDIPAPI GdipMeasureString(GpGraphics *graphics, +static GpStatus gdip_format_string(GpGraphics *graphics, GDIPCONST WCHAR *string, INT length, GDIPCONST GpFont *font, - GDIPCONST RectF *rect, GDIPCONST GpStringFormat *format, RectF *bounds, - INT *codepointsfitted, INT *linesfilled) + GDIPCONST RectF *rect, GDIPCONST GpStringFormat *format, + gdip_format_string_callback callback, void *user_data) { - HFONT oldfont; WCHAR* stringdup; - INT sum = 0, height = 0, fit, fitcpy, max_width = 0, i, j, lret, nwidth, - nheight, lineend; + INT sum = 0, height = 0, fit, fitcpy, i, j, lret, nwidth, + nheight, lineend, lineno = 0; + RectF bounds; + StringAlignment halign; + GpStatus stat = Ok; SIZE size; - TRACE("(%p, %s, %i, %p, %s, %p, %p, %p, %p)\n", graphics, - debugstr_wn(string, length), length, font, debugstr_rectf(rect), format, - bounds, codepointsfitted, linesfilled); - - if(!graphics || !string || !font || !rect) - return InvalidParameter; - - if(linesfilled) *linesfilled = 0; - if(codepointsfitted) *codepointsfitted = 0; - - if(format) - TRACE("may be ignoring some format flags: attr %x\n", format->attr); - if(length == -1) length = lstrlenW(string); stringdup = GdipAlloc((length + 1) * sizeof(WCHAR)); if(!stringdup) return OutOfMemory; - oldfont = SelectObject(graphics->hdc, CreateFontIndirectW(&font->lfw)); nwidth = roundr(rect->Width); nheight = roundr(rect->Height); - if((nwidth == 0) && (nheight == 0)) - nwidth = nheight = INT_MAX; + if (nwidth == 0) nwidth = INT_MAX; + if (nheight == 0) nheight = INT_MAX; for(i = 0, j = 0; i < length; i++){ + /* FIXME: This makes the indexes passed to callback inaccurate. */ if(!isprintW(string[i]) && (string[i] != '\n')) continue; @@ -3527,9 +3520,11 @@ GpStatus WINGDIPAPI GdipMeasureString(GpGraphics *graphics, j++; } - stringdup[j] = 0; length = j; + if (format) halign = format->align; + else halign = StringAlignmentNear; + while(sum < length){ GetTextExtentExPointW(graphics->hdc, stringdup + sum, length - sum, nwidth, &fit, NULL, &size); @@ -3572,12 +3567,38 @@ GpStatus WINGDIPAPI GdipMeasureString(GpGraphics *graphics, GetTextExtentExPointW(graphics->hdc, stringdup + sum, lineend, nwidth, &j, NULL, &size); - sum += fit + (lret < fitcpy ? 1 : 0); - if(codepointsfitted) *codepointsfitted = sum; + bounds.Width = size.cx; + if(height + size.cy > nheight) + bounds.Height = nheight - (height + size.cy); + else + bounds.Height = size.cy; + + bounds.Y = rect->Y + height; + + switch (halign) + { + case StringAlignmentNear: + default: + bounds.X = rect->X; + break; + case StringAlignmentCenter: + bounds.X = rect->X + (rect->Width/2) - (bounds.Width/2); + break; + case StringAlignmentFar: + bounds.X = rect->X + rect->Width - bounds.Width; + break; + } + + stat = callback(graphics, stringdup, sum, lineend, + font, rect, format, lineno, &bounds, user_data); + + if (stat != Ok) + break; + + sum += fit + (lret < fitcpy ? 1 : 0); height += size.cy; - if(linesfilled) *linesfilled += size.cy; - max_width = max(max_width, size.cx); + lineno++; if(height > nheight) break; @@ -3587,17 +3608,311 @@ GpStatus WINGDIPAPI GdipMeasureString(GpGraphics *graphics, break; } + GdipFree(stringdup); + + return stat; +} + +struct measure_ranges_args { + GpRegion **regions; +}; + +GpStatus measure_ranges_callback(GpGraphics *graphics, + GDIPCONST WCHAR *string, INT index, INT length, GDIPCONST GpFont *font, + GDIPCONST RectF *rect, GDIPCONST GpStringFormat *format, + INT lineno, const RectF *bounds, void *user_data) +{ + int i; + GpStatus stat = Ok; + struct measure_ranges_args *args = user_data; + + for (i=0; irange_count; i++) + { + INT range_start = max(index, format->character_ranges[i].First); + INT range_end = min(index+length, format->character_ranges[i].First+format->character_ranges[i].Length); + if (range_start < range_end) + { + GpRectF range_rect; + SIZE range_size; + + range_rect.Y = bounds->Y; + range_rect.Height = bounds->Height; + + GetTextExtentExPointW(graphics->hdc, string + index, range_start - index, + INT_MAX, NULL, NULL, &range_size); + range_rect.X = bounds->X + range_size.cx; + + GetTextExtentExPointW(graphics->hdc, string + index, range_end - index, + INT_MAX, NULL, NULL, &range_size); + range_rect.Width = (bounds->X + range_size.cx) - range_rect.X; + + stat = GdipCombineRegionRect(args->regions[i], &range_rect, CombineModeUnion); + if (stat != Ok) + break; + } + } + + return stat; +} + +GpStatus WINGDIPAPI GdipMeasureCharacterRanges(GpGraphics* graphics, + GDIPCONST WCHAR* string, INT length, GDIPCONST GpFont* font, + GDIPCONST RectF* layoutRect, GDIPCONST GpStringFormat *stringFormat, + INT regionCount, GpRegion** regions) +{ + GpStatus stat; + int i; + HFONT oldfont; + struct measure_ranges_args args; + + TRACE("(%p %s %d %p %s %p %d %p)\n", graphics, debugstr_w(string), + length, font, debugstr_rectf(layoutRect), stringFormat, regionCount, regions); + + if (!(graphics && string && font && layoutRect && stringFormat && regions)) + return InvalidParameter; + + if (regionCount < stringFormat->range_count) + return InvalidParameter; + + if (stringFormat->attr) + TRACE("may be ignoring some format flags: attr %x\n", stringFormat->attr); + + oldfont = SelectObject(graphics->hdc, CreateFontIndirectW(&font->lfw)); + + for (i=0; irange_count; i++) + { + stat = GdipSetEmpty(regions[i]); + if (stat != Ok) + return stat; + } + + args.regions = regions; + + stat = gdip_format_string(graphics, string, length, font, layoutRect, stringFormat, + measure_ranges_callback, &args); + + DeleteObject(SelectObject(graphics->hdc, oldfont)); + + return stat; +} + +struct measure_string_args { + RectF *bounds; + INT *codepointsfitted; + INT *linesfilled; +}; + +static GpStatus measure_string_callback(GpGraphics *graphics, + GDIPCONST WCHAR *string, INT index, INT length, GDIPCONST GpFont *font, + GDIPCONST RectF *rect, GDIPCONST GpStringFormat *format, + INT lineno, const RectF *bounds, void *user_data) +{ + struct measure_string_args *args = user_data; + + if (bounds->Width > args->bounds->Width) + args->bounds->Width = bounds->Width; + + if (bounds->Height + bounds->Y > args->bounds->Height + args->bounds->Y) + args->bounds->Height = bounds->Height + bounds->Y - args->bounds->Y; + + if (args->codepointsfitted) + *args->codepointsfitted = index + length; + + if (args->linesfilled) + (*args->linesfilled)++; + + return Ok; +} + +/* Find the smallest rectangle that bounds the text when it is printed in rect + * according to the format options listed in format. If rect has 0 width and + * height, then just find the smallest rectangle that bounds the text when it's + * printed at location (rect->X, rect-Y). */ +GpStatus WINGDIPAPI GdipMeasureString(GpGraphics *graphics, + GDIPCONST WCHAR *string, INT length, GDIPCONST GpFont *font, + GDIPCONST RectF *rect, GDIPCONST GpStringFormat *format, RectF *bounds, + INT *codepointsfitted, INT *linesfilled) +{ + HFONT oldfont; + struct measure_string_args args; + + TRACE("(%p, %s, %i, %p, %s, %p, %p, %p, %p)\n", graphics, + debugstr_wn(string, length), length, font, debugstr_rectf(rect), format, + bounds, codepointsfitted, linesfilled); + + if(!graphics || !string || !font || !rect || !bounds) + return InvalidParameter; + + if(linesfilled) *linesfilled = 0; + if(codepointsfitted) *codepointsfitted = 0; + + if(format) + TRACE("may be ignoring some format flags: attr %x\n", format->attr); + + oldfont = SelectObject(graphics->hdc, CreateFontIndirectW(&font->lfw)); + bounds->X = rect->X; bounds->Y = rect->Y; - bounds->Width = (REAL)max_width; - bounds->Height = (REAL) min(height, nheight); + bounds->Width = 0.0; + bounds->Height = 0.0; + + args.bounds = bounds; + args.codepointsfitted = codepointsfitted; + args.linesfilled = linesfilled; + + gdip_format_string(graphics, string, length, font, rect, format, + measure_string_callback, &args); - GdipFree(stringdup); DeleteObject(SelectObject(graphics->hdc, oldfont)); return Ok; } +struct draw_string_args { + POINT drawbase; + UINT drawflags; + REAL ang_cos, ang_sin; +}; + +static GpStatus draw_string_callback(GpGraphics *graphics, + GDIPCONST WCHAR *string, INT index, INT length, GDIPCONST GpFont *font, + GDIPCONST RectF *rect, GDIPCONST GpStringFormat *format, + INT lineno, const RectF *bounds, void *user_data) +{ + struct draw_string_args *args = user_data; + RECT drawcoord; + + drawcoord.left = drawcoord.right = args->drawbase.x + roundr(args->ang_sin * bounds->Y); + drawcoord.top = drawcoord.bottom = args->drawbase.y + roundr(args->ang_cos * bounds->Y); + + DrawTextW(graphics->hdc, string + index, length, &drawcoord, args->drawflags); + + return Ok; +} + +GpStatus WINGDIPAPI GdipDrawString(GpGraphics *graphics, GDIPCONST WCHAR *string, + INT length, GDIPCONST GpFont *font, GDIPCONST RectF *rect, + GDIPCONST GpStringFormat *format, GDIPCONST GpBrush *brush) +{ + HRGN rgn = NULL; + HFONT gdifont; + LOGFONTW lfw; + TEXTMETRICW textmet; + GpPointF pt[3], rectcpy[4]; + POINT corners[4]; + REAL angle, rel_width, rel_height; + INT offsety = 0, save_state; + struct draw_string_args args; + RectF scaled_rect; + + TRACE("(%p, %s, %i, %p, %s, %p, %p)\n", graphics, debugstr_wn(string, length), + length, font, debugstr_rectf(rect), format, brush); + + if(!graphics || !string || !font || !brush || !rect) + return InvalidParameter; + + if((brush->bt != BrushTypeSolidColor)){ + FIXME("not implemented for given parameters\n"); + return NotImplemented; + } + + if(format){ + TRACE("may be ignoring some format flags: attr %x\n", format->attr); + + /* Should be no need to explicitly test for StringAlignmentNear as + * that is default behavior if no alignment is passed. */ + if(format->vertalign != StringAlignmentNear){ + RectF bounds; + GdipMeasureString(graphics, string, length, font, rect, format, &bounds, 0, 0); + + if(format->vertalign == StringAlignmentCenter) + offsety = (rect->Height - bounds.Height) / 2; + else if(format->vertalign == StringAlignmentFar) + offsety = (rect->Height - bounds.Height); + } + } + + save_state = SaveDC(graphics->hdc); + SetBkMode(graphics->hdc, TRANSPARENT); + SetTextColor(graphics->hdc, brush->lb.lbColor); + + pt[0].X = 0.0; + pt[0].Y = 0.0; + pt[1].X = 1.0; + pt[1].Y = 0.0; + pt[2].X = 0.0; + pt[2].Y = 1.0; + GdipTransformPoints(graphics, CoordinateSpaceDevice, CoordinateSpaceWorld, pt, 3); + angle = -gdiplus_atan2((pt[1].Y - pt[0].Y), (pt[1].X - pt[0].X)); + args.ang_cos = cos(angle); + args.ang_sin = sin(angle); + rel_width = sqrt((pt[1].Y-pt[0].Y)*(pt[1].Y-pt[0].Y)+ + (pt[1].X-pt[0].X)*(pt[1].X-pt[0].X)); + rel_height = sqrt((pt[2].Y-pt[0].Y)*(pt[2].Y-pt[0].Y)+ + (pt[2].X-pt[0].X)*(pt[2].X-pt[0].X)); + + rectcpy[3].X = rectcpy[0].X = rect->X; + rectcpy[1].Y = rectcpy[0].Y = rect->Y + offsety; + rectcpy[2].X = rectcpy[1].X = rect->X + rect->Width; + rectcpy[3].Y = rectcpy[2].Y = rect->Y + offsety + rect->Height; + transform_and_round_points(graphics, corners, rectcpy, 4); + + scaled_rect.X = 0.0; + scaled_rect.Y = 0.0; + scaled_rect.Width = rel_width * rect->Width; + scaled_rect.Height = rel_height * rect->Height; + + if (roundr(scaled_rect.Width) != 0 && roundr(scaled_rect.Height) != 0) + { + /* FIXME: If only the width or only the height is 0, we should probably still clip */ + rgn = CreatePolygonRgn(corners, 4, ALTERNATE); + SelectClipRgn(graphics->hdc, rgn); + } + + /* Use gdi to find the font, then perform transformations on it (height, + * width, angle). */ + SelectObject(graphics->hdc, CreateFontIndirectW(&font->lfw)); + GetTextMetricsW(graphics->hdc, &textmet); + lfw = font->lfw; + + lfw.lfHeight = roundr(((REAL)lfw.lfHeight) * rel_height); + lfw.lfWidth = roundr(textmet.tmAveCharWidth * rel_width); + + lfw.lfEscapement = lfw.lfOrientation = roundr((angle / M_PI) * 1800.0); + + gdifont = CreateFontIndirectW(&lfw); + DeleteObject(SelectObject(graphics->hdc, CreateFontIndirectW(&lfw))); + + if (!format || format->align == StringAlignmentNear) + { + args.drawbase.x = corners[0].x; + args.drawbase.y = corners[0].y; + args.drawflags = DT_NOCLIP | DT_EXPANDTABS; + } + else if (format->align == StringAlignmentCenter) + { + args.drawbase.x = (corners[0].x + corners[1].x)/2; + args.drawbase.y = (corners[0].y + corners[1].y)/2; + args.drawflags = DT_NOCLIP | DT_EXPANDTABS | DT_CENTER; + } + else /* (format->align == StringAlignmentFar) */ + { + args.drawbase.x = corners[1].x; + args.drawbase.y = corners[1].y; + args.drawflags = DT_NOCLIP | DT_EXPANDTABS | DT_RIGHT; + } + + gdip_format_string(graphics, string, length, font, &scaled_rect, format, + draw_string_callback, &args); + + DeleteObject(rgn); + DeleteObject(gdifont); + + RestoreDC(graphics->hdc, save_state); + + return Ok; +} + GpStatus WINGDIPAPI GdipResetClip(GpGraphics *graphics) { TRACE("(%p)\n", graphics); @@ -4300,7 +4615,12 @@ GpStatus WINGDIPAPI GdipTransformPointsI(GpGraphics *graphics, GpCoordinateSpace HPALETTE WINGDIPAPI GdipCreateHalftonePalette(void) { - FIXME("\n"); + static int calls; + + TRACE("\n"); + + if (!calls++) + FIXME("stub\n"); return NULL; } diff --git a/reactos/dll/win32/gdiplus/image.c b/reactos/dll/win32/gdiplus/image.c index 58f3c6570be..0a73dcf6ca4 100644 --- a/reactos/dll/win32/gdiplus/image.c +++ b/reactos/dll/win32/gdiplus/image.c @@ -122,7 +122,7 @@ static inline void getpixel_16bppGrayScale(BYTE *r, BYTE *g, BYTE *b, BYTE *a, static inline void getpixel_16bppRGB555(BYTE *r, BYTE *g, BYTE *b, BYTE *a, const BYTE *row, UINT x) { - WORD pixel = *((WORD*)(row)+x); + WORD pixel = *((const WORD*)(row)+x); *r = (pixel>>7&0xf8)|(pixel>>12&0x7); *g = (pixel>>2&0xf8)|(pixel>>6&0x7); *b = (pixel<<3&0xf8)|(pixel>>2&0x7); @@ -132,7 +132,7 @@ static inline void getpixel_16bppRGB555(BYTE *r, BYTE *g, BYTE *b, BYTE *a, static inline void getpixel_16bppRGB565(BYTE *r, BYTE *g, BYTE *b, BYTE *a, const BYTE *row, UINT x) { - WORD pixel = *((WORD*)(row)+x); + WORD pixel = *((const WORD*)(row)+x); *r = (pixel>>8&0xf8)|(pixel>>13&0x7); *g = (pixel>>3&0xfc)|(pixel>>9&0x3); *b = (pixel<<3&0xf8)|(pixel>>2&0x7); @@ -142,7 +142,7 @@ static inline void getpixel_16bppRGB565(BYTE *r, BYTE *g, BYTE *b, BYTE *a, static inline void getpixel_16bppARGB1555(BYTE *r, BYTE *g, BYTE *b, BYTE *a, const BYTE *row, UINT x) { - WORD pixel = *((WORD*)(row)+x); + WORD pixel = *((const WORD*)(row)+x); *r = (pixel>>7&0xf8)|(pixel>>12&0x7); *g = (pixel>>2&0xf8)|(pixel>>6&0x7); *b = (pixel<<3&0xf8)|(pixel>>2&0x7); @@ -1831,6 +1831,37 @@ GpStatus WINGDIPAPI GdipEmfToWmfBits(HENHMETAFILE hemf, UINT cbData16, return NotImplemented; } +/* Internal utility function: Replace the image data of dst with that of src, + * and free src. */ +static void move_bitmap(GpBitmap *dst, GpBitmap *src, BOOL clobber_palette) +{ + GdipFree(dst->bitmapbits); + DeleteDC(dst->hdc); + DeleteObject(dst->hbitmap); + + if (clobber_palette) + { + GdipFree(dst->image.palette_entries); + dst->image.palette_flags = src->image.palette_flags; + dst->image.palette_count = src->image.palette_count; + dst->image.palette_entries = src->image.palette_entries; + } + else + GdipFree(src->image.palette_entries); + + dst->image.xres = src->image.xres; + dst->image.yres = src->image.yres; + dst->width = src->width; + dst->height = src->height; + dst->format = src->format; + dst->hbitmap = src->hbitmap; + dst->hdc = src->hdc; + dst->bits = src->bits; + dst->stride = src->stride; + + GdipFree(src); +} + GpStatus WINGDIPAPI GdipDisposeImage(GpImage *image) { TRACE("%p\n", image); @@ -1946,6 +1977,7 @@ GpStatus WINGDIPAPI GdipGetImageGraphicsContext(GpImage *image, GpGraphics **graphics) { HDC hdc; + GpStatus stat; TRACE("%p %p\n", image, graphics); @@ -1965,7 +1997,12 @@ GpStatus WINGDIPAPI GdipGetImageGraphicsContext(GpImage *image, ((GpBitmap*)image)->hdc = hdc; } - return GdipCreateFromHDC(hdc, graphics); + stat = GdipCreateFromHDC(hdc, graphics); + + if (stat == Ok) + (*graphics)->image = image; + + return stat; } GpStatus WINGDIPAPI GdipGetImageHeight(GpImage *image, UINT *height) @@ -2459,6 +2496,11 @@ static GpStatus decode_image_gif(IStream* stream, REFCLSID clsid, GpImage **imag return decode_image_wic(stream, &CLSID_WICGifDecoder, image); } +static GpStatus decode_image_tiff(IStream* stream, REFCLSID clsid, GpImage **image) +{ + return decode_image_wic(stream, &CLSID_WICTiffDecoder, image); +} + static GpStatus decode_image_olepicture_metafile(IStream* stream, REFCLSID clsid, GpImage **image) { IPicture *pic; @@ -2505,6 +2547,7 @@ typedef enum { BMP, JPEG, GIF, + TIFF, EMF, WMF, PNG, @@ -2517,10 +2560,11 @@ static const struct image_codec codecs[NUM_CODECS]; static GpStatus get_decoder_info(IStream* stream, const struct image_codec **result) { BYTE signature[8]; + const BYTE *pattern, *mask; LARGE_INTEGER seek; HRESULT hr; UINT bytesread; - int i, j; + int i, j, sig; /* seek to the start of the stream */ seek.QuadPart = 0; @@ -2528,7 +2572,7 @@ static GpStatus get_decoder_info(IStream* stream, const struct image_codec **res if (FAILED(hr)) return hresult_to_status(hr); /* read the first 8 bytes */ - /* FIXME: This assumes all codecs have one signature <= 8 bytes in length */ + /* FIXME: This assumes all codecs have signatures <= 8 bytes in length */ hr = IStream_Read(stream, signature, 8, &bytesread); if (FAILED(hr)) return hresult_to_status(hr); if (hr == S_FALSE || bytesread == 0) return GenericError; @@ -2537,13 +2581,18 @@ static GpStatus get_decoder_info(IStream* stream, const struct image_codec **res if ((codecs[i].info.Flags & ImageCodecFlagsDecoder) && bytesread >= codecs[i].info.SigSize) { - for (j=0; jtype != ImageTypeBitmap) + { + FIXME("Not implemented for type %i\n", image->type); + return NotImplemented; + } + + bitmap = (GpBitmap*)image; + bpp = PIXELFORMATBPP(bitmap->format); + + if (bpp < 8) + { + FIXME("Not implemented for %i bit images\n", bpp); + return NotImplemented; + } + + if (rotate_90) + { + width = bitmap->height; + height = bitmap->width; + } + else + { + width = bitmap->width; + height = bitmap->height; + } + + bytesperpixel = bpp/8; + + stat = GdipCreateBitmapFromScan0(width, height, 0, bitmap->format, NULL, &new_bitmap); + + if (stat != Ok) + return stat; + + stat = GdipBitmapLockBits(bitmap, NULL, ImageLockModeRead, bitmap->format, &src_lock); + + if (stat == Ok) + { + stat = GdipBitmapLockBits(new_bitmap, NULL, ImageLockModeWrite, bitmap->format, &dst_lock); + + if (stat == Ok) + { + LPBYTE src_row, src_pixel; + LPBYTE dst_row, dst_pixel; + + src_origin = src_lock.Scan0; + if (flip_x) src_origin += bytesperpixel * (bitmap->width - 1); + if (flip_y) src_origin += src_lock.Stride * (bitmap->height - 1); + + if (rotate_90) + { + if (flip_y) src_x_offset = -src_lock.Stride; + else src_x_offset = src_lock.Stride; + if (flip_x) src_y_offset = -bytesperpixel; + else src_y_offset = bytesperpixel; + } + else + { + if (flip_x) src_x_offset = -bytesperpixel; + else src_x_offset = bytesperpixel; + if (flip_y) src_y_offset = -src_lock.Stride; + else src_y_offset = src_lock.Stride; + } + + src_row = src_origin; + dst_row = dst_lock.Scan0; + for (y=0; y Date: Tue, 20 Apr 2010 16:42:47 +0000 Subject: [PATCH 013/131] - Sync inetcomm, inseng, jscript to Wine-1.1.43. svn path=/trunk/; revision=46956 --- reactos/dll/win32/inetcomm/mimeintl.c | 2 +- reactos/dll/win32/inetcomm/mimeole.c | 72 ++++++++-------- reactos/dll/win32/inseng/inseng_main.c | 1 - reactos/dll/win32/jscript/jscript.h | 1 + reactos/dll/win32/jscript/regexp.c | 111 +++++++++++++++++++++---- reactos/dll/win32/jscript/string.c | 59 +++---------- 6 files changed, 145 insertions(+), 101 deletions(-) diff --git a/reactos/dll/win32/inetcomm/mimeintl.c b/reactos/dll/win32/inetcomm/mimeintl.c index 6d37147e2bf..97b482ed3c7 100644 --- a/reactos/dll/win32/inetcomm/mimeintl.c +++ b/reactos/dll/win32/inetcomm/mimeintl.c @@ -268,7 +268,7 @@ static HRESULT WINAPI MimeInternat_FindCharset(IMimeInternational *iface, LPCSTR if(SUCCEEDED(hr)) *phCharset = add_charset(&This->charsets, &mlang_info, - (HCHARSET)InterlockedIncrement(&This->next_charset_handle)); + UlongToHandle(InterlockedIncrement(&This->next_charset_handle))); } LeaveCriticalSection(&This->cs); diff --git a/reactos/dll/win32/inetcomm/mimeole.c b/reactos/dll/win32/inetcomm/mimeole.c index 992949a44ef..f297c2973b4 100644 --- a/reactos/dll/win32/inetcomm/mimeole.c +++ b/reactos/dll/win32/inetcomm/mimeole.c @@ -1419,7 +1419,7 @@ static HRESULT create_sub_stream(IStream *stream, ULARGE_INTEGER start, ULARGE_I typedef struct body_t { struct list entry; - HBODY hbody; + DWORD index; IMimeBody *mime_body; struct body_t *parent; @@ -1434,7 +1434,7 @@ typedef struct MimeMessage IStream *stream; struct list body_tree; - HBODY next_hbody; + DWORD next_index; } MimeMessage; static HRESULT WINAPI MimeMessage_QueryInterface(IMimeMessage *iface, REFIID riid, void **ppv) @@ -1512,13 +1512,13 @@ static HRESULT WINAPI MimeMessage_IsDirty( return E_NOTIMPL; } -static body_t *new_body_entry(IMimeBody *mime_body, HBODY hbody, body_t *parent) +static body_t *new_body_entry(IMimeBody *mime_body, DWORD index, body_t *parent) { body_t *body = HeapAlloc(GetProcessHeap(), 0, sizeof(*body)); if(body) { body->mime_body = mime_body; - body->hbody = hbody; + body->index = index; list_init(&body->children); body->parent = parent; } @@ -1630,8 +1630,7 @@ static body_t *create_sub_body(MimeMessage *msg, IStream *pStm, BODYOFFSETS *off offset->cbBodyStart = cur.u.LowPart + offset->cbHeaderStart; if(parent) MimeBody_set_offsets(impl_from_IMimeBody(mime_body), offset); IMimeBody_SetData(mime_body, IET_BINARY, NULL, NULL, &IID_IStream, pStm); - body = new_body_entry(mime_body, msg->next_hbody, parent); - msg->next_hbody = (HBODY)((DWORD)msg->next_hbody + 1); + body = new_body_entry(mime_body, msg->next_index++, parent); if(IMimeBody_IsContentType(mime_body, "multipart", NULL) == S_OK) { @@ -1812,7 +1811,7 @@ static HRESULT find_body(struct list *list, HBODY hbody, body_t **body) LIST_FOR_EACH_ENTRY(cur, list, body_t, entry) { - if(cur->hbody == hbody) + if(cur->index == HandleToUlong(hbody)) { *body = cur; return S_OK; @@ -1948,7 +1947,7 @@ static HRESULT WINAPI MimeMessage_GetBody( hr = get_body(This, location, hPivot, &body); - if(hr == S_OK) *phBody = body->hbody; + if(hr == S_OK) *phBody = UlongToHandle(body->index); return hr; } @@ -2003,38 +2002,35 @@ static HRESULT WINAPI MimeMessage_CountBodies( return S_OK; } -static HRESULT find_next(IMimeMessage *msg, LPFINDBODY find_body, HBODY *out) +static HRESULT find_next(IMimeMessage *msg, body_t *body, LPFINDBODY find, HBODY *out) { - HRESULT hr; - IMimeBody *mime_body; + MimeMessage *This = (MimeMessage *)msg; + struct list *ptr; HBODY next; - if(find_body->dwReserved == 0) - find_body->dwReserved = (DWORD)HBODY_ROOT; - else + for (;;) { - hr = IMimeMessage_GetBody(msg, IBL_FIRST, (HBODY)find_body->dwReserved, &next); - if(hr == S_OK) - find_body->dwReserved = (DWORD)next; + if (!body) ptr = list_head( &This->body_tree ); else { - hr = IMimeMessage_GetBody(msg, IBL_NEXT, (HBODY)find_body->dwReserved, &next); - if(hr == S_OK) - find_body->dwReserved = (DWORD)next; - else - return MIME_E_NOT_FOUND; + ptr = list_head( &body->children ); + while (!ptr) + { + if (!body->parent) return MIME_E_NOT_FOUND; + if (!(ptr = list_next( &body->parent->children, &body->entry ))) body = body->parent; + } + } + + body = LIST_ENTRY( ptr, body_t, entry ); + next = UlongToHandle( body->index ); + find->dwReserved = body->index; + if (IMimeBody_IsContentType(body->mime_body, find->pszPriType, find->pszSubType) == S_OK) + { + *out = next; + return S_OK; } } - - hr = IMimeMessage_BindToObject(msg, (HBODY)find_body->dwReserved, &IID_IMimeBody, (void**)&mime_body); - if(IMimeBody_IsContentType(mime_body, find_body->pszPriType, find_body->pszSubType) == S_OK) - { - IMimeBody_Release(mime_body); - *out = (HBODY)find_body->dwReserved; - return S_OK; - } - IMimeBody_Release(mime_body); - return find_next(msg, find_body, out); + return MIME_E_NOT_FOUND; } static HRESULT WINAPI MimeMessage_FindFirst( @@ -2045,7 +2041,7 @@ static HRESULT WINAPI MimeMessage_FindFirst( TRACE("(%p)->(%p, %p)\n", iface, pFindBody, phBody); pFindBody->dwReserved = 0; - return find_next(iface, pFindBody, phBody); + return find_next( iface, NULL, pFindBody, phBody ); } static HRESULT WINAPI MimeMessage_FindNext( @@ -2053,9 +2049,15 @@ static HRESULT WINAPI MimeMessage_FindNext( LPFINDBODY pFindBody, LPHBODY phBody) { + MimeMessage *This = (MimeMessage *)iface; + body_t *body; + HRESULT hr; + TRACE("(%p)->(%p, %p)\n", iface, pFindBody, phBody); - return find_next(iface, pFindBody, phBody); + hr = find_body( &This->body_tree, UlongToHandle( pFindBody->dwReserved ), &body ); + if (hr != S_OK) return MIME_E_NOT_FOUND; + return find_next( iface, body, pFindBody, phBody ); } static HRESULT WINAPI MimeMessage_ResolveURL( @@ -2562,7 +2564,7 @@ HRESULT MimeMessage_create(IUnknown *outer, void **obj) This->refs = 1; This->stream = NULL; list_init(&This->body_tree); - This->next_hbody = (HBODY)1; + This->next_index = 1; *obj = &This->lpVtbl; return S_OK; diff --git a/reactos/dll/win32/inseng/inseng_main.c b/reactos/dll/win32/inseng/inseng_main.c index 8ceb252b511..f1f148b4398 100644 --- a/reactos/dll/win32/inseng/inseng_main.c +++ b/reactos/dll/win32/inseng/inseng_main.c @@ -61,7 +61,6 @@ HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID iid, LPVOID *ppv) HRESULT WINAPI DllCanUnloadNow(void) { - FIXME("\n"); return S_FALSE; } diff --git a/reactos/dll/win32/jscript/jscript.h b/reactos/dll/win32/jscript/jscript.h index 00688273de8..c1c8e60f35b 100644 --- a/reactos/dll/win32/jscript/jscript.h +++ b/reactos/dll/win32/jscript/jscript.h @@ -324,6 +324,7 @@ HRESULT regexp_match_next(script_ctx_t*,DispatchEx*,DWORD,const WCHAR*,DWORD,con DWORD*,DWORD*,match_result_t*); HRESULT regexp_match(script_ctx_t*,DispatchEx*,const WCHAR*,DWORD,BOOL,match_result_t**,DWORD*); HRESULT parse_regexp_flags(const WCHAR*,DWORD,DWORD*); +HRESULT regexp_string_match(script_ctx_t*,DispatchEx*,BSTR,VARIANT*,jsexcept_t*); static inline VARIANT *get_arg(DISPPARAMS *dp, DWORD i) { diff --git a/reactos/dll/win32/jscript/regexp.c b/reactos/dll/win32/jscript/regexp.c index 04575458105..7861d229826 100644 --- a/reactos/dll/win32/jscript/regexp.c +++ b/reactos/dll/win32/jscript/regexp.c @@ -2384,7 +2384,7 @@ SimpleMatch(REGlobalData *gData, REMatchState *x, REOp op, RECharSet *charSet; const char *opname = reop_names[op]; - TRACE("\n%06d: %*s%s\n", pc - gData->regexp->program, + TRACE("\n%06d: %*s%s\n", (int)(pc - gData->regexp->program), (int)gData->stateStackTop * 2, "", opname); switch (op) { @@ -2623,7 +2623,7 @@ ExecuteREBytecode(REGlobalData *gData, REMatchState *x) for (;;) { const char *opname = reop_names[op]; - TRACE("\n%06d: %*s%s\n", pc - gData->regexp->program, + TRACE("\n%06d: %*s%s\n", (int)(pc - gData->regexp->program), (int)gData->stateStackTop * 2, "", opname); if (REOP_IS_SIMPLE(op)) { @@ -3637,25 +3637,25 @@ static HRESULT run_exec(script_ctx_t *ctx, vdisp_t *jsthis, VARIANT *arg, jsexce hres = to_string(ctx, arg, ei, &string); if(FAILED(hres)) return hres; + length = SysStringLen(string); }else { - string = SysAllocStringLen(NULL, 0); - if(!string) - return E_OUTOFMEMORY; + string = NULL; + length = 0; } - if(regexp->last_index < 0) { - SysFreeString(string); - set_last_index(regexp, 0); - *ret = VARIANT_FALSE; - if(input) { - *input = NULL; + if(regexp->jsregexp->flags & JSREG_GLOB) { + if(regexp->last_index < 0) { + SysFreeString(string); + set_last_index(regexp, 0); + *ret = VARIANT_FALSE; + if(input) { + *input = NULL; + } + return S_OK; } - return S_OK; - } - length = SysStringLen(string); - if(regexp->jsregexp->flags & JSREG_GLOB) last_index = regexp->last_index; + } cp = string + last_index; hres = regexp_match_next(ctx, ®exp->dispex, REM_RESET_INDEX, string, length, &cp, parens, @@ -3878,6 +3878,87 @@ HRESULT create_regexp_var(script_ctx_t *ctx, VARIANT *src_arg, VARIANT *flags_ar return create_regexp(ctx, src, -1, flags, ret); } +HRESULT regexp_string_match(script_ctx_t *ctx, DispatchEx *re, BSTR str, + VARIANT *retv, jsexcept_t *ei) +{ + RegExpInstance *regexp = (RegExpInstance*)re; + match_result_t *match_result; + DWORD match_cnt, i, length; + DispatchEx *array; + VARIANT var; + HRESULT hres; + + length = SysStringLen(str); + + if(!(regexp->jsregexp->flags & JSREG_GLOB)) { + match_result_t match, *parens = NULL; + DWORD parens_cnt, parens_size = 0; + const WCHAR *cp = str; + + hres = regexp_match_next(ctx, ®exp->dispex, 0, str, length, &cp, &parens, &parens_size, &parens_cnt, &match); + if(FAILED(hres)) + return hres; + + if(retv) { + if(hres == S_OK) { + IDispatch *ret; + + hres = create_match_array(ctx, str, &match, parens, parens_cnt, ei, &ret); + if(SUCCEEDED(hres)) { + V_VT(retv) = VT_DISPATCH; + V_DISPATCH(retv) = ret; + } + }else { + V_VT(retv) = VT_NULL; + } + } + + heap_free(parens); + return S_OK; + } + + hres = regexp_match(ctx, ®exp->dispex, str, length, FALSE, &match_result, &match_cnt); + if(FAILED(hres)) + return hres; + + if(!match_cnt) { + TRACE("no match\n"); + + if(retv) + V_VT(retv) = VT_NULL; + return S_OK; + } + + hres = create_array(ctx, match_cnt, &array); + if(FAILED(hres)) + return hres; + + V_VT(&var) = VT_BSTR; + + for(i=0; i < match_cnt; i++) { + V_BSTR(&var) = SysAllocStringLen(match_result[i].str, match_result[i].len); + if(!V_BSTR(&var)) { + hres = E_OUTOFMEMORY; + break; + } + + hres = jsdisp_propput_idx(array, i, &var, ei, NULL/*FIXME*/); + SysFreeString(V_BSTR(&var)); + if(FAILED(hres)) + break; + } + + heap_free(match_result); + + if(SUCCEEDED(hres) && retv) { + V_VT(retv) = VT_DISPATCH; + V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(array); + }else { + jsdisp_release(array); + } + return hres; +} + static HRESULT RegExpConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) { diff --git a/reactos/dll/win32/jscript/string.c b/reactos/dll/win32/jscript/string.c index df43fee27ed..510dcc272c6 100644 --- a/reactos/dll/win32/jscript/string.c +++ b/reactos/dll/win32/jscript/string.c @@ -622,11 +622,9 @@ static HRESULT String_match(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISP VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) { const WCHAR *str; - match_result_t *match_result; DispatchEx *regexp; - DispatchEx *array; - VARIANT var, *arg_var; - DWORD length, match_cnt, i; + VARIANT *arg_var; + DWORD length; BSTR val_str = NULL; HRESULT hres = S_OK; @@ -645,7 +643,7 @@ static HRESULT String_match(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISP case VT_DISPATCH: regexp = iface_to_jsdisp((IUnknown*)V_DISPATCH(arg_var)); if(regexp) { - if(regexp->builtin_info->class == JSCLASS_REGEXP) + if(is_class(regexp, JSCLASS_REGEXP)) break; jsdisp_release(regexp); } @@ -664,54 +662,17 @@ static HRESULT String_match(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISP } hres = get_string_val(ctx, jsthis, ei, &str, &length, &val_str); - if(SUCCEEDED(hres)) - hres = regexp_match(ctx, regexp, str, length, FALSE, &match_result, &match_cnt); - jsdisp_release(regexp); - if(FAILED(hres)) { - SysFreeString(val_str); - return hres; - } - - if(!match_cnt) { - TRACE("no match\n"); - - if(retv) - V_VT(retv) = VT_NULL; - - SysFreeString(val_str); - return S_OK; - } - - hres = create_array(ctx, match_cnt, &array); - if(FAILED(hres)) { - SysFreeString(val_str); - return hres; - } - - V_VT(&var) = VT_BSTR; - - for(i=0; i < match_cnt; i++) { - V_BSTR(&var) = SysAllocStringLen(match_result[i].str, match_result[i].len); - if(!V_BSTR(&var)) { + if(SUCCEEDED(hres)) { + if(!val_str) + val_str = SysAllocStringLen(str, length); + if(val_str) + hres = regexp_string_match(ctx, regexp, val_str, retv, ei); + else hres = E_OUTOFMEMORY; - break; - } - - hres = jsdisp_propput_idx(array, i, &var, ei, NULL/*FIXME*/); - SysFreeString(V_BSTR(&var)); - if(FAILED(hres)) - break; } - heap_free(match_result); + jsdisp_release(regexp); SysFreeString(val_str); - - if(SUCCEEDED(hres) && retv) { - V_VT(retv) = VT_DISPATCH; - V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(array); - }else { - jsdisp_release(array); - } return hres; } From 4a1f6e12e3faa48d51faf652b2b1f9fcf7a0a94b Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Tue, 20 Apr 2010 17:16:57 +0000 Subject: [PATCH 014/131] - Sync localspl, mciavi32, mcicda, mciqtz32, mciseq, mciwave, mscoree, msctf, msgsm32.acm, mshtml to Wine-1.1.43. svn path=/trunk/; revision=46957 --- reactos/dll/win32/localspl/provider.c | 12 +- reactos/dll/win32/mciavi32/mciavi.c | 17 +- reactos/dll/win32/mcicda/mcicda.c | 5 +- reactos/dll/win32/mciqtz32/mciqtz.c | 9 +- reactos/dll/win32/mciqtz32/mciqtz_private.h | 1 + reactos/dll/win32/mciseq/mcimidi.c | 30 ++- reactos/dll/win32/mciwave/mciwave.c | 104 +++++--- reactos/dll/win32/mscoree/mscoree.rbuild | 1 + reactos/dll/win32/mscoree/mscoree_main.c | 236 +++++++++++++----- reactos/dll/win32/mscoree/mscoree_private.h | 13 + reactos/dll/win32/msctf/displayattributemgr.c | 139 +++++++++++ reactos/dll/win32/msctf/inputprocessor.c | 4 +- reactos/dll/win32/msctf/msctf.c | 1 + reactos/dll/win32/msctf/msctf.rbuild | 1 + reactos/dll/win32/msctf/msctf_internal.h | 1 + reactos/dll/win32/msctf/regsvr.c | 7 + reactos/dll/win32/msgsm32.acm/msgsm32.c | 4 +- reactos/dll/win32/mshtml/dispex.c | 224 +++++++++++------ reactos/dll/win32/mshtml/editor.c | 1 - reactos/dll/win32/mshtml/htmlelem.c | 6 +- reactos/dll/win32/mshtml/htmlwindow.c | 20 ++ reactos/dll/win32/mshtml/install.c | 20 +- reactos/dll/win32/mshtml/mshtml_private.h | 12 +- reactos/dll/win32/mshtml/navigate.c | 70 +++++- reactos/dll/win32/mshtml/nsembed.c | 64 +---- reactos/dll/win32/mshtml/nsevents.c | 8 +- reactos/dll/win32/mshtml/nsio.c | 61 ++++- reactos/dll/win32/mshtml/olecmd.c | 3 - reactos/dll/win32/mshtml/view.c | 9 +- 29 files changed, 777 insertions(+), 306 deletions(-) create mode 100644 reactos/dll/win32/msctf/displayattributemgr.c diff --git a/reactos/dll/win32/localspl/provider.c b/reactos/dll/win32/localspl/provider.c index b17e074b845..322418804c3 100644 --- a/reactos/dll/win32/localspl/provider.c +++ b/reactos/dll/win32/localspl/provider.c @@ -1375,7 +1375,7 @@ static BOOL myAddPrinterDriverEx(DWORD level, LPBYTE pDriverInfo, DWORD dwFileCo } /* Verified with the Adobe PS Driver, that w2k does not use di.Version */ - RegSetValueExW(hdrv, versionW, 0, REG_DWORD, (LPBYTE) &env->driverversion, + RegSetValueExW(hdrv, versionW, 0, REG_DWORD, (const BYTE*) &env->driverversion, sizeof(DWORD)); RegSetValueExW(hdrv, driverW, 0, REG_SZ, (LPBYTE) di.pDriverPath, @@ -1395,7 +1395,7 @@ static BOOL myAddPrinterDriverEx(DWORD level, LPBYTE pDriverInfo, DWORD dwFileCo RegSetValueExW(hdrv, help_fileW, 0, REG_SZ, (LPBYTE) di.pHelpFile, (lstrlenW(di.pHelpFile)+1)* sizeof(WCHAR)); else - RegSetValueExW(hdrv, help_fileW, 0, REG_SZ, (LPBYTE)emptyW, sizeof(emptyW)); + RegSetValueExW(hdrv, help_fileW, 0, REG_SZ, (const BYTE*)emptyW, sizeof(emptyW)); apd_copyfile(di.pHelpFile, &apd); @@ -1404,7 +1404,7 @@ static BOOL myAddPrinterDriverEx(DWORD level, LPBYTE pDriverInfo, DWORD dwFileCo RegSetValueExW(hdrv, dependent_filesW, 0, REG_MULTI_SZ, (LPBYTE) di.pDependentFiles, multi_sz_lenW(di.pDependentFiles)); else - RegSetValueExW(hdrv, dependent_filesW, 0, REG_MULTI_SZ, (LPBYTE)emptyW, sizeof(emptyW)); + RegSetValueExW(hdrv, dependent_filesW, 0, REG_MULTI_SZ, (const BYTE*)emptyW, sizeof(emptyW)); while ((ptr != NULL) && (ptr[0])) { if (apd_copyfile(ptr, &apd)) { ptr += lstrlenW(ptr) + 1; @@ -1420,20 +1420,20 @@ static BOOL myAddPrinterDriverEx(DWORD level, LPBYTE pDriverInfo, DWORD dwFileCo RegSetValueExW(hdrv, monitorW, 0, REG_SZ, (LPBYTE) di.pMonitorName, (lstrlenW(di.pMonitorName)+1)* sizeof(WCHAR)); else - RegSetValueExW(hdrv, monitorW, 0, REG_SZ, (LPBYTE)emptyW, sizeof(emptyW)); + RegSetValueExW(hdrv, monitorW, 0, REG_SZ, (const BYTE*)emptyW, sizeof(emptyW)); if (di.pDefaultDataType) RegSetValueExW(hdrv, datatypeW, 0, REG_SZ, (LPBYTE) di.pDefaultDataType, (lstrlenW(di.pDefaultDataType)+1)* sizeof(WCHAR)); else - RegSetValueExW(hdrv, datatypeW, 0, REG_SZ, (LPBYTE)emptyW, sizeof(emptyW)); + RegSetValueExW(hdrv, datatypeW, 0, REG_SZ, (const BYTE*)emptyW, sizeof(emptyW)); /* settings for level 4 */ if (di.pszzPreviousNames) RegSetValueExW(hdrv, previous_namesW, 0, REG_MULTI_SZ, (LPBYTE) di.pszzPreviousNames, multi_sz_lenW(di.pszzPreviousNames)); else - RegSetValueExW(hdrv, previous_namesW, 0, REG_MULTI_SZ, (LPBYTE)emptyW, sizeof(emptyW)); + RegSetValueExW(hdrv, previous_namesW, 0, REG_MULTI_SZ, (const BYTE*)emptyW, sizeof(emptyW)); if (level > 5) TRACE("level %u for Driver %s is incomplete\n", level, debugstr_w(di.pName)); diff --git a/reactos/dll/win32/mciavi32/mciavi.c b/reactos/dll/win32/mciavi32/mciavi.c index d77525ca4ff..1c15dc55dbc 100644 --- a/reactos/dll/win32/mciavi32/mciavi.c +++ b/reactos/dll/win32/mciavi32/mciavi.c @@ -89,6 +89,7 @@ static DWORD MCIAVI_drvOpen(LPCWSTR str, LPMCI_OPEN_DRIVER_PARMSW modp) wma->hStopEvent = CreateEventW(NULL, FALSE, FALSE, NULL); wma->wDevID = modp->wDeviceID; wma->wCommandTable = mciLoadCommandResource(MCIAVI_hInstance, mciAviWStr, 0); + wma->dwStatus = MCI_MODE_NOT_READY; modp->wCustomCommandTable = wma->wCommandTable; modp->wType = MCI_DEVTYPE_DIGITAL_VIDEO; mciSetDriverData(wma->wDevID, (DWORD_PTR)wma); @@ -301,11 +302,11 @@ DWORD MCIAVI_mciClose(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms) wma = MCIAVI_mciGetOpenDev(wDevID); if (wma == NULL) return MCIERR_INVALID_DEVICE_ID; + MCIAVI_mciStop(wDevID, MCI_WAIT, NULL); + EnterCriticalSection(&wma->cs); if (wma->nUseCount == 1) { - if (wma->dwStatus != MCI_MODE_STOP) - dwRet = MCIAVI_mciStop(wDevID, MCI_WAIT, NULL); MCIAVI_CleanUp(wma); if ((dwFlags & MCI_NOTIFY) && lpParms) { @@ -836,14 +837,14 @@ static DWORD MCIAVI_mciSetAudio(UINT wDevID, DWORD dwFlags, LPMCI_DGV_SETAUDIO_P { WINE_MCIAVI *wma; - FIXME("(%04x, %08x, %p) : stub\n", wDevID, dwFlags, lpParms); - if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK; + FIXME("(%04x, %08x, %p) Item %04x: stub\n", wDevID, dwFlags, lpParms, dwFlags & MCI_DGV_SETAUDIO_ITEM ? lpParms->dwItem : 0); + wma = MCIAVI_mciGetOpenDev(wDevID); if (wma == NULL) return MCIERR_INVALID_DEVICE_ID; - return MCIERR_UNSUPPORTED_FUNCTION; /* like w2k */ + return 0; } /****************************************************************************** @@ -870,14 +871,14 @@ static DWORD MCIAVI_mciSetVideo(UINT wDevID, DWORD dwFlags, LPMCI_DGV_SETVIDEO_P { WINE_MCIAVI *wma; - FIXME("(%04x, %08x, %p) : stub\n", wDevID, dwFlags, lpParms); - if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK; + FIXME("(%04x, %08x, %p) Item %04x: stub\n", wDevID, dwFlags, lpParms, dwFlags & MCI_DGV_SETVIDEO_ITEM ? lpParms->dwItem : 0); + wma = MCIAVI_mciGetOpenDev(wDevID); if (wma == NULL) return MCIERR_INVALID_DEVICE_ID; - return MCIERR_UNSUPPORTED_FUNCTION; /* like w2k */ + return 0; } /****************************************************************************** diff --git a/reactos/dll/win32/mcicda/mcicda.c b/reactos/dll/win32/mcicda/mcicda.c index cf9132cdcff..6ea996a21b9 100644 --- a/reactos/dll/win32/mcicda/mcicda.c +++ b/reactos/dll/win32/mcicda/mcicda.c @@ -420,7 +420,8 @@ static DWORD MCICDA_Open(UINT wDevID, DWORD dwFlags, LPMCI_OPEN_PARMSW lpOpenPar if (dwFlags & MCI_OPEN_ELEMENT) { if (dwFlags & MCI_OPEN_ELEMENT_ID) { WARN("MCI_OPEN_ELEMENT_ID %p! Abort\n", lpOpenParms->lpstrElementName); - return MCIERR_NO_ELEMENT_ALLOWED; + ret = MCIERR_NO_ELEMENT_ALLOWED; + goto the_error; } TRACE("MCI_OPEN_ELEMENT element name: %s\n", debugstr_w(lpOpenParms->lpstrElementName)); if (!isalpha(lpOpenParms->lpstrElementName[0]) || lpOpenParms->lpstrElementName[1] != ':' || @@ -483,6 +484,8 @@ static DWORD MCICDA_Close(UINT wDevID, DWORD dwParam, LPMCI_GENERIC_PARMS lpParm if (wmcda == NULL) return MCIERR_INVALID_DEVICE_ID; + MCICDA_Stop(wDevID, MCI_WAIT, NULL); + if (--wmcda->nUseCount == 0) { CloseHandle(wmcda->handle); } diff --git a/reactos/dll/win32/mciqtz32/mciqtz.c b/reactos/dll/win32/mciqtz32/mciqtz.c index b98e163ebbc..c826de17633 100644 --- a/reactos/dll/win32/mciqtz32/mciqtz.c +++ b/reactos/dll/win32/mciqtz32/mciqtz.c @@ -153,7 +153,8 @@ static DWORD MCIQTZ_mciOpen(UINT wDevID, DWORD dwFlags, MCIQTZ_mciStop(wDevID, MCI_WAIT, NULL); - CoInitializeEx(NULL, COINIT_MULTITHREADED); + hr = CoInitializeEx(NULL, COINIT_MULTITHREADED); + wma->uninit = SUCCEEDED(hr); hr = CoCreateInstance(&CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, &IID_IGraphBuilder, (LPVOID*)&wma->pgraph); if (FAILED(hr)) { @@ -197,7 +198,8 @@ err: IMediaControl_Release(wma->pmctrl); wma->pmctrl = NULL; - CoUninitialize(); + if (wma->uninit) + CoUninitialize(); return MCIERR_INTERNAL; } @@ -220,7 +222,8 @@ static DWORD MCIQTZ_mciClose(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpP if (wma->opened) { IGraphBuilder_Release(wma->pgraph); IMediaControl_Release(wma->pmctrl); - CoUninitialize(); + if (wma->uninit) + CoUninitialize(); wma->opened = FALSE; } diff --git a/reactos/dll/win32/mciqtz32/mciqtz_private.h b/reactos/dll/win32/mciqtz32/mciqtz_private.h index dcfcad0eb4a..caf80de4dc9 100644 --- a/reactos/dll/win32/mciqtz32/mciqtz_private.h +++ b/reactos/dll/win32/mciqtz32/mciqtz_private.h @@ -28,6 +28,7 @@ typedef struct { MCIDEVICEID wDevID; BOOL opened; + BOOL uninit; IGraphBuilder* pgraph; IMediaControl* pmctrl; BOOL started; diff --git a/reactos/dll/win32/mciseq/mcimidi.c b/reactos/dll/win32/mciseq/mcimidi.c index 301428d517d..87753c33dde 100644 --- a/reactos/dll/win32/mciseq/mcimidi.c +++ b/reactos/dll/win32/mciseq/mcimidi.c @@ -62,6 +62,7 @@ typedef struct tagWINE_MCIMIDI { UINT wDevID; /* the MCI one */ HMIDI hMidi; int nUseCount; /* Incremented for each shared open */ + WORD wPort; /* the WINMM device unit */ WORD wNotifyDeviceID; /* MCI device ID with a pending notification */ HANDLE hCallback; /* Callback handle for pending notification */ HMMIO hFile; /* mmio file handle open as Element */ @@ -726,6 +727,7 @@ static DWORD MIDI_mciOpen(UINT wDevID, DWORD dwFlags, LPMCI_OPEN_PARMSW lpParms) wmm->hFile = 0; wmm->hMidi = 0; + wmm->wPort = MIDI_MAPPER; wmm->lpstrElementName = NULL; dwDeviceID = lpParms->wDeviceID; @@ -962,8 +964,8 @@ static DWORD MIDI_mciPlay(UINT wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms) MIDI_mciReadNextEvent(wmm, mmt); /* FIXME == 0 */ } - dwRet = midiOutOpen((LPHMIDIOUT)&wmm->hMidi, MIDIMAPPER, 0L, 0L, CALLBACK_NULL); - /* dwRet = midiInOpen(&wmm->hMidi, MIDIMAPPER, 0L, 0L, CALLBACK_NULL);*/ + dwRet = midiOutOpen((LPHMIDIOUT)&wmm->hMidi, wmm->wPort, 0L, 0L, CALLBACK_NULL); + /* dwRet = midiInOpen(&wmm->hMidi, wmm->wPort, 0L, 0L, CALLBACK_NULL);*/ if (dwRet != MMSYSERR_NOERROR) { return dwRet; } @@ -1290,7 +1292,7 @@ static DWORD MIDI_mciResume(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpPa /************************************************************************** * MIDI_mciSet [internal] */ -static DWORD MIDI_mciSet(UINT wDevID, DWORD dwFlags, LPMCI_SET_PARMS lpParms) +static DWORD MIDI_mciSet(UINT wDevID, DWORD dwFlags, LPMCI_SEQ_SET_PARMS lpParms) { WINE_MCIMIDI* wmm = MIDI_mciGetOpenDev(wDevID); @@ -1359,8 +1361,15 @@ static DWORD MIDI_mciSet(UINT wDevID, DWORD dwFlags, LPMCI_SET_PARMS lpParms) TRACE("MCI_SEQ_SET_SLAVE !\n"); if (dwFlags & MCI_SEQ_SET_OFFSET) TRACE("MCI_SEQ_SET_OFFSET !\n"); - if (dwFlags & MCI_SEQ_SET_PORT) - TRACE("MCI_SEQ_SET_PORT !\n"); + if (dwFlags & MCI_SEQ_SET_PORT) { + TRACE("MCI_SEQ_SET_PORT = %d\n", lpParms->dwPort); + if ((UINT16)lpParms->dwPort != (UINT16)MIDI_MAPPER && + (UINT16)lpParms->dwPort >= midiOutGetNumDevs()) + /* FIXME: input/output port distinction? */ + return MCIERR_SEQ_PORT_NONEXISTENT; + /* FIXME: Native manages to swap the device while playing! */ + wmm->wPort = lpParms->dwPort; + } if (dwFlags & MCI_SEQ_SET_TEMPO) TRACE("MCI_SEQ_SET_TEMPO !\n"); return 0; @@ -1459,8 +1468,13 @@ static DWORD MIDI_mciStatus(UINT wDevID, DWORD dwFlags, LPMCI_STATUS_PARMS lpPar lpParms->dwReturn = 0; break; case MCI_SEQ_STATUS_PORT: - TRACE("MCI_SEQ_STATUS_PORT (%u)!\n", wmm->wDevID); - lpParms->dwReturn = MIDI_MAPPER; + if (wmm->wPort != (UINT16)MIDI_MAPPER) + lpParms->dwReturn = wmm->wPort; + else { + lpParms->dwReturn = MAKEMCIRESOURCE(MIDI_MAPPER, MCI_SEQ_MAPPER_S); + ret = MCI_RESOURCE_RETURNED; + } + TRACE("MCI_SEQ_STATUS_PORT (%u) => %d\n", wmm->wDevID, wmm->wPort); break; case MCI_SEQ_STATUS_TEMPO: TRACE("MCI_SEQ_STATUS_TEMPO !\n"); @@ -1664,7 +1678,7 @@ LRESULT CALLBACK MCIMIDI_DriverProc(DWORD_PTR dwDevID, HDRVR hDriv, UINT wMsg, case MCI_PLAY: return MIDI_mciPlay (dwDevID, dwParam1, (LPMCI_PLAY_PARMS) dwParam2); case MCI_RECORD: return MIDI_mciRecord (dwDevID, dwParam1, (LPMCI_RECORD_PARMS) dwParam2); case MCI_STOP: return MIDI_mciStop (dwDevID, dwParam1, (LPMCI_GENERIC_PARMS) dwParam2); - case MCI_SET: return MIDI_mciSet (dwDevID, dwParam1, (LPMCI_SET_PARMS) dwParam2); + case MCI_SET: return MIDI_mciSet (dwDevID, dwParam1, (LPMCI_SEQ_SET_PARMS) dwParam2); case MCI_PAUSE: return MIDI_mciPause (dwDevID, dwParam1, (LPMCI_GENERIC_PARMS) dwParam2); case MCI_RESUME: return MIDI_mciResume (dwDevID, dwParam1, (LPMCI_GENERIC_PARMS) dwParam2); case MCI_STATUS: return MIDI_mciStatus (dwDevID, dwParam1, (LPMCI_STATUS_PARMS) dwParam2); diff --git a/reactos/dll/win32/mciwave/mciwave.c b/reactos/dll/win32/mciwave/mciwave.c index 24e75ee9dac..87dc260207c 100644 --- a/reactos/dll/win32/mciwave/mciwave.c +++ b/reactos/dll/win32/mciwave/mciwave.c @@ -47,6 +47,8 @@ typedef struct { WAVEFORMATEX wfxRef; LPWAVEFORMATEX lpWaveFormat; /* Points to wfxRef until set by OPEN or RECORD */ BOOL fInput; /* FALSE = Output, TRUE = Input */ + WORD wInput; /* wave input device */ + WORD wOutput; /* wave output device */ volatile WORD dwStatus; /* one from MCI_MODE_xxxx */ DWORD dwMciTimeFormat;/* One of the supported MCI_FORMAT_xxxx */ DWORD dwPosition; /* position in bytes in chunk */ @@ -529,6 +531,7 @@ static LRESULT WAVE_mciOpen(MCIDEVICEID wDevID, DWORD dwFlags, LPMCI_WAVE_OPEN_P wmw->nUseCount++; + wmw->wInput = wmw->wOutput = WAVE_MAPPER; wmw->fInput = FALSE; wmw->hWave = 0; wmw->dwStatus = MCI_MODE_NOT_READY; @@ -831,8 +834,7 @@ static DWORD WAVE_mciPlay(MCIDEVICEID wDevID, DWORD_PTR dwFlags, DWORD_PTR pmt, */ mmioSeek(wmw->hFile, wmw->ckWaveData.dwDataOffset + wmw->dwPosition, SEEK_SET); /* >= 0 */ - /* FIXME: how to choose between several output channels ? here mapper is forced */ - dwRet = waveOutOpen((HWAVEOUT *)&wmw->hWave, WAVE_MAPPER, wmw->lpWaveFormat, + dwRet = waveOutOpen((HWAVEOUT *)&wmw->hWave, wmw->wOutput, wmw->lpWaveFormat, (DWORD_PTR)WAVE_mciPlayCallback, (DWORD_PTR)wmw, CALLBACK_FUNCTION); if (dwRet != 0) { @@ -1064,11 +1066,7 @@ static DWORD WAVE_mciRecord(MCIDEVICEID wDevID, DWORD_PTR dwFlags, DWORD_PTR pmt */ mmioSeek(wmw->hFile, wmw->ckWaveData.dwDataOffset + wmw->dwPosition, SEEK_SET); /* >= 0 */ - /* By default the device will be opened for output, the MCI_CUE function is there to - * change from output to input and back - */ - /* FIXME: how to choose between several output channels ? here mapper is forced */ - dwRet = waveInOpen((HWAVEIN*)&wmw->hWave, WAVE_MAPPER, wmw->lpWaveFormat, + dwRet = waveInOpen((HWAVEIN*)&wmw->hWave, wmw->wInput, wmw->lpWaveFormat, (DWORD_PTR)WAVE_mciRecordCallback, (DWORD_PTR)wmw, CALLBACK_FUNCTION); if (dwRet != MMSYSERR_NOERROR) { @@ -1279,7 +1277,7 @@ static DWORD WAVE_mciSeek(MCIDEVICEID wDevID, DWORD dwFlags, LPMCI_SEEK_PARMS lp /************************************************************************** * WAVE_mciSet [internal] */ -static DWORD WAVE_mciSet(MCIDEVICEID wDevID, DWORD dwFlags, LPMCI_SET_PARMS lpParms) +static DWORD WAVE_mciSet(MCIDEVICEID wDevID, DWORD dwFlags, LPMCI_WAVE_SET_PARMS lpParms) { WINE_MCIWAVE* wmw = WAVE_mciGetOpenDev(wDevID); @@ -1337,44 +1335,64 @@ static DWORD WAVE_mciSet(MCIDEVICEID wDevID, DWORD dwFlags, LPMCI_SET_PARMS lpPa default: WARN("Unknown audio channel %u\n", lpParms->dwAudio); break; } } - if (dwFlags & MCI_WAVE_INPUT) - TRACE("MCI_WAVE_INPUT !\n"); - if (dwFlags & MCI_WAVE_OUTPUT) - TRACE("MCI_WAVE_OUTPUT !\n"); - if (dwFlags & MCI_WAVE_SET_ANYINPUT) - TRACE("MCI_WAVE_SET_ANYINPUT !\n"); - if (dwFlags & MCI_WAVE_SET_ANYOUTPUT) - TRACE("MCI_WAVE_SET_ANYOUTPUT !\n"); + if (dwFlags & MCI_WAVE_INPUT) { + TRACE("MCI_WAVE_INPUT = %d\n", lpParms->wInput); + if (lpParms->wInput >= waveInGetNumDevs()) + return MCIERR_OUTOFRANGE; + if (wmw->wInput != (WORD)lpParms->wInput) + WAVE_mciStop(wDevID, MCI_WAIT, NULL); + wmw->wInput = lpParms->wInput; + } + if (dwFlags & MCI_WAVE_OUTPUT) { + TRACE("MCI_WAVE_OUTPUT = %d\n", lpParms->wOutput); + if (lpParms->wOutput >= waveOutGetNumDevs()) + return MCIERR_OUTOFRANGE; + if (wmw->wOutput != (WORD)lpParms->wOutput) + WAVE_mciStop(wDevID, MCI_WAIT, NULL); + wmw->wOutput = lpParms->wOutput; + } + if (dwFlags & MCI_WAVE_SET_ANYINPUT) { + TRACE("MCI_WAVE_SET_ANYINPUT\n"); + if (wmw->wInput != (WORD)lpParms->wInput) + WAVE_mciStop(wDevID, MCI_WAIT, NULL); + wmw->wInput = WAVE_MAPPER; + } + if (dwFlags & MCI_WAVE_SET_ANYOUTPUT) { + TRACE("MCI_WAVE_SET_ANYOUTPUT\n"); + if (wmw->wOutput != (WORD)lpParms->wOutput) + WAVE_mciStop(wDevID, MCI_WAIT, NULL); + wmw->wOutput = WAVE_MAPPER; + } /* Set wave format parameters is refused after Open or Record.*/ if (dwFlags & MCI_WAVE_SET_FORMATTAG) { - TRACE("MCI_WAVE_SET_FORMATTAG = %d\n", ((LPMCI_WAVE_SET_PARMS)lpParms)->wFormatTag); + TRACE("MCI_WAVE_SET_FORMATTAG = %d\n", lpParms->wFormatTag); if (wmw->lpWaveFormat != &wmw->wfxRef) return MCIERR_NONAPPLICABLE_FUNCTION; - if (((LPMCI_WAVE_SET_PARMS)lpParms)->wFormatTag != WAVE_FORMAT_PCM) + if (lpParms->wFormatTag != WAVE_FORMAT_PCM) return MCIERR_OUTOFRANGE; } if (dwFlags & MCI_WAVE_SET_AVGBYTESPERSEC) { if (wmw->lpWaveFormat != &wmw->wfxRef) return MCIERR_NONAPPLICABLE_FUNCTION; - wmw->wfxRef.nAvgBytesPerSec = ((LPMCI_WAVE_SET_PARMS)lpParms)->nAvgBytesPerSec; + wmw->wfxRef.nAvgBytesPerSec = lpParms->nAvgBytesPerSec; TRACE("MCI_WAVE_SET_AVGBYTESPERSEC = %d\n", wmw->wfxRef.nAvgBytesPerSec); } if (dwFlags & MCI_WAVE_SET_BITSPERSAMPLE) { if (wmw->lpWaveFormat != &wmw->wfxRef) return MCIERR_NONAPPLICABLE_FUNCTION; - wmw->wfxRef.wBitsPerSample = ((LPMCI_WAVE_SET_PARMS)lpParms)->wBitsPerSample; + wmw->wfxRef.wBitsPerSample = lpParms->wBitsPerSample; TRACE("MCI_WAVE_SET_BITSPERSAMPLE = %d\n", wmw->wfxRef.wBitsPerSample); } if (dwFlags & MCI_WAVE_SET_BLOCKALIGN) { if (wmw->lpWaveFormat != &wmw->wfxRef) return MCIERR_NONAPPLICABLE_FUNCTION; - wmw->wfxRef.nBlockAlign = ((LPMCI_WAVE_SET_PARMS)lpParms)->nBlockAlign; + wmw->wfxRef.nBlockAlign = lpParms->nBlockAlign; TRACE("MCI_WAVE_SET_BLOCKALIGN = %d\n", wmw->wfxRef.nBlockAlign); } if (dwFlags & MCI_WAVE_SET_CHANNELS) { if (wmw->lpWaveFormat != &wmw->wfxRef) return MCIERR_NONAPPLICABLE_FUNCTION; - wmw->wfxRef.nChannels = ((LPMCI_WAVE_SET_PARMS)lpParms)->nChannels; + wmw->wfxRef.nChannels = lpParms->nChannels; TRACE("MCI_WAVE_SET_CHANNELS = %d\n", wmw->wfxRef.nChannels); } if (dwFlags & MCI_WAVE_SET_SAMPLESPERSEC) { if (wmw->lpWaveFormat != &wmw->wfxRef) return MCIERR_NONAPPLICABLE_FUNCTION; - wmw->wfxRef.nSamplesPerSec = ((LPMCI_WAVE_SET_PARMS)lpParms)->nSamplesPerSec; + wmw->wfxRef.nSamplesPerSec = lpParms->nSamplesPerSec; TRACE("MCI_WAVE_SET_SAMPLESPERSEC = %d\n", wmw->wfxRef.nSamplesPerSec); } if (dwFlags & MCI_NOTIFY) @@ -1500,24 +1518,34 @@ static DWORD WAVE_mciStatus(MCIDEVICEID wDevID, DWORD dwFlags, LPMCI_STATUS_PARM ret = MCI_RESOURCE_RETURNED; break; case MCI_WAVE_INPUT: - TRACE("MCI_WAVE_INPUT !\n"); - lpParms->dwReturn = 0; - ret = MCIERR_WAVE_INPUTUNSPECIFIED; + if (wmw->wInput != (WORD)WAVE_MAPPER) + lpParms->dwReturn = wmw->wInput; + else { + lpParms->dwReturn = MAKEMCIRESOURCE(WAVE_MAPPER, WAVE_MAPPER_S); + ret = MCI_RESOURCE_RETURNED; + } + TRACE("MCI_WAVE_INPUT => %d\n", (signed)wmw->wInput); break; case MCI_WAVE_OUTPUT: - TRACE("MCI_WAVE_OUTPUT !\n"); - { - UINT id; - if (waveOutGetID(wmw->hWave, &id) == MMSYSERR_NOERROR) { - lpParms->dwReturn = id; - } else { - lpParms->dwReturn = 0; - ret = MCIERR_WAVE_OUTPUTUNSPECIFIED; - } + if (wmw->wOutput != (WORD)WAVE_MAPPER) + lpParms->dwReturn = wmw->wOutput; + else { + lpParms->dwReturn = MAKEMCIRESOURCE(WAVE_MAPPER, WAVE_MAPPER_S); + ret = MCI_RESOURCE_RETURNED; } + TRACE("MCI_WAVE_OUTPUT => %d\n", (signed)wmw->wOutput); break; /* It is always ok to query wave format parameters, * except on auto-open yield MCIERR_UNSUPPORTED_FUNCTION. */ + case MCI_WAVE_STATUS_FORMATTAG: + if (wmw->lpWaveFormat->wFormatTag != WAVE_FORMAT_PCM) + lpParms->dwReturn = wmw->lpWaveFormat->wFormatTag; + else { + lpParms->dwReturn = MAKEMCIRESOURCE(WAVE_FORMAT_PCM, WAVE_FORMAT_PCM_S); + ret = MCI_RESOURCE_RETURNED; + } + TRACE("MCI_WAVE_FORMATTAG => %lu\n", lpParms->dwReturn); + break; case MCI_WAVE_STATUS_AVGBYTESPERSEC: lpParms->dwReturn = wmw->lpWaveFormat->nAvgBytesPerSec; TRACE("MCI_WAVE_STATUS_AVGBYTESPERSEC => %lu\n", lpParms->dwReturn); @@ -1534,10 +1562,6 @@ static DWORD WAVE_mciStatus(MCIDEVICEID wDevID, DWORD dwFlags, LPMCI_STATUS_PARM lpParms->dwReturn = wmw->lpWaveFormat->nChannels; TRACE("MCI_WAVE_STATUS_CHANNELS => %lu\n", lpParms->dwReturn); break; - case MCI_WAVE_STATUS_FORMATTAG: - lpParms->dwReturn = wmw->lpWaveFormat->wFormatTag; - TRACE("MCI_WAVE_FORMATTAG => %lu\n", lpParms->dwReturn); - break; case MCI_WAVE_STATUS_SAMPLESPERSEC: lpParms->dwReturn = wmw->lpWaveFormat->nSamplesPerSec; TRACE("MCI_WAVE_STATUS_SAMPLESPERSEC => %lu\n", lpParms->dwReturn); @@ -1705,7 +1729,7 @@ LRESULT CALLBACK MCIWAVE_DriverProc(DWORD_PTR dwDevID, HDRVR hDriv, UINT wMsg, case MCI_PLAY: return WAVE_mciPlay (dwDevID, dwParam1, dwParam2, NULL); case MCI_RECORD: return WAVE_mciRecord (dwDevID, dwParam1, dwParam2, NULL); case MCI_STOP: return WAVE_mciStop (dwDevID, dwParam1, (LPMCI_GENERIC_PARMS) dwParam2); - case MCI_SET: return WAVE_mciSet (dwDevID, dwParam1, (LPMCI_SET_PARMS) dwParam2); + case MCI_SET: return WAVE_mciSet (dwDevID, dwParam1, (LPMCI_WAVE_SET_PARMS) dwParam2); case MCI_PAUSE: return WAVE_mciPause (dwDevID, dwParam1, (LPMCI_GENERIC_PARMS) dwParam2); case MCI_RESUME: return WAVE_mciResume (dwDevID, dwParam1, (LPMCI_GENERIC_PARMS) dwParam2); case MCI_STATUS: return WAVE_mciStatus (dwDevID, dwParam1, (LPMCI_STATUS_PARMS) dwParam2); diff --git a/reactos/dll/win32/mscoree/mscoree.rbuild b/reactos/dll/win32/mscoree/mscoree.rbuild index 2fa0743f07a..a014334a962 100644 --- a/reactos/dll/win32/mscoree/mscoree.rbuild +++ b/reactos/dll/win32/mscoree/mscoree.rbuild @@ -5,6 +5,7 @@ wine advapi32 + shell32 uuid corruntimehost.c mscoree_main.c diff --git a/reactos/dll/win32/mscoree/mscoree_main.c b/reactos/dll/win32/mscoree/mscoree_main.c index 5b20c854c2e..0e6f25204cc 100644 --- a/reactos/dll/win32/mscoree/mscoree_main.c +++ b/reactos/dll/win32/mscoree/mscoree_main.c @@ -21,11 +21,14 @@ #include +#include "wine/unicode.h" #include "windef.h" #include "winbase.h" #include "winuser.h" +#include "winnls.h" #include "winreg.h" #include "ole2.h" +#include "shellapi.h" #include "initguid.h" #include "cor.h" @@ -36,26 +39,25 @@ WINE_DEFAULT_DEBUG_CHANNEL( mscoree ); -static LPWSTR get_mono_exe(void) +static BOOL get_mono_path(LPWSTR path) { - static const WCHAR mono_exe[] = {'b','i','n','\\','m','o','n','o','.','e','x','e',' ',0}; static const WCHAR mono_key[] = {'S','o','f','t','w','a','r','e','\\','N','o','v','e','l','l','\\','M','o','n','o',0}; static const WCHAR defaul_clr[] = {'D','e','f','a','u','l','t','C','L','R',0}; static const WCHAR install_root[] = {'S','d','k','I','n','s','t','a','l','l','R','o','o','t',0}; static const WCHAR slash[] = {'\\',0}; - WCHAR version[64], version_key[MAX_PATH], root[MAX_PATH], *ret; - DWORD len, size; + WCHAR version[64], version_key[MAX_PATH]; + DWORD len; HKEY key; if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, mono_key, 0, KEY_READ, &key)) - return NULL; + return FALSE; len = sizeof(version); if (RegQueryValueExW(key, defaul_clr, 0, NULL, (LPBYTE)version, &len)) { RegCloseKey(key); - return NULL; + return FALSE; } RegCloseKey(key); @@ -64,24 +66,129 @@ static LPWSTR get_mono_exe(void) lstrcatW(version_key, version); if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, version_key, 0, KEY_READ, &key)) - return NULL; + return FALSE; - len = sizeof(root); - if (RegQueryValueExW(key, install_root, 0, NULL, (LPBYTE)root, &len)) + len = sizeof(WCHAR) * MAX_PATH; + if (RegQueryValueExW(key, install_root, 0, NULL, (LPBYTE)path, &len)) { RegCloseKey(key); - return NULL; + return FALSE; } RegCloseKey(key); - size = len + sizeof(slash) + sizeof(mono_exe); - if (!(ret = HeapAlloc(GetProcessHeap(), 0, size))) return NULL; + return TRUE; +} - lstrcpyW(ret, root); - lstrcatW(ret, slash); - lstrcatW(ret, mono_exe); +static CRITICAL_SECTION mono_lib_cs; +static CRITICAL_SECTION_DEBUG mono_lib_cs_debug = +{ + 0, 0, &mono_lib_cs, + { &mono_lib_cs_debug.ProcessLocksList, + &mono_lib_cs_debug.ProcessLocksList }, + 0, 0, { (DWORD_PTR)(__FILE__ ": mono_lib_cs") } +}; +static CRITICAL_SECTION mono_lib_cs = { &mono_lib_cs_debug, -1, 0, 0, 0, 0 }; - return ret; +HMODULE mono_handle; + +void (*mono_config_parse)(const char *filename); +MonoAssembly* (*mono_domain_assembly_open) (MonoDomain *domain, const char *name); +void (*mono_jit_cleanup)(MonoDomain *domain); +int (*mono_jit_exec)(MonoDomain *domain, MonoAssembly *assembly, int argc, char *argv[]); +MonoDomain* (*mono_jit_init)(const char *file); +int (*mono_jit_set_trace_options)(const char* options); +void (*mono_set_dirs)(const char *assembly_dir, const char *config_dir); + +static void set_environment(LPCWSTR bin_path) +{ + WCHAR path_env[MAX_PATH]; + int len; + + static const WCHAR pathW[] = {'P','A','T','H',0}; + + /* We have to modify PATH as Mono loads other DLLs from this directory. */ + GetEnvironmentVariableW(pathW, path_env, sizeof(path_env)/sizeof(WCHAR)); + len = strlenW(path_env); + path_env[len++] = ';'; + strcpyW(path_env+len, bin_path); + SetEnvironmentVariableW(pathW, path_env); +} + +static HMODULE load_mono(void) +{ + static const WCHAR mono_dll[] = {'\\','b','i','n','\\','m','o','n','o','.','d','l','l',0}; + static const WCHAR libmono_dll[] = {'\\','b','i','n','\\','l','i','b','m','o','n','o','.','d','l','l',0}; + static const WCHAR bin[] = {'\\','b','i','n',0}; + static const WCHAR lib[] = {'\\','l','i','b',0}; + static const WCHAR etc[] = {'\\','e','t','c',0}; + HMODULE result; + WCHAR mono_path[MAX_PATH], mono_dll_path[MAX_PATH+16], mono_bin_path[MAX_PATH+4]; + WCHAR mono_lib_path[MAX_PATH+4], mono_etc_path[MAX_PATH+4]; + char mono_lib_path_a[MAX_PATH], mono_etc_path_a[MAX_PATH]; + + EnterCriticalSection(&mono_lib_cs); + + if (!mono_handle) + { + if (!get_mono_path(mono_path)) goto end; + + strcpyW(mono_bin_path, mono_path); + strcatW(mono_bin_path, bin); + set_environment(mono_bin_path); + + strcpyW(mono_lib_path, mono_path); + strcatW(mono_lib_path, lib); + WideCharToMultiByte(CP_UTF8, 0, mono_lib_path, -1, mono_lib_path_a, MAX_PATH, NULL, NULL); + + strcpyW(mono_etc_path, mono_path); + strcatW(mono_etc_path, etc); + WideCharToMultiByte(CP_UTF8, 0, mono_etc_path, -1, mono_etc_path_a, MAX_PATH, NULL, NULL); + + strcpyW(mono_dll_path, mono_path); + strcatW(mono_dll_path, mono_dll); + mono_handle = LoadLibraryW(mono_dll_path); + + if (!mono_handle) + { + strcpyW(mono_dll_path, mono_path); + strcatW(mono_dll_path, libmono_dll); + mono_handle = LoadLibraryW(mono_dll_path); + } + + if (!mono_handle) goto end; + +#define LOAD_MONO_FUNCTION(x) do { \ + x = (void*)GetProcAddress(mono_handle, #x); \ + if (!x) { \ + mono_handle = NULL; \ + goto end; \ + } \ +} while (0); + + LOAD_MONO_FUNCTION(mono_config_parse); + LOAD_MONO_FUNCTION(mono_domain_assembly_open); + LOAD_MONO_FUNCTION(mono_jit_cleanup); + LOAD_MONO_FUNCTION(mono_jit_exec); + LOAD_MONO_FUNCTION(mono_jit_init); + LOAD_MONO_FUNCTION(mono_jit_set_trace_options); + LOAD_MONO_FUNCTION(mono_set_dirs); + +#undef LOAD_MONO_FUNCTION + + mono_set_dirs(mono_lib_path_a, mono_etc_path_a); + + mono_config_parse(NULL); + } + +end: + result = mono_handle; + + LeaveCriticalSection(&mono_lib_cs); + + if (!result) + MESSAGE("wine: Install the Windows version of Mono to run .NET executables\n"); + + return result; } HRESULT WINAPI CorBindToRuntimeHost(LPCWSTR pwszVersion, LPCWSTR pwszBuildFlavor, @@ -89,20 +196,16 @@ HRESULT WINAPI CorBindToRuntimeHost(LPCWSTR pwszVersion, LPCWSTR pwszBuildFlavor DWORD startupFlags, REFCLSID rclsid, REFIID riid, LPVOID *ppv) { - WCHAR *mono_exe; - FIXME("(%s, %s, %s, %p, %d, %s, %s, %p): semi-stub!\n", debugstr_w(pwszVersion), debugstr_w(pwszBuildFlavor), debugstr_w(pwszHostConfigFile), pReserved, startupFlags, debugstr_guid(rclsid), debugstr_guid(riid), ppv); - if (!(mono_exe = get_mono_exe())) + if (!get_mono_path(NULL)) { MESSAGE("wine: Install the Windows version of Mono to run .NET executables\n"); return E_FAIL; } - HeapFree(GetProcessHeap(), 0, mono_exe); - return S_OK; } @@ -138,68 +241,73 @@ BOOL WINAPI _CorDllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) return TRUE; } +static void get_utf8_args(int *argc, char ***argv) +{ + WCHAR **argvw; + int size=0, i; + char *current_arg; + + argvw = CommandLineToArgvW(GetCommandLineW(), argc); + + for (i=0; i<*argc; i++) + { + size += sizeof(char*); + size += WideCharToMultiByte(CP_UTF8, 0, argvw[i], -1, NULL, 0, NULL, NULL); + } + size += sizeof(char*); + + *argv = HeapAlloc(GetProcessHeap(), 0, size); + current_arg = (char*)(*argv + *argc + 1); + + for (i=0; i<*argc; i++) + { + (*argv)[i] = current_arg; + current_arg += WideCharToMultiByte(CP_UTF8, 0, argvw[i], -1, current_arg, size, NULL, NULL); + } + + (*argv)[*argc] = NULL; + + HeapFree(GetProcessHeap(), 0, argvw); +} + __int32 WINAPI _CorExeMain(void) { - STARTUPINFOW si; - PROCESS_INFORMATION pi; - WCHAR *mono_exe, *cmd_line; - DWORD size, exit_code; - static const WCHAR WINE_MONO_TRACE[]={'W','I','N','E','_','M','O','N','O','_','T','R','A','C','E',0}; - static const WCHAR trace_switch_start[]={'"','-','-','t','r','a','c','e','=',0}; - static const WCHAR trace_switch_end[]={'"',' ',0}; + int exit_code; int trace_size; - WCHAR trace_setting[256]; + char trace_setting[256]; + int argc; + char **argv; + MonoDomain *domain; + MonoAssembly *assembly; + char filename[MAX_PATH]; - if (!(mono_exe = get_mono_exe())) + if (!load_mono()) { - MESSAGE("install the Windows version of Mono to run .NET executables\n"); return -1; } - trace_size = GetEnvironmentVariableW(WINE_MONO_TRACE, trace_setting, sizeof(trace_setting)/sizeof(WCHAR)); + get_utf8_args(&argc, &argv); - size = (lstrlenW(mono_exe) + lstrlenW(GetCommandLineW()) + 1) * sizeof(WCHAR); - - if (trace_size) - size += (trace_size + lstrlenW(trace_switch_start) + lstrlenW(trace_switch_end)) * sizeof(WCHAR); - - if (!(cmd_line = HeapAlloc(GetProcessHeap(), 0, size))) - { - HeapFree(GetProcessHeap(), 0, mono_exe); - return -1; - } - - lstrcpyW(cmd_line, mono_exe); - HeapFree(GetProcessHeap(), 0, mono_exe); + trace_size = GetEnvironmentVariableA("WINE_MONO_TRACE", trace_setting, sizeof(trace_setting)); if (trace_size) { - lstrcatW(cmd_line, trace_switch_start); - lstrcatW(cmd_line, trace_setting); - lstrcatW(cmd_line, trace_switch_end); + mono_jit_set_trace_options(trace_setting); } - lstrcatW(cmd_line, GetCommandLineW()); + GetModuleFileNameA(NULL, filename, MAX_PATH); - TRACE("new command line: %s\n", debugstr_w(cmd_line)); + domain = mono_jit_init(filename); - memset(&si, 0, sizeof(si)); - si.cb = sizeof(si); - if (!CreateProcessW(NULL, cmd_line, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) - { - HeapFree(GetProcessHeap(), 0, cmd_line); - return -1; - } - HeapFree(GetProcessHeap(), 0, cmd_line); + assembly = mono_domain_assembly_open(domain, filename); - /* wait for the process to exit */ - WaitForSingleObject(pi.hProcess, INFINITE); - GetExitCodeProcess(pi.hProcess, &exit_code); + exit_code = mono_jit_exec(domain, assembly, argc, argv); - CloseHandle(pi.hThread); - CloseHandle(pi.hProcess); + mono_jit_cleanup(domain); - return (int)exit_code; + HeapFree(GetProcessHeap(), 0, argv); + + return exit_code; } __int32 WINAPI _CorExeMain2(PBYTE ptrMemory, DWORD cntMemory, LPWSTR imageName, LPWSTR loaderName, LPWSTR cmdLine) diff --git a/reactos/dll/win32/mscoree/mscoree_private.h b/reactos/dll/win32/mscoree/mscoree_private.h index f329455fff1..f14da1d15cd 100644 --- a/reactos/dll/win32/mscoree/mscoree_private.h +++ b/reactos/dll/win32/mscoree/mscoree_private.h @@ -22,5 +22,18 @@ extern IUnknown* create_corruntimehost(void); +/* Mono 2.6 embedding */ +typedef struct _MonoDomain MonoDomain; +typedef struct _MonoAssembly MonoAssembly; + +extern HMODULE mono_handle; + +extern void (*mono_config_parse)(const char *filename); +extern MonoAssembly* (*mono_domain_assembly_open) (MonoDomain *domain, const char *name); +extern void (*mono_jit_cleanup)(MonoDomain *domain); +extern int (*mono_jit_exec)(MonoDomain *domain, MonoAssembly *assembly, int argc, char *argv[]); +extern MonoDomain* (*mono_jit_init)(const char *file); +extern int (*mono_jit_set_trace_options)(const char* options); +extern void (*mono_set_dirs)(const char *assembly_dir, const char *config_dir); #endif /* __MSCOREE_PRIVATE__ */ diff --git a/reactos/dll/win32/msctf/displayattributemgr.c b/reactos/dll/win32/msctf/displayattributemgr.c new file mode 100644 index 00000000000..75248cd4393 --- /dev/null +++ b/reactos/dll/win32/msctf/displayattributemgr.c @@ -0,0 +1,139 @@ +/* + * ITfDisplayAttributeMgr implementation + * + * Copyright 2010 CodeWeavers, Aric Stewart + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#define COBJMACROS + +#include "wine/debug.h" +#include "winbase.h" +#include "winreg.h" +#include "shlwapi.h" + +#include "msctf.h" +#include "msctf_internal.h" + +WINE_DEFAULT_DEBUG_CHANNEL(msctf); + +typedef struct tagDisplayAttributeMgr { + const ITfDisplayAttributeMgrVtbl *DisplayAttributeMgrVtbl; + + LONG refCount; + +} DisplayAttributeMgr; + +static void DisplayAttributeMgr_Destructor(DisplayAttributeMgr *This) +{ + TRACE("destroying %p\n", This); + + HeapFree(GetProcessHeap(),0,This); +} + +static HRESULT WINAPI DisplayAttributeMgr_QueryInterface(ITfDisplayAttributeMgr *iface, REFIID iid, LPVOID *ppvOut) +{ + DisplayAttributeMgr *This = (DisplayAttributeMgr *)iface; + *ppvOut = NULL; + + if (IsEqualIID(iid, &IID_IUnknown) || IsEqualIID(iid, &IID_ITfDisplayAttributeMgr)) + { + *ppvOut = This; + } + + if (*ppvOut) + { + IUnknown_AddRef(iface); + return S_OK; + } + + WARN("unsupported interface: %s\n", debugstr_guid(iid)); + return E_NOINTERFACE; +} + +static ULONG WINAPI DisplayAttributeMgr_AddRef(ITfDisplayAttributeMgr *iface) +{ + DisplayAttributeMgr *This = (DisplayAttributeMgr *)iface; + return InterlockedIncrement(&This->refCount); +} + +static ULONG WINAPI DisplayAttributeMgr_Release(ITfDisplayAttributeMgr *iface) +{ + DisplayAttributeMgr *This = (DisplayAttributeMgr *)iface; + ULONG ret; + + ret = InterlockedDecrement(&This->refCount); + if (ret == 0) + DisplayAttributeMgr_Destructor(This); + return ret; +} + +/***************************************************** + * ITfDisplayAttributeMgr functions + *****************************************************/ + +static HRESULT WINAPI DisplayAttributeMgr_OnUpdateInfo(ITfDisplayAttributeMgr *iface) +{ + DisplayAttributeMgr *This = (DisplayAttributeMgr *)iface; + + FIXME("STUB:(%p)\n",This); + return E_NOTIMPL; +} + +static HRESULT WINAPI DisplayAttributeMgr_EnumDisplayAttributeInfo(ITfDisplayAttributeMgr *iface, IEnumTfDisplayAttributeInfo **ppEnum) +{ + DisplayAttributeMgr *This = (DisplayAttributeMgr *)iface; + + FIXME("STUB:(%p)\n",This); + return E_NOTIMPL; +} + +static HRESULT WINAPI DisplayAttributeMgr_GetDisplayAttributeInfo(ITfDisplayAttributeMgr *iface, REFGUID guid, ITfDisplayAttributeInfo **ppInfo, CLSID *pclsidOwner) +{ + DisplayAttributeMgr *This = (DisplayAttributeMgr *)iface; + + FIXME("STUB:(%p)\n",This); + return E_NOTIMPL; +} + +static const ITfDisplayAttributeMgrVtbl DisplayAttributeMgr_DisplayAttributeMgrVtbl = +{ + DisplayAttributeMgr_QueryInterface, + DisplayAttributeMgr_AddRef, + DisplayAttributeMgr_Release, + + DisplayAttributeMgr_OnUpdateInfo, + DisplayAttributeMgr_EnumDisplayAttributeInfo, + DisplayAttributeMgr_GetDisplayAttributeInfo +}; + +HRESULT DisplayAttributeMgr_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut) +{ + DisplayAttributeMgr *This; + if (pUnkOuter) + return CLASS_E_NOAGGREGATION; + + This = HeapAlloc(GetProcessHeap(),0,sizeof(DisplayAttributeMgr)); + if (This == NULL) + return E_OUTOFMEMORY; + + This->DisplayAttributeMgrVtbl= &DisplayAttributeMgr_DisplayAttributeMgrVtbl; + This->refCount = 1; + + TRACE("returning %p\n", This); + *ppOut = (IUnknown *)This; + return S_OK; +} diff --git a/reactos/dll/win32/msctf/inputprocessor.c b/reactos/dll/win32/msctf/inputprocessor.c index ba4a76d83b5..34e35c41cb1 100644 --- a/reactos/dll/win32/msctf/inputprocessor.c +++ b/reactos/dll/win32/msctf/inputprocessor.c @@ -279,8 +279,8 @@ static HRESULT WINAPI InputProcessorProfiles_AddLanguageProfile( if (!res) { DWORD zero = 0x0; - RegSetValueExW(fmtkey, desc, 0, REG_SZ, (LPBYTE)pchDesc, cchDesc * sizeof(WCHAR)); - RegSetValueExW(fmtkey, icnf, 0, REG_SZ, (LPBYTE)pchIconFile, cchFile * sizeof(WCHAR)); + RegSetValueExW(fmtkey, desc, 0, REG_SZ, (const BYTE*)pchDesc, cchDesc * sizeof(WCHAR)); + RegSetValueExW(fmtkey, icnf, 0, REG_SZ, (const BYTE*)pchIconFile, cchFile * sizeof(WCHAR)); RegSetValueExW(fmtkey, icni, 0, REG_DWORD, (LPBYTE)&uIconIndex, sizeof(DWORD)); if (disposition == REG_CREATED_NEW_KEY) RegSetValueExW(fmtkey, szwEnable, 0, REG_DWORD, (LPBYTE)&zero, sizeof(DWORD)); diff --git a/reactos/dll/win32/msctf/msctf.c b/reactos/dll/win32/msctf/msctf.c index 62d1ff2abd8..759fe7ec579 100644 --- a/reactos/dll/win32/msctf/msctf.c +++ b/reactos/dll/win32/msctf/msctf.c @@ -88,6 +88,7 @@ static const struct { {&CLSID_TF_InputProcessorProfiles, InputProcessorProfiles_Constructor}, {&CLSID_TF_CategoryMgr, CategoryMgr_Constructor}, {&CLSID_TF_LangBarMgr, LangBarMgr_Constructor}, + {&CLSID_TF_DisplayAttributeMgr, DisplayAttributeMgr_Constructor}, {NULL, NULL} }; diff --git a/reactos/dll/win32/msctf/msctf.rbuild b/reactos/dll/win32/msctf/msctf.rbuild index de8f52bf64d..cb072f676e7 100644 --- a/reactos/dll/win32/msctf/msctf.rbuild +++ b/reactos/dll/win32/msctf/msctf.rbuild @@ -11,6 +11,7 @@ categorymgr.c compartmentmgr.c context.c + displayattributemgr.c documentmgr.c inputprocessor.c langbarmgr.c diff --git a/reactos/dll/win32/msctf/msctf_internal.h b/reactos/dll/win32/msctf/msctf_internal.h index 57423e996fc..9aaaad0fb1b 100644 --- a/reactos/dll/win32/msctf/msctf_internal.h +++ b/reactos/dll/win32/msctf/msctf_internal.h @@ -41,6 +41,7 @@ extern HRESULT Range_Constructor(ITfContext *context, ITextStoreACP *textstore, extern HRESULT CompartmentMgr_Constructor(IUnknown *pUnkOuter, REFIID riid, IUnknown **ppOut); extern HRESULT CompartmentMgr_Destructor(ITfCompartmentMgr *This); extern HRESULT LangBarMgr_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut); +extern HRESULT DisplayAttributeMgr_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut); extern HRESULT Context_Initialize(ITfContext *cxt, ITfDocumentMgr *manager); extern HRESULT Context_Uninitialize(ITfContext *cxt); diff --git a/reactos/dll/win32/msctf/regsvr.c b/reactos/dll/win32/msctf/regsvr.c index 2af1f241154..65ebb1da122 100644 --- a/reactos/dll/win32/msctf/regsvr.c +++ b/reactos/dll/win32/msctf/regsvr.c @@ -469,6 +469,13 @@ static struct regsvr_coclass const coclass_list[] = { "msctf.dll", "Apartment" }, + { + &CLSID_TF_DisplayAttributeMgr, + "TF_DisplayAttributeMgr", + NULL, + "msctf.dll", + "Apartment" + }, { NULL } /* list terminator */ }; diff --git a/reactos/dll/win32/msgsm32.acm/msgsm32.c b/reactos/dll/win32/msgsm32.acm/msgsm32.c index e760ac3a0ed..12dfef91d3b 100644 --- a/reactos/dll/win32/msgsm32.acm/msgsm32.c +++ b/reactos/dll/win32/msgsm32.acm/msgsm32.c @@ -179,10 +179,10 @@ static DWORD GSM_FormatValidate(const WAVEFORMATEX *wfx) WARN("GSM nBlockAlign %u\n", wfx->nBlockAlign); return 0; } - if (((GSM610WAVEFORMAT*)wfx)->wSamplesPerBlock != 320) + if (((const GSM610WAVEFORMAT*)wfx)->wSamplesPerBlock != 320) { WARN("GSM wSamplesPerBlock %u\n", - ((GSM610WAVEFORMAT*)wfx)->wSamplesPerBlock); + ((const GSM610WAVEFORMAT*)wfx)->wSamplesPerBlock); return 0; } if (wfx->nAvgBytesPerSec != wfx->nSamplesPerSec * 65 / 320) diff --git a/reactos/dll/win32/mshtml/dispex.c b/reactos/dll/win32/mshtml/dispex.c index 4b1bd882e5e..de0c94871f6 100644 --- a/reactos/dll/win32/mshtml/dispex.c +++ b/reactos/dll/win32/mshtml/dispex.c @@ -52,8 +52,11 @@ struct dispex_data_t { typedef struct { VARIANT var; LPWSTR name; + DWORD flags; } dynamic_prop_t; +#define DYNPROP_DELETED 0x01 + typedef struct { DispatchEx dispex; const IUnknownVtbl *lpIUnknownVtbl; @@ -245,12 +248,12 @@ static void add_func_info(dispex_data_t *data, DWORD *size, tid_t tid, const FUN static int dispid_cmp(const void *p1, const void *p2) { - return ((func_info_t*)p1)->id - ((func_info_t*)p2)->id; + return ((const func_info_t*)p1)->id - ((const func_info_t*)p2)->id; } static int func_name_cmp(const void *p1, const void *p2) { - return strcmpiW((*(func_info_t**)p1)->name, (*(func_info_t**)p2)->name); + return strcmpiW((*(func_info_t* const*)p1)->name, (*(func_info_t* const*)p2)->name); } static dispex_data_t *preprocess_dispex_data(DispatchEx *This) @@ -319,7 +322,7 @@ static dispex_data_t *preprocess_dispex_data(DispatchEx *This) static int id_cmp(const void *p1, const void *p2) { - return *(DISPID*)p1 - *(DISPID*)p2; + return *(const DISPID*)p1 - *(const DISPID*)p2; } HRESULT get_dispids(tid_t tid, DWORD *ret_size, DISPID **ret) @@ -442,7 +445,7 @@ static HRESULT get_dynamic_prop(DispatchEx *This, const WCHAR *name, DWORD flags { const BOOL alloc = flags & fdexNameEnsure; dispex_dynamic_data_t *data; - unsigned i; + dynamic_prop_t *prop; data = get_dynamic_data(This, alloc); if(!data) { @@ -453,9 +456,14 @@ static HRESULT get_dynamic_prop(DispatchEx *This, const WCHAR *name, DWORD flags return DISP_E_UNKNOWNNAME; } - for(i=0; i < data->prop_cnt; i++) { - if(flags & fdexNameCaseInsensitive ? !strcmpiW(data->props[i].name, name) : !strcmpW(data->props[i].name, name)) { - *ret = data->props+i; + for(prop = data->props; prop < data->props+data->prop_cnt; prop++) { + if(flags & fdexNameCaseInsensitive ? !strcmpiW(prop->name, name) : !strcmpW(prop->name, name)) { + if(prop->flags & DYNPROP_DELETED) { + if(!alloc) + return DISP_E_UNKNOWNNAME; + prop->flags &= ~DYNPROP_DELETED; + } + *ret = prop; return S_OK; } } @@ -481,10 +489,16 @@ static HRESULT get_dynamic_prop(DispatchEx *This, const WCHAR *name, DWORD flags data->buf_size <<= 1; } - data->props[data->prop_cnt].name = heap_strdupW(name); - VariantInit(&data->props[data->prop_cnt].var); - *ret = data->props + data->prop_cnt++; + prop = data->props + data->prop_cnt; + prop->name = heap_strdupW(name); + if(!prop->name) + return E_OUTOFMEMORY; + + VariantInit(&prop->var); + prop->flags = 0; + data->prop_cnt++; + *ret = prop; return S_OK; } @@ -729,6 +743,109 @@ static HRESULT get_builtin_func(dispex_data_t *data, DISPID id, func_info_t **re return DISP_E_UNKNOWNNAME; } +static HRESULT get_builtin_id(DispatchEx *This, BSTR name, DWORD grfdex, DISPID *ret) +{ + dispex_data_t *data; + int min, max, n, c; + + data = get_dispex_data(This); + if(!data) + return E_FAIL; + + min = 0; + max = data->func_cnt-1; + + while(min <= max) { + n = (min+max)/2; + + c = strcmpiW(data->name_table[n]->name, name); + if(!c) { + if((grfdex & fdexNameCaseSensitive) && strcmpW(data->name_table[n]->name, name)) + break; + + *ret = data->name_table[n]->id; + return S_OK; + } + + if(c > 0) + max = n-1; + else + min = n+1; + } + + if(This->data->vtbl && This->data->vtbl->get_dispid) { + HRESULT hres; + + hres = This->data->vtbl->get_dispid(This->outer, name, grfdex, ret); + if(hres != DISP_E_UNKNOWNNAME) + return hres; + } + + return DISP_E_UNKNOWNNAME; +} + +static HRESULT invoke_builtin_prop(DispatchEx *This, DISPID id, LCID lcid, WORD flags, DISPPARAMS *dp, + VARIANT *res, EXCEPINFO *ei, IServiceProvider *caller) +{ + dispex_data_t *data; + func_info_t *func; + HRESULT hres; + + data = get_dispex_data(This); + if(!data) + return E_FAIL; + + hres = get_builtin_func(data, id, &func); + if(id == DISPID_VALUE && hres == DISP_E_UNKNOWNNAME) + return dispex_value(This, lcid, flags, dp, res, ei, caller); + if(FAILED(hres)) + return hres; + + if(func->func_disp_idx == -1) + hres = typeinfo_invoke(This, func, flags, dp, res, ei); + else + hres = function_invoke(This, func, flags, dp, res, ei); + + return hres; +} + +HRESULT remove_prop(DispatchEx *This, BSTR name, VARIANT_BOOL *success) +{ + dynamic_prop_t *prop; + DISPID id; + HRESULT hres; + + hres = get_builtin_id(This, name, 0, &id); + if(hres == S_OK) { + DISPID named_id = DISPID_PROPERTYPUT; + VARIANT var; + DISPPARAMS dp = {&var,&named_id,1,1}; + EXCEPINFO ei; + + V_VT(&var) = VT_EMPTY; + memset(&ei, 0, sizeof(ei)); + hres = invoke_builtin_prop(This, id, 0, DISPATCH_PROPERTYPUT, &dp, NULL, &ei, NULL); + if(FAILED(hres)) + return hres; + + *success = VARIANT_TRUE; + return S_OK; + } + + hres = get_dynamic_prop(This, name, 0, &prop); + if(FAILED(hres)) { + if(hres != DISP_E_UNKNOWNNAME) + return hres; + *success = VARIANT_FALSE; + return S_OK; + } + + VariantClear(&prop->var); + prop->flags |= DYNPROP_DELETED; + *success = VARIANT_TRUE; + return S_OK; +} + #define DISPATCHEX_THIS(iface) DEFINE_THIS(DispatchEx, IDispatchEx, iface) static HRESULT WINAPI DispatchEx_QueryInterface(IDispatchEx *iface, REFIID riid, void **ppv) @@ -815,8 +932,6 @@ static HRESULT WINAPI DispatchEx_GetDispID(IDispatchEx *iface, BSTR bstrName, DW { DispatchEx *This = DISPATCHEX_THIS(iface); dynamic_prop_t *dprop; - dispex_data_t *data; - int min, max, n, c; HRESULT hres; TRACE("(%p)->(%s %x %p)\n", This, debugstr_w(bstrName), grfdex, pid); @@ -824,38 +939,9 @@ static HRESULT WINAPI DispatchEx_GetDispID(IDispatchEx *iface, BSTR bstrName, DW if(grfdex & ~(fdexNameCaseSensitive|fdexNameCaseInsensitive|fdexNameEnsure|fdexNameImplicit|FDEX_VERSION_MASK)) FIXME("Unsupported grfdex %x\n", grfdex); - data = get_dispex_data(This); - if(!data) - return E_FAIL; - - min = 0; - max = data->func_cnt-1; - - while(min <= max) { - n = (min+max)/2; - - c = strcmpiW(data->name_table[n]->name, bstrName); - if(!c) { - if((grfdex & fdexNameCaseSensitive) && strcmpW(data->name_table[n]->name, bstrName)) - break; - - *pid = data->name_table[n]->id; - return S_OK; - } - - if(c > 0) - max = n-1; - else - min = n+1; - } - - if(This->data->vtbl && This->data->vtbl->get_dispid) { - HRESULT hres; - - hres = This->data->vtbl->get_dispid(This->outer, bstrName, grfdex, pid); - if(hres != DISP_E_UNKNOWNNAME) - return hres; - } + hres = get_builtin_id(This, bstrName, grfdex, pid); + if(hres != DISP_E_UNKNOWNNAME) + return hres; hres = get_dynamic_prop(This, bstrName, grfdex, &dprop); if(FAILED(hres)) @@ -869,8 +955,6 @@ static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lc VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller) { DispatchEx *This = DISPATCHEX_THIS(iface); - dispex_data_t *data; - func_info_t *func; HRESULT hres; TRACE("(%p)->(%x %x %x %p %p %p %p)\n", This, id, lcid, wFlags, pdp, pvarRes, pei, pspCaller); @@ -893,12 +977,12 @@ static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lc if(is_dynamic_dispid(id)) { DWORD idx = id - DISPID_DYNPROP_0; - VARIANT *var; + dynamic_prop_t *prop; if(!This->dynamic_data || This->dynamic_data->prop_cnt <= idx) return DISP_E_UNKNOWNNAME; - var = &This->dynamic_data->props[idx].var; + prop = This->dynamic_data->props+idx; switch(wFlags) { case DISPATCH_METHOD|DISPATCH_PROPERTYGET: @@ -909,8 +993,8 @@ static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lc DISPPARAMS dp = {NULL, &named_arg, 0, 1}; IDispatchEx *dispex; - if(V_VT(var) != VT_DISPATCH) { - FIXME("invoke vt %d\n", V_VT(var)); + if(V_VT(&prop->var) != VT_DISPATCH) { + FIXME("invoke %s\n", debugstr_variant(&prop->var)); return E_NOTIMPL; } @@ -929,14 +1013,14 @@ static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lc V_VT(dp.rgvarg) = VT_DISPATCH; V_DISPATCH(dp.rgvarg) = (IDispatch*)DISPATCHEX(This); - hres = IDispatch_QueryInterface(V_DISPATCH(var), &IID_IDispatchEx, (void**)&dispex); + hres = IDispatch_QueryInterface(V_DISPATCH(&prop->var), &IID_IDispatchEx, (void**)&dispex); TRACE("%s call\n", debugstr_w(This->dynamic_data->props[idx].name)); if(SUCCEEDED(hres)) { hres = IDispatchEx_InvokeEx(dispex, DISPID_VALUE, lcid, wFlags, &dp, pvarRes, pei, pspCaller); IDispatchEx_Release(dispex); }else { ULONG err = 0; - hres = IDispatch_Invoke(V_DISPATCH(var), DISPID_VALUE, &IID_NULL, lcid, wFlags, pdp, pvarRes, pei, &err); + hres = IDispatch_Invoke(V_DISPATCH(&prop->var), DISPID_VALUE, &IID_NULL, lcid, wFlags, pdp, pvarRes, pei, &err); } TRACE("%s ret %08x\n", debugstr_w(This->dynamic_data->props[idx].name), hres); @@ -944,7 +1028,9 @@ static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lc return hres; } case DISPATCH_PROPERTYGET: - return VariantCopy(pvarRes, var); + if(prop->flags & DYNPROP_DELETED) + return DISP_E_UNKNOWNNAME; + return VariantCopy(pvarRes, &prop->var); case DISPATCH_PROPERTYPUT|DISPATCH_PROPERTYPUTREF: case DISPATCH_PROPERTYPUT: if(pdp->cArgs != 1 || (pdp->cNamedArgs == 1 && *pdp->rgdispidNamedArgs != DISPID_PROPERTYPUT) @@ -954,30 +1040,20 @@ static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lc } TRACE("put %s\n", debugstr_variant(pdp->rgvarg)); - VariantClear(var); - return VariantCopy(var, pdp->rgvarg); + VariantClear(&prop->var); + hres = VariantCopy(&prop->var, pdp->rgvarg); + if(FAILED(hres)) + return hres; + + prop->flags &= ~DYNPROP_DELETED; + return S_OK; default: FIXME("unhandled wFlags %x\n", wFlags); return E_NOTIMPL; } } - data = get_dispex_data(This); - if(!data) - return E_FAIL; - - hres = get_builtin_func(data, id, &func); - if(id == DISPID_VALUE && hres == DISP_E_UNKNOWNNAME) - return dispex_value(This, lcid, wFlags, pdp, pvarRes, pei, pspCaller); - if(FAILED(hres)) - return hres; - - if(func->func_disp_idx == -1) - hres = typeinfo_invoke(This, func, wFlags, pdp, pvarRes, pei); - else - hres = function_invoke(This, func, wFlags, pdp, pvarRes, pei); - - return hres; + return invoke_builtin_prop(This, id, lcid, wFlags, pdp, pvarRes, pei, pspCaller); } static HRESULT WINAPI DispatchEx_DeleteMemberByName(IDispatchEx *iface, BSTR bstrName, DWORD grfdex) @@ -1055,12 +1131,14 @@ static HRESULT WINAPI DispatchEx_GetNextDispID(IDispatchEx *iface, DWORD grfdex, if(!This->dynamic_data || This->dynamic_data->prop_cnt <= idx) return DISP_E_UNKNOWNNAME; - if(idx+1 == This->dynamic_data->prop_cnt) { + while(++idx < This->dynamic_data->prop_cnt && This->dynamic_data->props[idx].flags & DYNPROP_DELETED); + + if(idx == This->dynamic_data->prop_cnt) { *pid = DISPID_STARTENUM; return S_FALSE; } - *pid = id+1; + *pid = DISPID_DYNPROP_0+idx; return S_OK; } diff --git a/reactos/dll/win32/mshtml/editor.c b/reactos/dll/win32/mshtml/editor.c index 961bb916370..14e7ebb6f64 100644 --- a/reactos/dll/win32/mshtml/editor.c +++ b/reactos/dll/win32/mshtml/editor.c @@ -508,7 +508,6 @@ void handle_edit_event(HTMLDocument *This, nsIDOMEvent *event) void handle_edit_load(HTMLDocument *This) { - This->doc_obj->nscontainer->reset_focus = GetFocus(); get_editor_controller(This->doc_obj->nscontainer); } diff --git a/reactos/dll/win32/mshtml/htmlelem.c b/reactos/dll/win32/mshtml/htmlelem.c index e77c1dc4c42..b0cb791a1e8 100644 --- a/reactos/dll/win32/mshtml/htmlelem.c +++ b/reactos/dll/win32/mshtml/htmlelem.c @@ -198,8 +198,10 @@ static HRESULT WINAPI HTMLElement_removeAttribute(IHTMLElement *iface, BSTR strA LONG lFlags, VARIANT_BOOL *pfSuccess) { HTMLElement *This = HTMLELEM_THIS(iface); - FIXME("(%p)->()\n", This); - return E_NOTIMPL; + + TRACE("(%p)->(%s %x %p)\n", This, debugstr_w(strAttributeName), lFlags, pfSuccess); + + return remove_prop(&This->node.dispex, strAttributeName, pfSuccess); } static HRESULT WINAPI HTMLElement_put_className(IHTMLElement *iface, BSTR v) diff --git a/reactos/dll/win32/mshtml/htmlwindow.c b/reactos/dll/win32/mshtml/htmlwindow.c index 2aafaa3e4b4..5dbea55905c 100644 --- a/reactos/dll/win32/mshtml/htmlwindow.c +++ b/reactos/dll/win32/mshtml/htmlwindow.c @@ -57,6 +57,26 @@ static void window_set_docnode(HTMLWindow *window, HTMLDocumentNode *doc_node) if(doc_node) htmldoc_addref(&doc_node->basedoc); } + + if(doc_node && window->doc_obj->usermode == EDITMODE) { + nsIDOMNSHTMLDocument *nshtmldoc; + nsAString mode_str; + nsresult nsres; + + static const PRUnichar onW[] = {'o','n',0}; + + nsres = nsIDOMHTMLDocument_QueryInterface(doc_node->nsdoc, &IID_nsIDOMNSHTMLDocument, (void**)&nshtmldoc); + if(NS_SUCCEEDED(nsres)) { + nsAString_Init(&mode_str, onW); + nsres = nsIDOMNSHTMLDocument_SetDesignMode(nshtmldoc, &mode_str); + nsAString_Finish(&mode_str); + nsIDOMNSHTMLDocument_Release(nshtmldoc); + if(NS_FAILED(nsres)) + ERR("SetDesignMode failed: %08x\n", nsres); + }else { + ERR("Could not get nsIDOMNSHTMLDocument interface: %08x\n", nsres); + } + } } nsIDOMWindow *get_nsdoc_window(nsIDOMDocument *nsdoc) diff --git a/reactos/dll/win32/mshtml/install.c b/reactos/dll/win32/mshtml/install.c index e47c28423d0..4122194a7cc 100644 --- a/reactos/dll/win32/mshtml/install.c +++ b/reactos/dll/win32/mshtml/install.c @@ -60,11 +60,6 @@ static const WCHAR mshtml_keyW[] = '\\','W','i','n','e', '\\','M','S','H','T','M','L',0}; -static const CHAR mshtml_keyA[] = - {'S','o','f','t','w','a','r','e', - '\\','W','i','n','e', - '\\','M','S','H','T','M','L',0}; - static HWND install_dialog = NULL; static LPWSTR tmp_file_name = NULL; static HANDLE tmp_file = INVALID_HANDLE_VALUE; @@ -230,18 +225,23 @@ static BOOL install_from_unix_file(const char *file_name) static BOOL install_from_registered_dir(void) { char *file_name; + HKEY hkey; DWORD res, type, size = MAX_PATH; BOOL ret; - file_name = heap_alloc(size+sizeof(GECKO_FILE_NAME)); /* @@ Wine registry key: HKCU\Software\Wine\MSHTML */ - res = RegGetValueA(HKEY_CURRENT_USER, mshtml_keyA, "GeckoCabDir", RRF_RT_ANY, &type, (PBYTE)file_name, &size); + res = RegOpenKeyW(HKEY_CURRENT_USER, mshtml_keyW, &hkey); + if(res != ERROR_SUCCESS) + return FALSE; + + file_name = heap_alloc(size+sizeof(GECKO_FILE_NAME)); + res = RegQueryValueExA(hkey, "GeckoCabDir", NULL, &type, (PBYTE)file_name, &size); if(res == ERROR_MORE_DATA) { file_name = heap_realloc(file_name, size+sizeof(GECKO_FILE_NAME)); - res = RegGetValueA(HKEY_CURRENT_USER, mshtml_keyA, "GeckoCabDir", RRF_RT_ANY, &type, (PBYTE)file_name, &size); + res = RegQueryValueExA(hkey, "GeckoCabDir", NULL, &type, (PBYTE)file_name, &size); } - - if(res != ERROR_SUCCESS || (type != REG_SZ && type != REG_EXPAND_SZ)) { + RegCloseKey(hkey); + if(res != ERROR_SUCCESS || type != REG_SZ) { heap_free(file_name); return FALSE; } diff --git a/reactos/dll/win32/mshtml/mshtml_private.h b/reactos/dll/win32/mshtml/mshtml_private.h index 228be35864e..3db8d791e48 100644 --- a/reactos/dll/win32/mshtml/mshtml_private.h +++ b/reactos/dll/win32/mshtml/mshtml_private.h @@ -38,6 +38,7 @@ #define NS_ERROR_FAILURE ((nsresult)0x80004005L) #define NS_NOINTERFACE ((nsresult)0x80004002L) #define NS_ERROR_NOT_IMPLEMENTED ((nsresult)0x80004001L) +#define NS_ERROR_NOT_AVAILABLE ((nsresult)0x80040111L) #define NS_ERROR_INVALID_ARG ((nsresult)0x80070057L) #define NS_ERROR_UNEXPECTED ((nsresult)0x8000ffffL) #define NS_ERROR_UNKNOWN_PROTOCOL ((nsresult)0x804b0012L) @@ -171,6 +172,7 @@ void release_dispex(DispatchEx*); BOOL dispex_query_interface(DispatchEx*,REFIID,void**); HRESULT dispex_get_dprop_ref(DispatchEx*,const WCHAR*,BOOL,VARIANT**); HRESULT get_dispids(tid_t,DWORD*,DISPID**); +HRESULT remove_prop(DispatchEx*,BSTR,VARIANT_BOOL*); typedef struct HTMLWindow HTMLWindow; typedef struct HTMLDocumentNode HTMLDocumentNode; @@ -435,8 +437,6 @@ struct NSContainer { nsIURIContentListener *content_listener; HWND hwnd; - - HWND reset_focus; /* hack */ }; typedef struct nsWineURI nsWineURI; @@ -461,9 +461,16 @@ typedef struct { char *content_type; char *charset; PRUint32 response_status; + struct list response_headers; UINT url_scheme; } nsChannel; +struct ResponseHeader { + struct list entry; + WCHAR *header; + WCHAR *data; +}; + typedef struct { HRESULT (*qi)(HTMLDOMNode*,REFIID,void**); void (*destructor)(HTMLDOMNode*); @@ -836,7 +843,6 @@ void update_title(HTMLDocumentObj*); /* editor */ void init_editor(HTMLDocument*); -void set_ns_editmode(NSContainer*); void handle_edit_event(HTMLDocument*,nsIDOMEvent*); HRESULT editor_exec_copy(HTMLDocument*,DWORD,VARIANT*,VARIANT*); HRESULT editor_exec_cut(HTMLDocument*,DWORD,VARIANT*,VARIANT*); diff --git a/reactos/dll/win32/mshtml/navigate.c b/reactos/dll/win32/mshtml/navigate.c index cc2aeb3f6c2..7a777957ce1 100644 --- a/reactos/dll/win32/mshtml/navigate.c +++ b/reactos/dll/win32/mshtml/navigate.c @@ -62,7 +62,7 @@ typedef struct { HRESULT (*stop_binding)(BSCallback*,HRESULT); HRESULT (*read_data)(BSCallback*,IStream*); HRESULT (*on_progress)(BSCallback*,ULONG,LPCWSTR); - HRESULT (*on_response)(BSCallback*,DWORD); + HRESULT (*on_response)(BSCallback*,DWORD,LPCWSTR); } BSCallbackVtbl; struct BSCallback { @@ -493,7 +493,7 @@ static HRESULT WINAPI HttpNegotiate_OnResponse(IHttpNegotiate2 *iface, DWORD dwR TRACE("(%p)->(%d %s %s %p)\n", This, dwResponseCode, debugstr_w(szResponseHeaders), debugstr_w(szRequestHeaders), pszAdditionalRequestHeaders); - return This->vtbl->on_response(This, dwResponseCode); + return This->vtbl->on_response(This, dwResponseCode, szResponseHeaders); } static HRESULT WINAPI HttpNegotiate_GetRootSecurityId(IHttpNegotiate2 *iface, @@ -825,7 +825,8 @@ static HRESULT BufferBSC_on_progress(BSCallback *bsc, ULONG status_code, LPCWSTR return S_OK; } -static HRESULT BufferBSC_on_response(BSCallback *bsc, DWORD response_code) +static HRESULT BufferBSC_on_response(BSCallback *bsc, DWORD response_code, + LPCWSTR response_headers) { return S_OK; } @@ -1099,11 +1100,72 @@ static HRESULT nsChannelBSC_on_progress(BSCallback *bsc, ULONG status_code, LPCW return S_OK; } -static HRESULT nsChannelBSC_on_response(BSCallback *bsc, DWORD response_code) +static HRESULT nsChannelBSC_on_response(BSCallback *bsc, DWORD response_code, + LPCWSTR response_headers) { nsChannelBSC *This = NSCHANNELBSC_THIS(bsc); This->nschannel->response_status = response_code; + + if(response_headers) { + const WCHAR *hdr_start, *hdr_end; + + hdr_start = strchrW(response_headers, '\r'); + while(hdr_start) { + const WCHAR *colon; + struct ResponseHeader *new_header; + int len; + + hdr_start += 2; + hdr_end = strchrW(hdr_start, '\r'); + if(!hdr_end) { + WARN("Header doesn't end with CRLF: %s\n", wine_dbgstr_w(hdr_start)); + break; + } + if(hdr_end == hdr_start) + break; + + for(colon = hdr_start; *colon != ':' && colon != hdr_end; ++colon); + if(*colon != ':') { + WARN("Header missing colon: %s\n", wine_dbgstr_w(hdr_start)); + hdr_start = strchrW(hdr_start, '\r'); + continue; + } + + new_header = heap_alloc(sizeof(struct ResponseHeader)); + if(!new_header) + return E_OUTOFMEMORY; + + len = colon - hdr_start; + new_header->header = heap_alloc((len + 1) * sizeof(WCHAR)); + if(!new_header->header) { + heap_free(new_header); + return E_OUTOFMEMORY; + } + memcpy(new_header->header, hdr_start, len * sizeof(WCHAR)); + new_header->header[len] = 0; + + colon++; + while(*colon == ' ') + colon++; + + len = hdr_end - colon; + new_header->data = heap_alloc((len + 1) * sizeof(WCHAR)); + if(!new_header->data) { + heap_free(new_header->header); + heap_free(new_header); + return E_OUTOFMEMORY; + } + memcpy(new_header->data, colon, len * sizeof(WCHAR)); + new_header->data[len] = 0; + + list_add_head(&This->nschannel->response_headers, &new_header->entry); + TRACE("Adding header to list: (%s):(%s)\n", wine_dbgstr_w(new_header->header), wine_dbgstr_w(new_header->data)); + + hdr_start = strchrW(hdr_start, '\r'); + } + } + return S_OK; } diff --git a/reactos/dll/win32/mshtml/nsembed.c b/reactos/dll/win32/mshtml/nsembed.c index fa8aa41fedf..8a590079278 100644 --- a/reactos/dll/win32/mshtml/nsembed.c +++ b/reactos/dll/win32/mshtml/nsembed.c @@ -80,8 +80,6 @@ static const WCHAR wszNsContainer[] = {'N','s','C','o','n','t','a','i','n','e',' static ATOM nscontainer_class; -#define WM_RESETFOCUS_HACK WM_USER+600 - static LRESULT WINAPI nsembed_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { NSContainer *This; @@ -106,20 +104,13 @@ static LRESULT WINAPI nsembed_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lP WARN("SetSize failed: %08x\n", nsres); break; - case WM_RESETFOCUS_HACK: - /* - * FIXME - * Gecko grabs focus in edit mode and some apps don't like it. - * We should somehow prevent grabbing focus. - */ + case WM_PARENTNOTIFY: + TRACE("WM_PARENTNOTIFY %x\n", (unsigned)wParam); - TRACE("WM_RESETFOCUS_HACK\n"); - - if(This->reset_focus) { - SetFocus(This->reset_focus); - This->reset_focus = NULL; - if(This->doc) - This->doc->focus = FALSE; + switch(wParam) { + case WM_LBUTTONDOWN: + case WM_RBUTTONDOWN: + nsIWebBrowserFocus_Activate(This->focus); } } @@ -776,46 +767,6 @@ void get_editor_controller(NSContainer *This) } } -void set_ns_editmode(NSContainer *This) -{ - nsIEditingSession *editing_session = NULL; - nsIURIContentListener *listener = NULL; - nsIDOMWindow *dom_window = NULL; - nsresult nsres; - - nsres = get_nsinterface((nsISupports*)This->webbrowser, &IID_nsIEditingSession, - (void**)&editing_session); - if(NS_FAILED(nsres)) { - ERR("Could not get nsIEditingSession: %08x\n", nsres); - return; - } - - nsres = nsIWebBrowser_GetContentDOMWindow(This->webbrowser, &dom_window); - if(NS_FAILED(nsres)) { - ERR("Could not get content DOM window: %08x\n", nsres); - nsIEditingSession_Release(editing_session); - return; - } - - nsres = nsIEditingSession_MakeWindowEditable(editing_session, dom_window, - NULL, FALSE, TRUE, TRUE); - nsIEditingSession_Release(editing_session); - nsIDOMWindow_Release(dom_window); - if(NS_FAILED(nsres)) { - ERR("MakeWindowEditable failed: %08x\n", nsres); - return; - } - - /* MakeWindowEditable changes WebBrowser's parent URI content listener. - * It seams to be a bug in Gecko. To workaround it we set our content - * listener again and Gecko's one as its parent. - */ - nsIWebBrowser_GetParentURIContentListener(This->webbrowser, &listener); - nsIURIContentListener_SetParentContentListener(NSURICL(This), listener); - nsIURIContentListener_Release(listener); - nsIWebBrowser_SetParentURIContentListener(This->webbrowser, NSURICL(This)); -} - void close_gecko(void) { TRACE("()\n"); @@ -1316,9 +1267,6 @@ static nsresult NSAPI nsEmbeddingSiteWindow_SetFocus(nsIEmbeddingSiteWindow *ifa TRACE("(%p)\n", This); - if(This->reset_focus) - PostMessageW(This->hwnd, WM_RESETFOCUS_HACK, 0, 0); - return nsIBaseWindow_SetFocus(This->window); } diff --git a/reactos/dll/win32/mshtml/nsevents.c b/reactos/dll/win32/mshtml/nsevents.c index c491424fdd4..3e0314966db 100644 --- a/reactos/dll/win32/mshtml/nsevents.c +++ b/reactos/dll/win32/mshtml/nsevents.c @@ -109,11 +109,11 @@ static nsrefcnt NSAPI nsDOMEventListener_Release(nsIDOMEventListener *iface) return release_listener(This); } -static BOOL is_doc_child_focus(HTMLDocumentObj *doc) +static BOOL is_doc_child_focus(NSContainer *nscontainer) { HWND hwnd; - for(hwnd = GetFocus(); hwnd && hwnd != doc->hwnd; hwnd = GetParent(hwnd)); + for(hwnd = GetFocus(); hwnd && hwnd != nscontainer->hwnd; hwnd = GetParent(hwnd)); return hwnd != NULL; } @@ -129,7 +129,7 @@ static nsresult NSAPI handle_blur(nsIDOMEventListener *iface, nsIDOMEvent *event return NS_ERROR_FAILURE; doc_obj = doc->basedoc.doc_obj; - if(!doc_obj->nscontainer->reset_focus && doc_obj->focus && !is_doc_child_focus(doc_obj)) { + if(doc_obj->focus && !is_doc_child_focus(doc_obj->nscontainer)) { doc_obj->focus = FALSE; notif_focus(doc_obj); } @@ -148,7 +148,7 @@ static nsresult NSAPI handle_focus(nsIDOMEventListener *iface, nsIDOMEvent *even return NS_ERROR_FAILURE; doc_obj = doc->basedoc.doc_obj; - if(!doc_obj->nscontainer->reset_focus && !doc_obj->focus) { + if(!doc_obj->focus) { doc_obj->focus = TRUE; notif_focus(doc_obj); } diff --git a/reactos/dll/win32/mshtml/nsio.c b/reactos/dll/win32/mshtml/nsio.c index 88a4e55254b..0c8e45704d7 100644 --- a/reactos/dll/win32/mshtml/nsio.c +++ b/reactos/dll/win32/mshtml/nsio.c @@ -307,7 +307,7 @@ static void set_uri_window(nsWineURI *This, HTMLWindow *window) static inline BOOL is_http_channel(nsChannel *This) { - return This->url_scheme == URL_SCHEME_HTTP || This->url_scheme == URL_SCHEME_HTTP; + return This->url_scheme == URL_SCHEME_HTTP || This->url_scheme == URL_SCHEME_HTTPS; } #define NSCHANNEL_THIS(iface) DEFINE_THIS(nsChannel, HttpChannel, iface) @@ -363,6 +363,8 @@ static nsrefcnt NSAPI nsChannel_Release(nsIHttpChannel *iface) LONG ref = InterlockedDecrement(&This->ref); if(!ref) { + struct ResponseHeader *header, *next_hdr; + nsIURI_Release(NSURI(This->uri)); if(This->owner) nsISupports_Release(This->owner); @@ -376,6 +378,14 @@ static nsrefcnt NSAPI nsChannel_Release(nsIHttpChannel *iface) nsIURI_Release(This->original_uri); heap_free(This->content_type); heap_free(This->charset); + + LIST_FOR_EACH_ENTRY_SAFE(header, next_hdr, &This->response_headers, struct ResponseHeader, entry) { + list_remove(&header->entry); + heap_free(header->header); + heap_free(header->data); + heap_free(header); + } + heap_free(This); } @@ -933,9 +943,9 @@ static nsresult NSAPI nsChannel_SetRequestMethod(nsIHttpChannel *iface, { nsChannel *This = NSCHANNEL_THIS(iface); - FIXME("(%p)->(%p)\n", This, aRequestMethod); + TRACE("(%p)->(%p): Returning NS_OK\n", This, aRequestMethod); - return NS_ERROR_NOT_IMPLEMENTED; + return NS_OK; } static nsresult NSAPI nsChannel_GetReferrer(nsIHttpChannel *iface, nsIURI **aReferrer) @@ -1052,19 +1062,48 @@ static nsresult NSAPI nsChannel_GetRequestSucceeded(nsIHttpChannel *iface, { nsChannel *This = NSCHANNEL_THIS(iface); - FIXME("(%p)->(%p)\n", This, aRequestSucceeded); + TRACE("(%p)->(%p)\n", This, aRequestSucceeded); - return NS_ERROR_NOT_IMPLEMENTED; + if(!This->response_status) + return NS_ERROR_NOT_AVAILABLE; + + *aRequestSucceeded = This->response_status/100 == 2; + + return NS_OK; } static nsresult NSAPI nsChannel_GetResponseHeader(nsIHttpChannel *iface, const nsACString *header, nsACString *_retval) { nsChannel *This = NSCHANNEL_THIS(iface); + const char *header_str; + WCHAR *header_wstr; + struct ResponseHeader *this_header; - FIXME("(%p)->(%p %p)\n", This, header, _retval); + nsACString_GetData(header, &header_str); + TRACE("(%p)->(%p(%s) %p)\n", This, header, header_str, _retval); - return NS_ERROR_NOT_IMPLEMENTED; + header_wstr = heap_strdupAtoW(header_str); + if(!header_wstr) + return NS_ERROR_UNEXPECTED; + + LIST_FOR_EACH_ENTRY(this_header, &This->response_headers, struct ResponseHeader, entry) { + if(!strcmpW(this_header->header, header_wstr)) { + char *data = heap_strdupWtoA(this_header->data); + if(!data) { + heap_free(header_wstr); + return NS_ERROR_UNEXPECTED; + } + nsACString_SetData(_retval, data); + heap_free(data); + heap_free(header_wstr); + return NS_OK; + } + } + + heap_free(header_wstr); + + return NS_ERROR_NOT_AVAILABLE; } static nsresult NSAPI nsChannel_SetResponseHeader(nsIHttpChannel *iface, @@ -2414,7 +2453,6 @@ static nsresult NSAPI nsIOService_NewURI(nsIIOService *iface, const nsACString * HTMLWindow *window = NULL; nsIURI *uri = NULL; LPCWSTR base_wine_url = NULL; - BOOL is_wine_uri = FALSE; nsresult nsres; nsACString_GetData(aSpec, &spec); @@ -2425,10 +2463,8 @@ static nsresult NSAPI nsIOService_NewURI(nsIIOService *iface, const nsACString * if(is_gecko_special_uri(spec)) return nsIIOService_NewURI(nsio, aSpec, aOriginCharset, aBaseURI, _retval); - if(!strncmp(spec, "wine:", 5)) { + if(!strncmp(spec, "wine:", 5)) spec += 5; - is_wine_uri = TRUE; - } if(aBaseURI) { PARSEDURLA parsed_url = {sizeof(PARSEDURLA)}; @@ -2473,7 +2509,7 @@ static nsresult NSAPI nsIOService_NewURI(nsIIOService *iface, const nsACString * set_wine_url(wine_uri, url); else WARN("CoCombineUrl failed: %08x\n", hres); - }else if(is_wine_uri) { + }else { WCHAR url[INTERNET_MAX_URL_LENGTH]; MultiByteToWideChar(CP_ACP, 0, spec, -1, url, sizeof(url)/sizeof(WCHAR)); @@ -2516,6 +2552,7 @@ static nsresult NSAPI nsIOService_NewChannelFromURI(nsIIOService *iface, nsIURI ret->lpIHttpChannelInternalVtbl = &nsHttpChannelInternalVtbl; ret->ref = 1; ret->uri = wine_uri; + list_init(&ret->response_headers); nsIURI_AddRef(aURI); ret->original_uri = aURI; diff --git a/reactos/dll/win32/mshtml/olecmd.c b/reactos/dll/win32/mshtml/olecmd.c index b54f06420fb..4d5967a923f 100644 --- a/reactos/dll/win32/mshtml/olecmd.c +++ b/reactos/dll/win32/mshtml/olecmd.c @@ -616,9 +616,6 @@ static HRESULT exec_editmode(HTMLDocument *This, DWORD cmdexecopt, VARIANT *in, IDocHostUIHandler_HideUI(This->doc_obj->hostui); } - if(This->doc_obj->nscontainer) - set_ns_editmode(This->doc_obj->nscontainer); - if(This->doc_obj->ui_active) { RECT rcBorderWidths; diff --git a/reactos/dll/win32/mshtml/view.c b/reactos/dll/win32/mshtml/view.c index 261e959b0ad..5c096ed9928 100644 --- a/reactos/dll/win32/mshtml/view.c +++ b/reactos/dll/win32/mshtml/view.c @@ -92,7 +92,6 @@ static void activate_gecko(NSContainer *This) nsIBaseWindow_SetVisibility(This->window, TRUE); nsIBaseWindow_SetEnabled(This->window, TRUE); - nsIWebBrowserFocus_Activate(This->focus); } void update_doc(HTMLDocument *This, DWORD flags) @@ -216,6 +215,10 @@ static LRESULT WINAPI serverwnd_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM break; case WM_TIMER: return on_timer(This); + case WM_SETFOCUS: + TRACE("(%p) WM_SETFOCUS\n", This); + nsIWebBrowserFocus_Activate(This->nscontainer->focus); + break; case WM_MOUSEACTIVATE: return MA_ACTIVATE; } @@ -664,6 +667,8 @@ static HRESULT WINAPI OleDocumentView_UIActivate(IOleDocumentView *iface, BOOL f This->doc_obj->ui_active = TRUE; }else { + This->doc_obj->focus = FALSE; + nsIWebBrowserFocus_Deactivate(This->doc_obj->nscontainer->focus); if(This->doc_obj->ui_active) { This->doc_obj->ui_active = FALSE; if(This->doc_obj->ip_window) @@ -811,7 +816,7 @@ static HRESULT WINAPI ViewObject_SetAdvise(IViewObjectEx *iface, DWORD aspects, TRACE("(%p)->(%d %d %p)\n", This, aspects, advf, pAdvSink); if(aspects != DVASPECT_CONTENT || advf != ADVF_PRIMEFIRST) - FIXME("unsuported arguments\n"); + FIXME("unsupported arguments\n"); if(This->doc_obj->view_sink) IAdviseSink_Release(This->doc_obj->view_sink); From fd7bc65588044b83db9c4537b961bc9663630367 Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Tue, 20 Apr 2010 17:24:00 +0000 Subject: [PATCH 015/131] - Sync msimtf, msvfw32, msvidc32, msxml3 to Wine-1.1.43. svn path=/trunk/; revision=46958 --- reactos/dll/win32/msimtf/activeimmapp.c | 2 +- reactos/dll/win32/msvfw32/mciwnd.c | 29 +- reactos/dll/win32/msvfw32/msvfw32_ros.diff | 14 - reactos/dll/win32/msvfw32/msvideo16.c | 916 --------------------- reactos/dll/win32/msvfw32/vfw16.h | 130 --- reactos/dll/win32/msvidc32/msvideo1.c | 59 +- reactos/dll/win32/msxml3/dispex.c | 4 +- reactos/dll/win32/msxml3/element.c | 2 +- reactos/dll/win32/msxml3/main.c | 2 +- reactos/dll/win32/msxml3/node.c | 36 +- 10 files changed, 57 insertions(+), 1137 deletions(-) delete mode 100644 reactos/dll/win32/msvfw32/msvfw32_ros.diff delete mode 100644 reactos/dll/win32/msvfw32/msvideo16.c delete mode 100644 reactos/dll/win32/msvfw32/vfw16.h diff --git a/reactos/dll/win32/msimtf/activeimmapp.c b/reactos/dll/win32/msimtf/activeimmapp.c index d8446267893..73ce0758c70 100644 --- a/reactos/dll/win32/msimtf/activeimmapp.c +++ b/reactos/dll/win32/msimtf/activeimmapp.c @@ -655,7 +655,7 @@ static HRESULT WINAPI ActiveIMMApp_Deactivate(IActiveIMMApp* This) static HRESULT WINAPI ActiveIMMApp_OnDefWindowProc(IActiveIMMApp* This, HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam, LRESULT *plResult) { - //FIXME("Stub (%p %x %lx %lx)\n",hWnd,Msg,wParam,lParam); + FIXME("Stub (%p %x %lx %lx)\n",hWnd,Msg,wParam,lParam); return E_FAIL; } diff --git a/reactos/dll/win32/msvfw32/mciwnd.c b/reactos/dll/win32/msvfw32/mciwnd.c index ff8a0369df0..96b64207825 100644 --- a/reactos/dll/win32/msvfw32/mciwnd.c +++ b/reactos/dll/win32/msvfw32/mciwnd.c @@ -1298,30 +1298,23 @@ end_of_mci_open: } case MCI_SEEK: + case MCI_STEP: { - MCI_SEEK_PARMS mci_seek; - - switch (lParam) - { - case MCIWND_START: - lParam = SendMessageW(hWnd, MCIWNDM_GETSTART, 0, 0); - break; - - case MCIWND_END: - lParam = SendMessageW(hWnd, MCIWNDM_GETEND, 0, 0); - break; - } + MCI_SEEK_PARMS mci_seek; /* Layout is usable as MCI_XYZ_STEP_PARMS */ + DWORD flags = MCI_STEP == wMsg ? 0 : + MCIWND_START == lParam ? MCI_SEEK_TO_START : + MCIWND_END == lParam ? MCI_SEEK_TO_END : MCI_TO; mci_seek.dwTo = lParam; - mwi->lasterror = mciSendCommandW(mwi->mci, MCI_SEEK, - MCI_TO, (DWORD_PTR)&mci_seek); + mwi->lasterror = mciSendCommandW(mwi->mci, wMsg, + flags, (DWORD_PTR)&mci_seek); if (mwi->lasterror) { MCIWND_notify_error(mwi); return mwi->lasterror; } /* update window to reflect the state */ - InvalidateRect(hWnd, NULL, TRUE); + else InvalidateRect(hWnd, NULL, TRUE); return 0; } @@ -1364,15 +1357,9 @@ end_of_mci_open: } case MCI_PAUSE: - case MCI_STEP: case MCI_STOP: case MCI_RESUME: mci_generic_command(mwi, wMsg); - if (wMsg == MCI_STEP && !mwi->lasterror) - { - /* update window to reflect the state */ - InvalidateRect(hWnd, NULL, TRUE); - } return mwi->lasterror; case MCI_CONFIGURE: diff --git a/reactos/dll/win32/msvfw32/msvfw32_ros.diff b/reactos/dll/win32/msvfw32/msvfw32_ros.diff deleted file mode 100644 index 331b478ad6d..00000000000 --- a/reactos/dll/win32/msvfw32/msvfw32_ros.diff +++ /dev/null @@ -1,14 +0,0 @@ -Index: msvideo_private.h -=================================================================== ---- msvideo_private.h (revision 25690) -+++ msvideo_private.h (working copy) -@@ -19,6 +19,9 @@ - #ifndef __WINE_MSVIDEO_PRIVATE_H - #define __WINE_MSVIDEO_PRIVATE_H - -+/* Installable Compressor Manager */ -+#define ICVERSION 0x0104 -+ - #define ICM_CHOOSE_COMPRESSOR 1 - #define IDC_COMP_LIST 880 - #define IDS_FULLFRAMES 901 diff --git a/reactos/dll/win32/msvfw32/msvideo16.c b/reactos/dll/win32/msvfw32/msvideo16.c deleted file mode 100644 index c873da57f45..00000000000 --- a/reactos/dll/win32/msvfw32/msvideo16.c +++ /dev/null @@ -1,916 +0,0 @@ -/* - * msvideo 16-bit functions - * - * Copyright 1998 Marcus Meissner - * Copyright 2000 Bradley Baetz - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA - */ - -#include -#include -#include - -#include "windef.h" -#include "winbase.h" -#include "winver.h" -#include "winnls.h" -#include "winreg.h" -#include "winuser.h" -#include "vfw16.h" -#include "msvideo_private.h" -#include "wine/debug.h" - -WINE_DEFAULT_DEBUG_CHANNEL(msvideo); - -/* Drivers32 settings */ -#define HKLM_DRIVERS32 "Software\\Microsoft\\Windows NT\\CurrentVersion\\Drivers32" - -/*********************************************************************** - * DrawDibOpen [MSVIDEO.102] - */ -HDRAWDIB16 VFWAPI DrawDibOpen16(void) -{ - return HDRAWDIB_16(DrawDibOpen()); -} - -/*********************************************************************** - * DrawDibClose [MSVIDEO.103] - */ -BOOL16 VFWAPI DrawDibClose16(HDRAWDIB16 hdd) -{ - return DrawDibClose(HDRAWDIB_32(hdd)); -} - -/************************************************************************ - * DrawDibBegin [MSVIDEO.104] - */ -BOOL16 VFWAPI DrawDibBegin16(HDRAWDIB16 hdd, HDC16 hdc, INT16 dxDst, - INT16 dyDst, LPBITMAPINFOHEADER lpbi, INT16 dxSrc, - INT16 dySrc, UINT16 wFlags) -{ - return DrawDibBegin(HDRAWDIB_32(hdd), HDC_32(hdc), dxDst, dyDst, lpbi, - dxSrc, dySrc, wFlags); -} - -/*********************************************************************** - * DrawDibEnd [MSVIDEO.105] - */ -BOOL16 VFWAPI DrawDibEnd16(HDRAWDIB16 hdd) -{ - return DrawDibEnd(HDRAWDIB_32(hdd)); -} - -/********************************************************************** - * DrawDibDraw [MSVIDEO.106] - */ -BOOL16 VFWAPI DrawDibDraw16(HDRAWDIB16 hdd, HDC16 hdc, INT16 xDst, INT16 yDst, - INT16 dxDst, INT16 dyDst, LPBITMAPINFOHEADER lpbi, - LPVOID lpBits, INT16 xSrc, INT16 ySrc, INT16 dxSrc, - INT16 dySrc, UINT16 wFlags) -{ - return DrawDibDraw(HDRAWDIB_32(hdd), HDC_32(hdc), xDst, yDst, dxDst, - dyDst, lpbi, lpBits, xSrc, ySrc, dxSrc, dySrc, wFlags); -} - -/*********************************************************************** - * DrawDibGetPalette [MSVIDEO.108] - */ -HPALETTE16 VFWAPI DrawDibGetPalette16(HDRAWDIB16 hdd) -{ - return HPALETTE_16(DrawDibGetPalette(HDRAWDIB_32(hdd))); -} - -/*********************************************************************** - * DrawDibSetPalette [MSVIDEO.110] - */ -BOOL16 VFWAPI DrawDibSetPalette16(HDRAWDIB16 hdd, HPALETTE16 hpal) -{ - return DrawDibSetPalette(HDRAWDIB_32(hdd), HPALETTE_32(hpal)); -} - -/*********************************************************************** - * DrawDibRealize [MSVIDEO.112] - */ -UINT16 VFWAPI DrawDibRealize16(HDRAWDIB16 hdd, HDC16 hdc, - BOOL16 fBackground) -{ - return (UINT16)DrawDibRealize(HDRAWDIB_32(hdd), HDC_32(hdc), fBackground); -} - -/************************************************************************* - * DrawDibStart [MSVIDEO.118] - */ -BOOL16 VFWAPI DrawDibStart16(HDRAWDIB16 hdd, DWORD rate) -{ - return DrawDibStart(HDRAWDIB_32(hdd), rate); -} - -/************************************************************************* - * DrawDibStop [MSVIDEO.119] - */ -BOOL16 VFWAPI DrawDibStop16(HDRAWDIB16 hdd) -{ - return DrawDibStop(HDRAWDIB_32(hdd)); -} - -/*********************************************************************** - * ICOpen [MSVIDEO.203] - */ -HIC16 VFWAPI ICOpen16(DWORD fccType, DWORD fccHandler, UINT16 wMode) -{ - return HIC_16(ICOpen(fccType, fccHandler, wMode)); -} - -/*********************************************************************** - * ICClose [MSVIDEO.204] - */ -LRESULT WINAPI ICClose16(HIC16 hic) -{ - return ICClose(HIC_32(hic)); -} - -/*********************************************************************** - * _ICMessage [MSVIDEO.207] - */ -LRESULT VFWAPIV ICMessage16( HIC16 hic, UINT16 msg, UINT16 cb, VA_LIST16 valist ) -{ - LPWORD lpData; - SEGPTR segData; - LRESULT ret; - UINT16 i; - - lpData = HeapAlloc(GetProcessHeap(), 0, cb); - - TRACE("0x%08x, %u, %u, ...)\n", (DWORD) hic, msg, cb); - - for (i = 0; i < cb / sizeof(WORD); i++) - { - lpData[i] = VA_ARG16(valist, WORD); - } - - segData = MapLS(lpData); - ret = ICSendMessage16(hic, msg, segData, (DWORD) cb); - UnMapLS(segData); - HeapFree(GetProcessHeap(), 0, lpData); - return ret; -} - -/*********************************************************************** - * ICGetInfo [MSVIDEO.212] - */ -LRESULT VFWAPI ICGetInfo16(HIC16 hic, ICINFO16 * picinfo, DWORD cb) -{ - LRESULT ret; - - TRACE("(0x%08x,%p,%d)\n", (DWORD) hic, picinfo, cb); - ret = ICSendMessage16(hic, ICM_GETINFO, (DWORD) picinfo, cb); - TRACE(" -> 0x%08lx\n", ret); - return ret; -} - -/*********************************************************************** - * ICLocate [MSVIDEO.213] - */ -HIC16 VFWAPI ICLocate16(DWORD fccType, DWORD fccHandler, - LPBITMAPINFOHEADER lpbiIn, LPBITMAPINFOHEADER lpbiOut, - WORD wFlags) -{ - return HIC_16(ICLocate(fccType, fccHandler, lpbiIn, lpbiOut, wFlags)); -} - -/*********************************************************************** - * _ICCompress [MSVIDEO.224] - */ -DWORD VFWAPIV ICCompress16(HIC16 hic, DWORD dwFlags, - LPBITMAPINFOHEADER lpbiOutput, LPVOID lpData, - LPBITMAPINFOHEADER lpbiInput, LPVOID lpBits, - LPDWORD lpckid, LPDWORD lpdwFlags, - LONG lFrameNum, DWORD dwFrameSize, - DWORD dwQuality, LPBITMAPINFOHEADER lpbiPrev, - LPVOID lpPrev) -{ - DWORD ret; - ICCOMPRESS iccmp; - SEGPTR seg_iccmp; - - TRACE("(0x%08x,%d,%p,%p,%p,%p,...)\n", (DWORD) hic, dwFlags, - lpbiOutput, lpData, lpbiInput, lpBits); - - iccmp.dwFlags = dwFlags; - - iccmp.lpbiOutput = lpbiOutput; - iccmp.lpOutput = lpData; - iccmp.lpbiInput = lpbiInput; - iccmp.lpInput = lpBits; - - iccmp.lpckid = lpckid; - iccmp.lpdwFlags = lpdwFlags; - iccmp.lFrameNum = lFrameNum; - iccmp.dwFrameSize = dwFrameSize; - iccmp.dwQuality = dwQuality; - iccmp.lpbiPrev = lpbiPrev; - iccmp.lpPrev = lpPrev; - seg_iccmp = MapLS(&iccmp); - ret = ICSendMessage16(hic, ICM_COMPRESS, seg_iccmp, sizeof(ICCOMPRESS)); - UnMapLS(seg_iccmp); - return ret; -} - -/*********************************************************************** - * _ICDecompress [MSVIDEO.230] - */ -DWORD VFWAPIV ICDecompress16(HIC16 hic, DWORD dwFlags, - LPBITMAPINFOHEADER lpbiFormat, LPVOID lpData, - LPBITMAPINFOHEADER lpbi, LPVOID lpBits) -{ - ICDECOMPRESS icd; - SEGPTR segptr; - DWORD ret; - - TRACE("(0x%08x,%d,%p,%p,%p,%p)\n", (DWORD) hic, dwFlags, lpbiFormat, - lpData, lpbi, lpBits); - - icd.dwFlags = dwFlags; - icd.lpbiInput = lpbiFormat; - icd.lpInput = lpData; - icd.lpbiOutput = lpbi; - icd.lpOutput = lpBits; - icd.ckid = 0; - segptr = MapLS(&icd); - ret = ICSendMessage16(hic, ICM_DECOMPRESS, segptr, sizeof(ICDECOMPRESS)); - UnMapLS(segptr); - return ret; -} - -/*********************************************************************** - * _ICDrawBegin [MSVIDEO.232] - */ -DWORD VFWAPIV ICDrawBegin16(HIC16 hic, /* [in] */ - DWORD dwFlags, /* [in] flags */ - HPALETTE16 hpal, /* [in] palette to draw with */ - HWND16 hwnd, /* [in] window to draw to */ - HDC16 hdc, /* [in] HDC to draw to */ - INT16 xDst, /* [in] destination rectangle */ - INT16 yDst, /* [in] */ - INT16 dxDst, /* [in] */ - INT16 dyDst, /* [in] */ - LPBITMAPINFOHEADER lpbi, /* [in] format of frame to draw NOTE: SEGPTR */ - INT16 xSrc, /* [in] source rectangle */ - INT16 ySrc, /* [in] */ - INT16 dxSrc, /* [in] */ - INT16 dySrc, /* [in] */ - DWORD dwRate, /* [in] frames/second = (dwRate/dwScale) */ - DWORD dwScale) /* [in] */ -{ - DWORD ret; - ICDRAWBEGIN16 icdb; - SEGPTR seg_icdb; - - TRACE ("(0x%08x,%d,0x%08x,0x%08x,0x%08x,%u,%u,%u,%u,%p,%u,%u,%u,%u,%d,%d)\n", - (DWORD) hic, dwFlags, (DWORD) hpal, (DWORD) hwnd, (DWORD) hdc, - xDst, yDst, dxDst, dyDst, lpbi, xSrc, ySrc, dxSrc, dySrc, dwRate, - dwScale); - - icdb.dwFlags = dwFlags; - icdb.hpal = hpal; - icdb.hwnd = hwnd; - icdb.hdc = hdc; - icdb.xDst = xDst; - icdb.yDst = yDst; - icdb.dxDst = dxDst; - icdb.dyDst = dyDst; - icdb.lpbi = lpbi; /* Keep this as SEGPTR for the mapping code to deal with */ - icdb.xSrc = xSrc; - icdb.ySrc = ySrc; - icdb.dxSrc = dxSrc; - icdb.dySrc = dySrc; - icdb.dwRate = dwRate; - icdb.dwScale = dwScale; - seg_icdb = MapLS(&icdb); - ret = (DWORD) ICSendMessage16(hic, ICM_DRAW_BEGIN, seg_icdb, - sizeof(ICDRAWBEGIN16)); - UnMapLS(seg_icdb); - return ret; -} - -/*********************************************************************** - * _ICDraw [MSVIDEO.234] - */ -DWORD VFWAPIV ICDraw16(HIC16 hic, DWORD dwFlags, - LPVOID lpFormat, /* [???] NOTE: SEGPTR */ - LPVOID lpData, /* [???] NOTE: SEGPTR */ - DWORD cbData, LONG lTime) -{ - DWORD ret; - ICDRAW icd; - SEGPTR seg_icd; - - TRACE("(0x%08x,0x%08x,%p,%p,%d,%d)\n", (DWORD) hic, dwFlags, - lpFormat, lpData, cbData, lTime); - icd.dwFlags = dwFlags; - icd.lpFormat = lpFormat; - icd.lpData = lpData; - icd.cbData = cbData; - icd.lTime = lTime; - seg_icd = MapLS(&icd); - ret = ICSendMessage16(hic, ICM_DRAW, seg_icd, sizeof(ICDRAW)); - UnMapLS(seg_icd); - return ret; -} - -/*********************************************************************** - * ICGetDisplayFormat [MSVIDEO.239] - */ -HIC16 VFWAPI ICGetDisplayFormat16(HIC16 hic, LPBITMAPINFOHEADER lpbiIn, - LPBITMAPINFOHEADER lpbiOut, INT16 depth, - INT16 dx, INT16 dy) -{ - return HIC_16(ICGetDisplayFormat(HIC_32(hic), lpbiIn, lpbiOut, depth, - dx, dy)); -} - -#define COPY(x,y) (x->y = x##16->y); -#define COPYPTR(x,y) (x->y = MapSL((SEGPTR)x##16->y)); - -/****************************************************************** - * MSVIDEO_MapICDEX16To32 - * - * - */ -static LPVOID MSVIDEO_MapICDEX16To32(LPDWORD lParam) -{ - LPVOID ret; - - ICDECOMPRESSEX *icdx = HeapAlloc(GetProcessHeap(), 0, sizeof(ICDECOMPRESSEX)); - ICDECOMPRESSEX16 *icdx16 = MapSL(*lParam); - ret = icdx16; - - COPY(icdx, dwFlags); - COPYPTR(icdx, lpbiSrc); - COPYPTR(icdx, lpSrc); - COPYPTR(icdx, lpbiDst); - COPYPTR(icdx, lpDst); - COPY(icdx, xDst); - COPY(icdx, yDst); - COPY(icdx, dxDst); - COPY(icdx, dyDst); - COPY(icdx, xSrc); - COPY(icdx, ySrc); - COPY(icdx, dxSrc); - COPY(icdx, dySrc); - - *lParam = (DWORD)(icdx); - return ret; -} - -/****************************************************************** - * MSVIDEO_MapMsg16To32 - * - * - */ -static LPVOID MSVIDEO_MapMsg16To32(UINT msg, LPDWORD lParam1, LPDWORD lParam2) -{ - LPVOID ret = 0; - - TRACE("Mapping %d\n", msg); - - switch (msg) - { - case DRV_LOAD: - case DRV_ENABLE: - case DRV_CLOSE: - case DRV_DISABLE: - case DRV_FREE: - case ICM_ABOUT: - case ICM_CONFIGURE: - case ICM_COMPRESS_END: - case ICM_DECOMPRESS_END: - case ICM_DECOMPRESSEX_END: - case ICM_SETQUALITY: - case ICM_DRAW_START_PLAY: - case ICM_DRAW_STOP_PLAY: - case ICM_DRAW_REALIZE: - case ICM_DRAW_RENDERBUFFER: - case ICM_DRAW_END: - break; - case DRV_OPEN: - case ICM_GETDEFAULTQUALITY: - case ICM_GETQUALITY: - case ICM_SETSTATE: - case ICM_DRAW_WINDOW: - case ICM_GETBUFFERSWANTED: - *lParam1 = (DWORD)MapSL(*lParam1); - break; - case ICM_GETINFO: - { - ICINFO *ici = HeapAlloc(GetProcessHeap(), 0, sizeof(ICINFO)); - ICINFO16 *ici16; - - ici16 = MapSL(*lParam1); - ret = ici16; - - ici->dwSize = sizeof(ICINFO); - COPY(ici, fccType); - COPY(ici, fccHandler); - COPY(ici, dwFlags); - COPY(ici, dwVersion); - COPY(ici, dwVersionICM); - MultiByteToWideChar( CP_ACP, 0, ici16->szName, -1, ici->szName, 16 ); - MultiByteToWideChar( CP_ACP, 0, ici16->szDescription, -1, ici->szDescription, 128 ); - MultiByteToWideChar( CP_ACP, 0, ici16->szDriver, -1, ici->szDriver, 128 ); - *lParam1 = (DWORD)(ici); - *lParam2 = sizeof(ICINFO); - } - break; - case ICM_COMPRESS: - { - ICCOMPRESS *icc = HeapAlloc(GetProcessHeap(), 0, sizeof(ICCOMPRESS)); - ICCOMPRESS *icc16; - - icc16 = MapSL(*lParam1); - ret = icc16; - - COPY(icc, dwFlags); - COPYPTR(icc, lpbiOutput); - COPYPTR(icc, lpOutput); - COPYPTR(icc, lpbiInput); - COPYPTR(icc, lpInput); - COPYPTR(icc, lpckid); - COPYPTR(icc, lpdwFlags); - COPY(icc, lFrameNum); - COPY(icc, dwFrameSize); - COPY(icc, dwQuality); - COPYPTR(icc, lpbiPrev); - COPYPTR(icc, lpPrev); - - *lParam1 = (DWORD)(icc); - *lParam2 = sizeof(ICCOMPRESS); - } - break; - case ICM_DECOMPRESS: - { - ICDECOMPRESS *icd = HeapAlloc(GetProcessHeap(), 0, sizeof(ICDECOMPRESS)); - ICDECOMPRESS *icd16; /* Same structure except for the pointers */ - - icd16 = MapSL(*lParam1); - ret = icd16; - - COPY(icd, dwFlags); - COPYPTR(icd, lpbiInput); - COPYPTR(icd, lpInput); - COPYPTR(icd, lpbiOutput); - COPYPTR(icd, lpOutput); - COPY(icd, ckid); - - *lParam1 = (DWORD)(icd); - *lParam2 = sizeof(ICDECOMPRESS); - } - break; - case ICM_COMPRESS_BEGIN: - case ICM_COMPRESS_GET_FORMAT: - case ICM_COMPRESS_GET_SIZE: - case ICM_COMPRESS_QUERY: - case ICM_DECOMPRESS_GET_FORMAT: - case ICM_DECOMPRESS_QUERY: - case ICM_DECOMPRESS_BEGIN: - case ICM_DECOMPRESS_SET_PALETTE: - case ICM_DECOMPRESS_GET_PALETTE: - *lParam1 = (DWORD)MapSL(*lParam1); - *lParam2 = (DWORD)MapSL(*lParam2); - break; - case ICM_DECOMPRESSEX_QUERY: - if ((*lParam2 != sizeof(ICDECOMPRESSEX16)) && (*lParam2 != 0)) - WARN("*lParam2 has unknown value %p\n", (ICDECOMPRESSEX16*)*lParam2); - /* FIXME: *lParm2 is meant to be 0 or an ICDECOMPRESSEX16*, but is sizeof(ICDECOMRPESSEX16) - * This is because of ICMessage(). Special case it? - { - LPVOID* addr = HeapAlloc(GetProcessHeap(), 0, 2*sizeof(LPVOID)); - addr[0] = MSVIDEO_MapICDEX16To32(lParam1); - if (*lParam2) - addr[1] = MSVIDEO_MapICDEX16To32(lParam2); - else - addr[1] = 0; - - ret = addr; - } - break;*/ - case ICM_DECOMPRESSEX_BEGIN: - case ICM_DECOMPRESSEX: - ret = MSVIDEO_MapICDEX16To32(lParam1); - *lParam2 = sizeof(ICDECOMPRESSEX); - break; - case ICM_DRAW_BEGIN: - { - ICDRAWBEGIN *icdb = HeapAlloc(GetProcessHeap(), 0, sizeof(ICDRAWBEGIN)); - ICDRAWBEGIN16 *icdb16 = MapSL(*lParam1); - ret = icdb16; - - COPY(icdb, dwFlags); - icdb->hpal = HPALETTE_32(icdb16->hpal); - icdb->hwnd = HWND_32(icdb16->hwnd); - icdb->hdc = HDC_32(icdb16->hdc); - COPY(icdb, xDst); - COPY(icdb, yDst); - COPY(icdb, dxDst); - COPY(icdb, dyDst); - COPYPTR(icdb, lpbi); - COPY(icdb, xSrc); - COPY(icdb, ySrc); - COPY(icdb, dxSrc); - COPY(icdb, dySrc); - COPY(icdb, dwRate); - COPY(icdb, dwScale); - - *lParam1 = (DWORD)(icdb); - *lParam2 = sizeof(ICDRAWBEGIN); - } - break; - case ICM_DRAW_SUGGESTFORMAT: - { - ICDRAWSUGGEST *icds = HeapAlloc(GetProcessHeap(), 0, sizeof(ICDRAWSUGGEST)); - ICDRAWSUGGEST16 *icds16 = MapSL(*lParam1); - - ret = icds16; - - COPY(icds, dwFlags); - COPYPTR(icds, lpbiIn); - COPYPTR(icds, lpbiSuggest); - COPY(icds, dxSrc); - COPY(icds, dySrc); - COPY(icds, dxDst); - COPY(icds, dyDst); - icds->hicDecompressor = HIC_32(icds16->hicDecompressor); - - *lParam1 = (DWORD)(icds); - *lParam2 = sizeof(ICDRAWSUGGEST); - } - break; - case ICM_DRAW: - { - ICDRAW *icd = HeapAlloc(GetProcessHeap(), 0, sizeof(ICDRAW)); - ICDRAW *icd16 = MapSL(*lParam1); - ret = icd16; - - COPY(icd, dwFlags); - COPYPTR(icd, lpFormat); - COPYPTR(icd, lpData); - COPY(icd, cbData); - COPY(icd, lTime); - - *lParam1 = (DWORD)(icd); - *lParam2 = sizeof(ICDRAW); - } - break; - case ICM_DRAW_START: - case ICM_DRAW_STOP: - break; - default: - FIXME("%d is not yet handled. Expect a crash.\n", msg); - } - return ret; -} - -#undef COPY -#undef COPYPTR - -/****************************************************************** - * MSVIDEO_UnmapMsg16To32 - * - * - */ -static void MSVIDEO_UnmapMsg16To32(UINT msg, LPVOID data16, LPDWORD lParam1, LPDWORD lParam2) -{ - TRACE("Unmapping %d\n", msg); - -#define UNCOPY(x, y) (x##16->y = x->y); - - switch (msg) - { - case ICM_GETINFO: - { - ICINFO *ici = (ICINFO*)(*lParam1); - ICINFO16 *ici16 = data16; - - UNCOPY(ici, fccType); - UNCOPY(ici, fccHandler); - UNCOPY(ici, dwFlags); - UNCOPY(ici, dwVersion); - UNCOPY(ici, dwVersionICM); - WideCharToMultiByte( CP_ACP, 0, ici->szName, -1, ici16->szName, - sizeof(ici16->szName), NULL, NULL ); - ici16->szName[sizeof(ici16->szName)-1] = 0; - WideCharToMultiByte( CP_ACP, 0, ici->szDescription, -1, ici16->szDescription, - sizeof(ici16->szDescription), NULL, NULL ); - ici16->szDescription[sizeof(ici16->szDescription)-1] = 0; - /* This just gives garbage for some reason - BB - lstrcpynWtoA(ici16->szDriver, ici->szDriver, 128);*/ - - HeapFree(GetProcessHeap(), 0, ici); - } - break; - case ICM_DECOMPRESS_QUERY: - /*{ - LPVOID* x = data16; - HeapFree(GetProcessHeap(), 0, x[0]); - if (x[1]) - HeapFree(GetProcessHeap(), 0, x[1]); - } - break;*/ - case ICM_COMPRESS: - case ICM_DECOMPRESS: - case ICM_DECOMPRESSEX_QUERY: - case ICM_DECOMPRESSEX_BEGIN: - case ICM_DECOMPRESSEX: - case ICM_DRAW_BEGIN: - case ICM_DRAW_SUGGESTFORMAT: - case ICM_DRAW: - HeapFree(GetProcessHeap(), 0, data16); - break; - default: - ERR("Unmapping unmapped msg %d\n", msg); - } -#undef UNCOPY -} - -/*********************************************************************** - * ICInfo [MSVIDEO.200] - */ -BOOL16 VFWAPI ICInfo16(DWORD fccType, DWORD fccHandler, ICINFO16 *lpicinfo) -{ - BOOL16 ret; - LPVOID lpv; - DWORD lParam = (DWORD)lpicinfo; - DWORD size = ((ICINFO*)(MapSL((SEGPTR)lpicinfo)))->dwSize; - - /* Use the mapping functions to map the ICINFO structure */ - lpv = MSVIDEO_MapMsg16To32(ICM_GETINFO, &lParam, &size); - - ret = ICInfo(fccType, fccHandler, (ICINFO*)lParam); - - MSVIDEO_UnmapMsg16To32(ICM_GETINFO, lpv, &lParam, &size); - - return ret; -} - -/****************************************************************** - * IC_Callback3216 - * - * - */ -static LRESULT CALLBACK IC_Callback3216(HIC hic, HDRVR hdrv, UINT msg, DWORD lp1, DWORD lp2) -{ - WINE_HIC* whic; - WORD args[8]; - - whic = MSVIDEO_GetHicPtr(hic); - if (whic) - { - DWORD ret = 0; - switch (msg) - { - case DRV_OPEN: - lp2 = (DWORD)MapLS((void*)lp2); - break; - } - args[7] = HIWORD(hic); - args[6] = LOWORD(hic); - args[5] = HDRVR_16(whic->hdrv); - args[4] = msg; - args[3] = HIWORD(lp1); - args[2] = LOWORD(lp1); - args[1] = HIWORD(lp2); - args[0] = LOWORD(lp2); - WOWCallback16Ex( whic->driverproc16, WCB16_PASCAL, sizeof(args), args, &ret ); - - switch (msg) - { - case DRV_OPEN: - UnMapLS(lp2); - break; - } - return ret; - } - else return ICERR_BADHANDLE; -} - -/*********************************************************************** - * ICOpenFunction [MSVIDEO.206] - */ -HIC16 VFWAPI ICOpenFunction16(DWORD fccType, DWORD fccHandler, UINT16 wMode, FARPROC16 lpfnHandler) -{ - HIC hic32; - - hic32 = MSVIDEO_OpenFunction(fccType, fccHandler, wMode, - (DRIVERPROC)IC_Callback3216, (DWORD)lpfnHandler); - return HIC_16(hic32); -} - -/*********************************************************************** - * ICSendMessage [MSVIDEO.205] - */ -LRESULT VFWAPI ICSendMessage16(HIC16 hic, UINT16 msg, DWORD lParam1, DWORD lParam2) -{ - LRESULT ret = ICERR_BADHANDLE; - WINE_HIC* whic; - - whic = MSVIDEO_GetHicPtr(HIC_32(hic)); - if (whic) - { - /* we've got a 16 bit driver proc... call it directly */ - if (whic->driverproc16) - { - WORD args[8]; - DWORD result; - - /* FIXME: original code was passing hdrv first and hic second */ - /* but this doesn't match what IC_Callback3216 does */ - args[7] = HIWORD(hic); - args[6] = LOWORD(hic); - args[5] = HDRVR_16(whic->hdrv); - args[4] = msg; - args[3] = HIWORD(lParam1); - args[2] = LOWORD(lParam1); - args[1] = HIWORD(lParam2); - args[0] = LOWORD(lParam2); - WOWCallback16Ex( whic->driverproc16, WCB16_PASCAL, sizeof(args), args, &result ); - ret = result; - } - else - { - /* map the message for a 32 bit infrastructure, and pass it along */ - void* data16 = MSVIDEO_MapMsg16To32(msg, &lParam1, &lParam2); - - ret = MSVIDEO_SendMessage(whic, msg, lParam1, lParam2); - if (data16) - MSVIDEO_UnmapMsg16To32(msg, data16, &lParam1, &lParam2); - } - } - return ret; -} - -/*********************************************************************** - * VideoCapDriverDescAndVer [MSVIDEO.22] - */ -DWORD WINAPI VideoCapDriverDescAndVer16(WORD nr, LPSTR buf1, WORD buf1len, - LPSTR buf2, WORD buf2len) -{ - static const char version_info_spec[] = "\\StringFileInfo\\040904E4\\FileDescription"; - DWORD verhandle; - DWORD infosize; - UINT subblocklen; - char *s, buf[2048], fn[260]; - LPBYTE infobuf; - LPVOID subblock; - DWORD i, cnt = 0, lRet; - DWORD bufLen, fnLen; - FILETIME lastWrite; - HKEY hKey; - BOOL found = FALSE; - - TRACE("(%d,%p,%d,%p,%d)\n", nr, buf1, buf1len, buf2, buf2len); - lRet = RegOpenKeyExA(HKEY_LOCAL_MACHINE, HKLM_DRIVERS32, 0, KEY_QUERY_VALUE, &hKey); - if (lRet == ERROR_SUCCESS) - { - RegQueryInfoKeyA( hKey, 0, 0, 0, &cnt, 0, 0, 0, 0, 0, 0, 0); - for (i = 0; i < cnt; i++) - { - bufLen = sizeof(buf) / sizeof(buf[0]); - lRet = RegEnumKeyExA(hKey, i, buf, &bufLen, 0, 0, 0, &lastWrite); - if (lRet != ERROR_SUCCESS) continue; - if (strncasecmp(buf, "vid", 3)) continue; - if (nr--) continue; - fnLen = sizeof(fn); - lRet = RegQueryValueExA(hKey, buf, 0, 0, (LPBYTE)fn, &fnLen); - if (lRet == ERROR_SUCCESS) found = TRUE; - break; - } - RegCloseKey( hKey ); - } - - /* search system.ini if not found in the registry */ - if (!found && GetPrivateProfileStringA("drivers32", NULL, NULL, buf, sizeof(buf), "system.ini")) - { - for (s = buf; *s; s += strlen(s) + 1) - { - if (strncasecmp(s, "vid", 3)) continue; - if (nr--) continue; - if (GetPrivateProfileStringA("drivers32", s, NULL, fn, sizeof(fn), "system.ini")) - found = TRUE; - break; - } - } - - if (!found) - { - TRACE("No more VID* entries found nr=%d\n", nr); - return 20; - } - infosize = GetFileVersionInfoSizeA(fn, &verhandle); - if (!infosize) - { - TRACE("%s has no fileversioninfo.\n", fn); - return 18; - } - infobuf = HeapAlloc(GetProcessHeap(), 0, infosize); - if (GetFileVersionInfoA(fn, verhandle, infosize, infobuf)) - { - /* Yes, two space behind : */ - /* FIXME: test for buflen */ - snprintf(buf2, buf2len, "Version: %d.%d.%d.%d\n", - ((WORD*)infobuf)[0x0f], - ((WORD*)infobuf)[0x0e], - ((WORD*)infobuf)[0x11], - ((WORD*)infobuf)[0x10] - ); - TRACE("version of %s is %s\n", fn, buf2); - } - else - { - TRACE("GetFileVersionInfoA failed for %s.\n", fn); - lstrcpynA(buf2, fn, buf2len); /* msvideo.dll appears to copy fn*/ - } - /* FIXME: language problem? */ - if (VerQueryValueA( infobuf, - version_info_spec, - &subblock, - &subblocklen - )) - { - UINT copylen = min(subblocklen,buf1len-1); - memcpy(buf1, subblock, copylen); - buf1[copylen] = '\0'; - TRACE("VQA returned %s\n", (LPCSTR)subblock); - } - else - { - TRACE("VQA did not return on query \\StringFileInfo\\040904E4\\FileDescription?\n"); - lstrcpynA(buf1, fn, buf1len); /* msvideo.dll appears to copy fn*/ - } - HeapFree(GetProcessHeap(), 0, infobuf); - return 0; -} - -/****************************************************************** - * IC_CallTo16 - * - * - */ -static LRESULT CALLBACK IC_CallTo16(HDRVR hdrv, HIC hic, UINT msg, LPARAM lp1, LPARAM lp2) -{ -#if 0 - WINE_HIC* whic = IC_GetPtr(hic); - LRESULT ret = 0; - - - if (whic->driverproc) - { - ret = whic->driverproc(hic, whic->hdrv, msg, lParam1, lParam2); - } - else - { - ret = SendDriverMessage(whic->hdrv, msg, lParam1, lParam2); - } -#else - FIXME("No 32=>16 conversion yet\n"); -#endif - return 0; -} - -/************************************************************************** - * DllEntryPoint (MSVIDEO.3) - * - * MSVIDEO DLL entry point - * - */ -BOOL WINAPI VIDEO_LibMain(DWORD fdwReason, HINSTANCE hinstDLL, WORD ds, - WORD wHeapSize, DWORD dwReserved1, WORD wReserved2) -{ - switch (fdwReason) - { - case DLL_PROCESS_ATTACH: - /* hook in our 16 bit management functions */ - pFnCallTo16 = IC_CallTo16; - break; - case DLL_PROCESS_DETACH: - /* remove our 16 bit management functions */ - pFnCallTo16 = NULL; - break; - case DLL_THREAD_ATTACH: - case DLL_THREAD_DETACH: - break; - } - return TRUE; -} diff --git a/reactos/dll/win32/msvfw32/vfw16.h b/reactos/dll/win32/msvfw32/vfw16.h deleted file mode 100644 index 5cf97915dbc..00000000000 --- a/reactos/dll/win32/msvfw32/vfw16.h +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Copyright 1999 Marcus Meissner - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA - */ - -#ifndef __WINE_VFW16_H -#define __WINE_VFW16_H - -#include - -#include "windef.h" -#include "winbase.h" -#include "wingdi.h" -#include "vfw.h" -#include "wownt32.h" -#include "wine/windef16.h" - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -typedef HANDLE16 HDRAWDIB16; - -#include "pshpack1.h" - -typedef struct { - DWORD dwSize; - DWORD fccType; - DWORD fccHandler; - DWORD dwFlags; - DWORD dwVersion; - DWORD dwVersionICM; - /* - * under Win16, normal chars are used - */ - CHAR szName[16]; - CHAR szDescription[128]; - CHAR szDriver[128]; -} ICINFO16; - -typedef struct { - DWORD dwFlags; - LPBITMAPINFOHEADER lpbiSrc; - LPVOID lpSrc; - LPBITMAPINFOHEADER lpbiDst; - LPVOID lpDst; - - INT16 xDst; /* destination rectangle */ - INT16 yDst; - INT16 dxDst; - INT16 dyDst; - - INT16 xSrc; /* source rectangle */ - INT16 ySrc; - INT16 dxSrc; - INT16 dySrc; -} ICDECOMPRESSEX16; - -typedef struct { - DWORD dwFlags; - HPALETTE16 hpal; - HWND16 hwnd; - HDC16 hdc; - INT16 xDst; - INT16 yDst; - INT16 dxDst; - INT16 dyDst; - LPBITMAPINFOHEADER lpbi; - INT16 xSrc; - INT16 ySrc; - INT16 dxSrc; - INT16 dySrc; - DWORD dwRate; - DWORD dwScale; -} ICDRAWBEGIN16; - -#include "poppack.h" - -typedef struct { - DWORD dwFlags; - LPBITMAPINFOHEADER lpbiIn; - LPBITMAPINFOHEADER lpbiSuggest; - INT16 dxSrc; - INT16 dySrc; - INT16 dxDst; - INT16 dyDst; - HIC16 hicDecompressor; -} ICDRAWSUGGEST16; - -DWORD VFWAPIV ICDraw16(HIC16,DWORD,LPVOID,LPVOID,DWORD,LONG); -DWORD VFWAPIV ICDrawBegin16(HIC16,DWORD,HPALETTE16,HWND16,HDC16,INT16, - INT16,INT16,INT16,LPBITMAPINFOHEADER, - INT16,INT16,INT16,INT16,DWORD,DWORD); -LRESULT WINAPI ICClose16(HIC16); -DWORD VFWAPIV ICCompress16(HIC16,DWORD,LPBITMAPINFOHEADER,LPVOID, - LPBITMAPINFOHEADER,LPVOID,LPDWORD, - LPDWORD,LONG,DWORD,DWORD, - LPBITMAPINFOHEADER,LPVOID); -DWORD VFWAPIV ICDecompress16(HIC16,DWORD,LPBITMAPINFOHEADER,LPVOID, - LPBITMAPINFOHEADER,LPVOID); -HIC16 VFWAPI ICGetDisplayFormat16(HIC16,LPBITMAPINFOHEADER, - LPBITMAPINFOHEADER,INT16,INT16, - INT16); -LRESULT VFWAPI ICGetInfo16(HIC16,ICINFO16 *,DWORD); -BOOL16 VFWAPI ICInfo16(DWORD,DWORD,ICINFO16 *); -HIC16 VFWAPI ICLocate16(DWORD,DWORD,LPBITMAPINFOHEADER, - LPBITMAPINFOHEADER,WORD); -LRESULT VFWAPIV ICMessage16( HIC16 hic, UINT16 msg, UINT16 cb, VA_LIST16 valist ); -HIC16 VFWAPI ICOpen16(DWORD,DWORD,UINT16); -HIC16 VFWAPI ICOpenFunction16(DWORD,DWORD,UINT16,FARPROC16); -LRESULT VFWAPI ICSendMessage16(HIC16,UINT16,DWORD,DWORD); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* __WINE_VFW16_H */ diff --git a/reactos/dll/win32/msvidc32/msvideo1.c b/reactos/dll/win32/msvidc32/msvideo1.c index 19784eb888e..68a52c651dd 100644 --- a/reactos/dll/win32/msvidc32/msvideo1.c +++ b/reactos/dll/win32/msvidc32/msvideo1.c @@ -95,10 +95,18 @@ msvideo1_decode_8bit( int width, int height, const unsigned char *buf, int buf_s blocks_high = height / 4; total_blocks = blocks_wide * blocks_high; block_inc = 4; +#ifdef ORIGINAL row_dec = stride + 4; +#else + row_dec = - (stride - 4); /* such that -row_dec > 0 */ +#endif for (block_y = blocks_high; block_y > 0; block_y--) { +#ifdef ORIGINAL block_ptr = ((block_y * 4) - 1) * stride; +#else + block_ptr = ((blocks_high - block_y) * 4) * stride; +#endif for (block_x = blocks_wide; block_x > 0; block_x--) { /* check if this block should be skipped */ if (skip_blocks) { @@ -131,16 +139,7 @@ msvideo1_decode_8bit( int width, int height, const unsigned char *buf, int buf_s for (pixel_y = 0; pixel_y < 4; pixel_y++) { for (pixel_x = 0; pixel_x < 4; pixel_x++, flags >>= 1) - { -#ifdef ORIGINAL pixels[pixel_ptr++] = colors[(flags & 0x1) ^ 1]; -#else - pixels[width*(height-(pixel_ptr/width)-1) + - pixel_ptr%width] = - colors[(flags & 0x1) ^ 1]; - pixel_ptr++; -#endif - } pixel_ptr -= row_dec; } } else if (byte_b >= 0x90) { @@ -153,19 +152,9 @@ msvideo1_decode_8bit( int width, int height, const unsigned char *buf, int buf_s for (pixel_y = 0; pixel_y < 4; pixel_y++) { for (pixel_x = 0; pixel_x < 4; pixel_x++, flags >>= 1) - { -#ifdef ORIGINAL - pixels[pixel_ptr++] = - colors[((pixel_y & 0x2) << 1) + + pixels[pixel_ptr++] = + colors[((pixel_y & 0x2) << 1) + (pixel_x & 0x2) + ((flags & 0x1) ^ 1)]; -#else - pixels[width*(height-(pixel_ptr/width)-1) + - pixel_ptr%width] = - colors[((pixel_y & 0x2) << 1) + - (pixel_x & 0x2) + ((flags & 0x1) ^ 1)]; - pixel_ptr++; -#endif - } pixel_ptr -= row_dec; } } else { @@ -174,15 +163,7 @@ msvideo1_decode_8bit( int width, int height, const unsigned char *buf, int buf_s for (pixel_y = 0; pixel_y < 4; pixel_y++) { for (pixel_x = 0; pixel_x < 4; pixel_x++) - { -#ifdef ORIGINAL pixels[pixel_ptr++] = colors[0]; -#else - pixels[width*(height-(pixel_ptr/width)-1) + - pixel_ptr%width] = colors[0]; - pixel_ptr++; -#endif - } pixel_ptr -= row_dec; } } @@ -218,10 +199,18 @@ msvideo1_decode_16bit( int width, int height, const unsigned char *buf, int buf_ blocks_high = height / 4; total_blocks = blocks_wide * blocks_high; block_inc = 4; +#ifdef ORIGINAL row_dec = stride + 4; +#else + row_dec = - (stride - 4); /* such that -row_dec > 0 */ +#endif for (block_y = blocks_high; block_y > 0; block_y--) { +#ifdef ORIGINAL block_ptr = ((block_y * 4) - 1) * stride; +#else + block_ptr = ((blocks_high - block_y) * 4) * stride; +#endif for (block_x = blocks_wide; block_x > 0; block_x--) { /* check if this block should be skipped */ if (skip_blocks) { @@ -272,8 +261,8 @@ msvideo1_decode_16bit( int width, int height, const unsigned char *buf, int buf_ for (pixel_y = 0; pixel_y < 4; pixel_y++) { for (pixel_x = 0; pixel_x < 4; pixel_x++, flags >>= 1) - pixels[pixel_ptr++] = - colors[((pixel_y & 0x2) << 1) + + pixels[pixel_ptr++] = + colors[((pixel_y & 0x2) << 1) + (pixel_x & 0x2) + ((flags & 0x1) ^ 1)]; pixel_ptr -= row_dec; } @@ -408,7 +397,7 @@ static LRESULT CRAM_Decompress( Msvideo1Context *info, ICDECOMPRESS *icd, DWORD width = icd->lpbiInput->biWidth; height = icd->lpbiInput->biHeight; bit_per_pixel = icd->lpbiInput->biBitCount; - stride = width*bit_per_pixel/8; + stride = width; /* in bytes or 16bit words */ sz = icd->lpbiInput->biSizeImage; if (info->mode_8bit) @@ -440,7 +429,7 @@ static LRESULT CRAM_DecompressEx( Msvideo1Context *info, ICDECOMPRESSEX *icd, DW width = icd->lpbiSrc->biWidth; height = icd->lpbiSrc->biHeight; bit_per_pixel = icd->lpbiSrc->biBitCount; - stride = width*bit_per_pixel/8; + stride = width; sz = icd->lpbiSrc->biSizeImage; if (info->mode_8bit) @@ -562,6 +551,10 @@ LRESULT WINAPI CRAM_DriverProc( DWORD_PTR dwDriverId, HDRVR hdrvr, UINT msg, (DWORD) lParam2 ); break; + case ICM_DECOMPRESS_END: + r = ICERR_OK; + break; + case ICM_COMPRESS_QUERY: FIXME("compression not implemented\n"); r = ICERR_BADFORMAT; diff --git a/reactos/dll/win32/msxml3/dispex.c b/reactos/dll/win32/msxml3/dispex.c index 529f9a452ee..09b71fed39d 100644 --- a/reactos/dll/win32/msxml3/dispex.c +++ b/reactos/dll/win32/msxml3/dispex.c @@ -196,12 +196,12 @@ static void add_func_info(dispex_data_t *data, DWORD *size, tid_t tid, DISPID id static int dispid_cmp(const void *p1, const void *p2) { - return ((func_info_t*)p1)->id - ((func_info_t*)p2)->id; + return ((const func_info_t*)p1)->id - ((const func_info_t*)p2)->id; } static int func_name_cmp(const void *p1, const void *p2) { - return strcmpiW((*(func_info_t**)p1)->name, (*(func_info_t**)p2)->name); + return strcmpiW((*(func_info_t* const*)p1)->name, (*(func_info_t* const*)p2)->name); } static dispex_data_t *preprocess_dispex_data(DispatchEx *This) diff --git a/reactos/dll/win32/msxml3/element.c b/reactos/dll/win32/msxml3/element.c index b6caf73df15..617c008e288 100644 --- a/reactos/dll/win32/msxml3/element.c +++ b/reactos/dll/win32/msxml3/element.c @@ -594,7 +594,7 @@ static HRESULT WINAPI domelem_removeAttribute( IXMLDOMNamedNodeMap *attr; HRESULT hr; - TRACE("(%p)->(%s)", This, debugstr_w(p)); + TRACE("(%p)->(%s)\n", This, debugstr_w(p)); hr = IXMLDOMElement_get_attributes(iface, &attr); if (hr != S_OK) return hr; diff --git a/reactos/dll/win32/msxml3/main.c b/reactos/dll/win32/msxml3/main.c index 9b1eb823fbe..60b0cbd7b53 100644 --- a/reactos/dll/win32/msxml3/main.c +++ b/reactos/dll/win32/msxml3/main.c @@ -62,7 +62,7 @@ static int wineXmlMatchCallback (char const * filename) static void *wineXmlOpenCallback (char const * filename) { - BSTR sFilename = bstr_from_xmlChar( (xmlChar*)filename); + BSTR sFilename = bstr_from_xmlChar( (const xmlChar*)filename); HANDLE hFile; TRACE("%s\n", debugstr_w(sFilename)); diff --git a/reactos/dll/win32/msxml3/node.c b/reactos/dll/win32/msxml3/node.c index ac97681aac9..e263a2a143d 100644 --- a/reactos/dll/win32/msxml3/node.c +++ b/reactos/dll/win32/msxml3/node.c @@ -934,8 +934,9 @@ static HRESULT WINAPI xmlnode_get_specified( VARIANT_BOOL* isSpecified) { xmlnode *This = impl_from_IXMLDOMNode( iface ); - FIXME("(%p)->(%p)\n", This, isSpecified); - return E_NOTIMPL; + FIXME("(%p)->(%p) stub!\n", This, isSpecified); + *isSpecified = VARIANT_TRUE; + return S_OK; } static HRESULT WINAPI xmlnode_get_definition( @@ -1190,8 +1191,8 @@ static HRESULT WINAPI xmlnode_get_dataType( switch ( This->node->type ) { case XML_ELEMENT_NODE: - pVal = xmlGetNsProp(This->node, (xmlChar*)"dt", - (xmlChar*)"urn:schemas-microsoft-com:datatypes"); + pVal = xmlGetNsProp(This->node, (const xmlChar*)"dt", + (const xmlChar*)"urn:schemas-microsoft-com:datatypes"); if (pVal) { V_VT(dataTypeName) = VT_BSTR; @@ -1260,20 +1261,20 @@ static HRESULT WINAPI xmlnode_put_dataType( xmlAttrPtr pAttr = NULL; xmlChar* str = xmlChar_from_wchar(dataTypeName); - pAttr = xmlHasNsProp(This->node, (xmlChar*)"dt", - (xmlChar*)"urn:schemas-microsoft-com:datatypes"); + pAttr = xmlHasNsProp(This->node, (const xmlChar*)"dt", + (const xmlChar*)"urn:schemas-microsoft-com:datatypes"); if (pAttr) { - pAttr = xmlSetNsProp(This->node, pAttr->ns, (xmlChar*)"dt", str); + pAttr = xmlSetNsProp(This->node, pAttr->ns, (const xmlChar*)"dt", str); hr = S_OK; } else { - pNS = xmlNewNs(This->node, (xmlChar*)"urn:schemas-microsoft-com:datatypes", (xmlChar*)"dt"); + pNS = xmlNewNs(This->node, (const xmlChar*)"urn:schemas-microsoft-com:datatypes", (const xmlChar*)"dt"); if(pNS) { - pAttr = xmlNewNsProp(This->node, pNS, (xmlChar*)"dt", str); + pAttr = xmlNewNsProp(This->node, pNS, (const xmlChar*)"dt", str); if(pAttr) { xmlAddChild(This->node, (xmlNodePtr)pAttr); @@ -1294,8 +1295,6 @@ static HRESULT WINAPI xmlnode_put_dataType( static BSTR EnsureCorrectEOL(BSTR sInput) { - static const WCHAR SZ_RETURN[] = {'\n',0}; - static const WCHAR SZ_LINEFEED[] = {'\r',0}; int nNum = 0; BSTR sNew; int nLen; @@ -1305,7 +1304,7 @@ static BSTR EnsureCorrectEOL(BSTR sInput) /* Count line endings */ for(i=0; i < nLen; i++) { - if(sInput[i] == SZ_RETURN[0]) + if(sInput[i] == '\n') nNum++; } @@ -1318,9 +1317,9 @@ static BSTR EnsureCorrectEOL(BSTR sInput) sNew = SysAllocStringLen(NULL, nLen + nNum+1); for(i=0; i < nLen; i++) { - if(sInput[i] == SZ_RETURN[0]) + if(sInput[i] == '\n') { - sNew[i+nPlace] = SZ_LINEFEED[0]; + sNew[i+nPlace] = '\r'; nPlace++; } sNew[i+nPlace] = sInput[i]; @@ -1371,7 +1370,7 @@ static BSTR EnsureNoEncoding(BSTR sInput) /* * We are trying to replicate the same behaviour as msxml by converting - * line endings to \r\n and using idents as \t. The problem is that msxml + * line endings to \r\n and using indents as \t. The problem is that msxml * only formats nodes that have a line ending. Using libxml we cannot * reproduce behaviour exactly. * @@ -1402,7 +1401,7 @@ static HRESULT WINAPI xmlnode_get_xml( /* Attribute Nodes return a space in front of their name */ pContent = xmlBufferContent(pXmlBuf); - if( ((char*)pContent)[0] == ' ') + if( ((const char*)pContent)[0] == ' ') bstrContent = bstr_from_xmlChar(pContent+1); else bstrContent = bstr_from_xmlChar(pContent); @@ -1550,8 +1549,9 @@ static HRESULT WINAPI xmlnode_get_parsed( VARIANT_BOOL* isParsed) { xmlnode *This = impl_from_IXMLDOMNode( iface ); - FIXME("(%p)->(%p)\n", This, isParsed); - return E_NOTIMPL; + FIXME("(%p)->(%p) stub!\n", This, isParsed); + *isParsed = VARIANT_TRUE; + return S_OK; } static HRESULT WINAPI xmlnode_get_namespaceURI( From 590cff7bd18dc92d414690454d4fdab624155e4b Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Tue, 20 Apr 2010 17:36:44 +0000 Subject: [PATCH 016/131] - Add Wow64* functions declarations to winbase.h - Export Wow64* functions in kernel32, because 32bit Windows also exports them. - Sync ole32, oleaut32 with Wine-1.1.43. svn path=/trunk/; revision=46959 --- reactos/dll/win32/kernel32/kernel32.pspec | 2 - reactos/dll/win32/ole32/compobj.c | 4 +- reactos/dll/win32/ole32/ftmarshal.c | 29 ++-- reactos/dll/win32/ole32/ifs.c | 175 ---------------------- reactos/dll/win32/ole32/moniker.c | 3 + reactos/dll/win32/ole32/ole32.rbuild | 1 + reactos/dll/win32/ole32/rpc.c | 56 ++++--- reactos/dll/win32/ole32/storage32.c | 125 +++++++++++----- reactos/dll/win32/ole32/storage32.h | 9 ++ reactos/dll/win32/oleaut32/olepicture.c | 2 +- reactos/dll/win32/oleaut32/regsvr.c | 6 + reactos/dll/win32/oleaut32/typelib.c | 115 +++++++------- reactos/dll/win32/oleaut32/typelib2.c | 4 +- reactos/dll/win32/oleaut32/vartype.c | 2 +- reactos/include/psdk/winbase.h | 3 + 15 files changed, 232 insertions(+), 304 deletions(-) diff --git a/reactos/dll/win32/kernel32/kernel32.pspec b/reactos/dll/win32/kernel32/kernel32.pspec index b952a287b5d..cba32d9f29d 100644 --- a/reactos/dll/win32/kernel32/kernel32.pspec +++ b/reactos/dll/win32/kernel32/kernel32.pspec @@ -966,11 +966,9 @@ @ stdcall WaitNamedPipeW (wstr long) @ stdcall WideCharToMultiByte(long long wstr long ptr long ptr ptr) @ stdcall WinExec(str long) -#ifdef _M_AMD64 @ stdcall Wow64EnableWow64FsRedirection(long) @ stdcall Wow64DisableWow64FsRedirection(long) @ stdcall Wow64RevertWow64FsRedirection(long) -#endif @ stdcall WriteConsoleA(long ptr long ptr ptr) @ stdcall WriteConsoleInputA(long ptr long ptr) @ stdcall WriteConsoleInputVDMA(long long long long) diff --git a/reactos/dll/win32/ole32/compobj.c b/reactos/dll/win32/ole32/compobj.c index 0625c0b8949..0fb074dc50c 100644 --- a/reactos/dll/win32/ole32/compobj.c +++ b/reactos/dll/win32/ole32/compobj.c @@ -1506,7 +1506,7 @@ HRESULT WINAPI CoCreateGuid(GUID *pguid) * SEE ALSO * StringFromCLSID */ -static HRESULT __CLSIDFromString(LPCWSTR s, CLSID *id) +static HRESULT __CLSIDFromString(LPCWSTR s, LPCLSID id) { int i; BYTE table[256]; @@ -4153,11 +4153,9 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID fImpLoad) case DLL_PROCESS_ATTACH: hProxyDll = hinstDLL; COMPOBJ_InitProcess(); - if (TRACE_ON(ole)) CoRegisterMallocSpy((LPVOID)-1); break; case DLL_PROCESS_DETACH: - if (TRACE_ON(ole)) CoRevokeMallocSpy(); OLEDD_UnInitialize(); COMPOBJ_UninitProcess(); RPC_UnregisterAllChannelHooks(); diff --git a/reactos/dll/win32/ole32/ftmarshal.c b/reactos/dll/win32/ole32/ftmarshal.c index 13802854fa6..d8f4bf649b8 100644 --- a/reactos/dll/win32/ole32/ftmarshal.c +++ b/reactos/dll/win32/ole32/ftmarshal.c @@ -204,8 +204,11 @@ FTMarshalImpl_MarshalInterface (LPMARSHAL iface, IStream * pStm, REFIID riid, vo hres = IStream_Write (pStm, &object, sizeof (object), NULL); if (hres != S_OK) return STG_E_MEDIUMFULL; - hres = IStream_Write (pStm, &constant, sizeof (constant), NULL); - if (hres != S_OK) return STG_E_MEDIUMFULL; + if (sizeof(object) == sizeof(DWORD)) + { + hres = IStream_Write (pStm, &constant, sizeof (constant), NULL); + if (hres != S_OK) return STG_E_MEDIUMFULL; + } hres = IStream_Write (pStm, &unknown_guid, sizeof (unknown_guid), NULL); if (hres != S_OK) return STG_E_MEDIUMFULL; @@ -237,10 +240,13 @@ FTMarshalImpl_UnmarshalInterface (LPMARSHAL iface, IStream * pStm, REFIID riid, hres = IStream_Read (pStm, &object, sizeof (object), NULL); if (hres != S_OK) return STG_E_READFAULT; - hres = IStream_Read (pStm, &constant, sizeof (constant), NULL); - if (hres != S_OK) return STG_E_READFAULT; - if (constant != 0) - FIXME("constant is 0x%x instead of 0\n", constant); + if (sizeof(object) == sizeof(DWORD)) + { + hres = IStream_Read (pStm, &constant, sizeof (constant), NULL); + if (hres != S_OK) return STG_E_READFAULT; + if (constant != 0) + FIXME("constant is 0x%x instead of 0\n", constant); + } hres = IStream_Read (pStm, &unknown_guid, sizeof (unknown_guid), NULL); if (hres != S_OK) return STG_E_READFAULT; @@ -267,10 +273,13 @@ static HRESULT WINAPI FTMarshalImpl_ReleaseMarshalData (LPMARSHAL iface, IStream hres = IStream_Read (pStm, &object, sizeof (object), NULL); if (hres != S_OK) return STG_E_READFAULT; - hres = IStream_Read (pStm, &constant, sizeof (constant), NULL); - if (hres != S_OK) return STG_E_READFAULT; - if (constant != 0) - FIXME("constant is 0x%x instead of 0\n", constant); + if (sizeof(object) == sizeof(DWORD)) + { + hres = IStream_Read (pStm, &constant, sizeof (constant), NULL); + if (hres != S_OK) return STG_E_READFAULT; + if (constant != 0) + FIXME("constant is 0x%x instead of 0\n", constant); + } hres = IStream_Read (pStm, &unknown_guid, sizeof (unknown_guid), NULL); if (hres != S_OK) return STG_E_READFAULT; diff --git a/reactos/dll/win32/ole32/ifs.c b/reactos/dll/win32/ole32/ifs.c index dc625bcc99e..c6a6962cd72 100644 --- a/reactos/dll/win32/ole32/ifs.c +++ b/reactos/dll/win32/ole32/ifs.c @@ -359,173 +359,6 @@ static const IMallocVtbl VT_IMalloc32 = IMalloc_fnHeapMinimize }; -/****************************************************************************** - * IMallocSpy implementation - *****************************************************************************/ - -/* set the vtable later */ -static const IMallocSpyVtbl VT_IMallocSpy; - -typedef struct { - const IMallocSpyVtbl *lpVtbl; - LONG ref; -} _MallocSpy; - -/* this is the static object instance */ -static _MallocSpy MallocSpy = {&VT_IMallocSpy, 0}; - -/****************************************************************************** - * IMalloc32_QueryInterface [VTABLE] - */ -static HRESULT WINAPI IMallocSpy_fnQueryInterface(LPMALLOCSPY iface,REFIID refiid,LPVOID *obj) -{ - - TRACE("(%s,%p)\n",debugstr_guid(refiid),obj); - - if (IsEqualIID(&IID_IUnknown,refiid) || IsEqualIID(&IID_IMallocSpy,refiid)) { - *obj = &MallocSpy; - return S_OK; - } - return E_NOINTERFACE; -} - -/****************************************************************************** - * IMalloc32_AddRef [VTABLE] - */ -static ULONG WINAPI IMallocSpy_fnAddRef (LPMALLOCSPY iface) -{ - - _MallocSpy *This = (_MallocSpy *)iface; - ULONG ref = InterlockedIncrement(&This->ref); - - TRACE ("(%p)->(count=%u)\n", This, ref - 1); - - return ref; -} - -/****************************************************************************** - * IMalloc32_AddRelease [VTABLE] - * - * NOTES - * Our MallocSpy is static. If the count reaches 0 we dump the leaks - */ -static ULONG WINAPI IMallocSpy_fnRelease (LPMALLOCSPY iface) -{ - - _MallocSpy *This = (_MallocSpy *)iface; - ULONG ref = InterlockedDecrement(&This->ref); - - TRACE ("(%p)->(count=%u)\n", This, ref + 1); - - if (!ref) { - /* our allocation list MUST be empty here */ - } - return ref; -} - -static ULONG WINAPI IMallocSpy_fnPreAlloc(LPMALLOCSPY iface, ULONG cbRequest) -{ - _MallocSpy *This = (_MallocSpy *)iface; - TRACE ("(%p)->(%u)\n", This, cbRequest); - return cbRequest; -} -static PVOID WINAPI IMallocSpy_fnPostAlloc(LPMALLOCSPY iface, void* pActual) -{ - _MallocSpy *This = (_MallocSpy *)iface; - TRACE ("(%p)->(%p)\n", This, pActual); - return pActual; -} - -static PVOID WINAPI IMallocSpy_fnPreFree(LPMALLOCSPY iface, void* pRequest, BOOL fSpyed) -{ - _MallocSpy *This = (_MallocSpy *)iface; - TRACE ("(%p)->(%p %u)\n", This, pRequest, fSpyed); - return pRequest; -} -static void WINAPI IMallocSpy_fnPostFree(LPMALLOCSPY iface, BOOL fSpyed) -{ - _MallocSpy *This = (_MallocSpy *)iface; - TRACE ("(%p)->(%u)\n", This, fSpyed); -} - -static ULONG WINAPI IMallocSpy_fnPreRealloc(LPMALLOCSPY iface, void* pRequest, ULONG cbRequest, void** ppNewRequest, BOOL fSpyed) -{ - _MallocSpy *This = (_MallocSpy *)iface; - TRACE ("(%p)->(%p %u %u)\n", This, pRequest, cbRequest, fSpyed); - *ppNewRequest = pRequest; - return cbRequest; -} - -static PVOID WINAPI IMallocSpy_fnPostRealloc(LPMALLOCSPY iface, void* pActual, BOOL fSpyed) -{ - _MallocSpy *This = (_MallocSpy *)iface; - TRACE ("(%p)->(%p %u)\n", This, pActual, fSpyed); - return pActual; -} - -static PVOID WINAPI IMallocSpy_fnPreGetSize(LPMALLOCSPY iface, void* pRequest, BOOL fSpyed) -{ - _MallocSpy *This = (_MallocSpy *)iface; - TRACE ("(%p)->(%p %u)\n", This, pRequest, fSpyed); - return pRequest; -} - -static ULONG WINAPI IMallocSpy_fnPostGetSize(LPMALLOCSPY iface, ULONG cbActual, BOOL fSpyed) -{ - _MallocSpy *This = (_MallocSpy *)iface; - TRACE ("(%p)->(%u %u)\n", This, cbActual, fSpyed); - return cbActual; -} - -static PVOID WINAPI IMallocSpy_fnPreDidAlloc(LPMALLOCSPY iface, void* pRequest, BOOL fSpyed) -{ - _MallocSpy *This = (_MallocSpy *)iface; - TRACE ("(%p)->(%p %u)\n", This, pRequest, fSpyed); - return pRequest; -} - -static int WINAPI IMallocSpy_fnPostDidAlloc(LPMALLOCSPY iface, void* pRequest, BOOL fSpyed, int fActual) -{ - _MallocSpy *This = (_MallocSpy *)iface; - TRACE ("(%p)->(%p %u %u)\n", This, pRequest, fSpyed, fActual); - return fActual; -} - -static void WINAPI IMallocSpy_fnPreHeapMinimize(LPMALLOCSPY iface) -{ - _MallocSpy *This = (_MallocSpy *)iface; - TRACE ("(%p)->()\n", This); -} - -static void WINAPI IMallocSpy_fnPostHeapMinimize(LPMALLOCSPY iface) -{ - _MallocSpy *This = (_MallocSpy *)iface; - TRACE ("(%p)->()\n", This); -} - -static void MallocSpyDumpLeaks(void) { - TRACE("leaks: %u\n", Malloc32.SpyedAllocationsLeft); -} - -static const IMallocSpyVtbl VT_IMallocSpy = -{ - IMallocSpy_fnQueryInterface, - IMallocSpy_fnAddRef, - IMallocSpy_fnRelease, - IMallocSpy_fnPreAlloc, - IMallocSpy_fnPostAlloc, - IMallocSpy_fnPreFree, - IMallocSpy_fnPostFree, - IMallocSpy_fnPreRealloc, - IMallocSpy_fnPostRealloc, - IMallocSpy_fnPreGetSize, - IMallocSpy_fnPostGetSize, - IMallocSpy_fnPreDidAlloc, - IMallocSpy_fnPostDidAlloc, - IMallocSpy_fnPreHeapMinimize, - IMallocSpy_fnPostHeapMinimize -}; - /****************************************************************************** * CoGetMalloc [OLE32.@] * @@ -620,9 +453,6 @@ HRESULT WINAPI CoRegisterMallocSpy(LPMALLOCSPY pMallocSpy) TRACE("\n"); - /* HACK TO ACTIVATE OUT SPY */ - if (pMallocSpy == (LPVOID)-1) pMallocSpy =(IMallocSpy*)&MallocSpy; - if(Malloc32.pSpy) return CO_E_OBJISREG; EnterCriticalSection(&IMalloc32_SpyCS); @@ -661,11 +491,6 @@ HRESULT WINAPI CoRevokeMallocSpy(void) EnterCriticalSection(&IMalloc32_SpyCS); - /* if it's our spy it's time to dump the leaks */ - if (Malloc32.pSpy == (IMallocSpy*)&MallocSpy) { - MallocSpyDumpLeaks(); - } - if (Malloc32.SpyedAllocationsLeft) { TRACE("SpyReleasePending with %u allocations left\n", Malloc32.SpyedAllocationsLeft); Malloc32.SpyReleasePending = TRUE; diff --git a/reactos/dll/win32/ole32/moniker.c b/reactos/dll/win32/ole32/moniker.c index a7c5a11c98b..2fb03ae6650 100644 --- a/reactos/dll/win32/ole32/moniker.c +++ b/reactos/dll/win32/ole32/moniker.c @@ -127,6 +127,7 @@ static BOOL start_rpcss(void) WCHAR cmd[MAX_PATH]; static const WCHAR rpcss[] = {'\\','r','p','c','s','s','.','e','x','e',0}; BOOL rslt; + void *redir; TRACE("\n"); @@ -135,7 +136,9 @@ static BOOL start_rpcss(void) GetSystemDirectoryW( cmd, MAX_PATH - sizeof(rpcss)/sizeof(WCHAR) ); strcatW( cmd, rpcss ); + Wow64DisableWow64FsRedirection( &redir ); rslt = CreateProcessW( cmd, cmd, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi ); + Wow64RevertWow64FsRedirection( redir ); if (rslt) { diff --git a/reactos/dll/win32/ole32/ole32.rbuild b/reactos/dll/win32/ole32/ole32.rbuild index 24f60c87a32..85710a6b20f 100644 --- a/reactos/dll/win32/ole32/ole32.rbuild +++ b/reactos/dll/win32/ole32/ole32.rbuild @@ -20,6 +20,7 @@ ole32_irot_client ole32_proxy rpcrt4 + kernel32 ntdll uuid pseh diff --git a/reactos/dll/win32/ole32/rpc.c b/reactos/dll/win32/ole32/rpc.c index 0daa4ab815d..75b6b1f7ab3 100644 --- a/reactos/dll/win32/ole32/rpc.c +++ b/reactos/dll/win32/ole32/rpc.c @@ -144,6 +144,28 @@ typedef struct /* [size_is((size+7)&~7)] */ unsigned char data[1]; } WIRE_ORPC_EXTENT; +typedef struct +{ + ULONG size; + ULONG reserved; + unsigned char extent[1]; +} WIRE_ORPC_EXTENT_ARRAY; + +typedef struct +{ + ULONG version; + ULONG flags; + ULONG reserved1; + GUID cid; + unsigned char extensions[1]; +} WIRE_ORPCTHIS; + +typedef struct +{ + ULONG flags; + unsigned char extensions[1]; +} WIRE_ORPCTHAT; + struct channel_hook_entry { struct list entry; @@ -503,10 +525,10 @@ static HRESULT WINAPI ServerRpcChannelBuffer_GetBuffer(LPRPCCHANNELBUFFER iface, extensions_size = ChannelHooks_ServerGetSize(&message_state->channel_hook_info, &channel_hook_data, &channel_hook_count, &extension_count); - msg->BufferLength += FIELD_OFFSET(ORPCTHAT, extensions) + 4; + msg->BufferLength += FIELD_OFFSET(WIRE_ORPCTHAT, extensions) + sizeof(DWORD); if (extensions_size) { - msg->BufferLength += FIELD_OFFSET(ORPC_EXTENT_ARRAY, extent) + 2*sizeof(DWORD) + extensions_size; + msg->BufferLength += FIELD_OFFSET(WIRE_ORPC_EXTENT_ARRAY, extent[2*sizeof(DWORD) + extensions_size]); if (extension_count & 1) msg->BufferLength += FIELD_OFFSET(WIRE_ORPC_EXTENT, data[0]); } @@ -523,7 +545,7 @@ static HRESULT WINAPI ServerRpcChannelBuffer_GetBuffer(LPRPCCHANNELBUFFER iface, status = I_RpcGetBuffer(msg); orpcthat = msg->Buffer; - msg->Buffer = (char *)msg->Buffer + FIELD_OFFSET(ORPCTHAT, extensions); + msg->Buffer = (char *)msg->Buffer + FIELD_OFFSET(WIRE_ORPCTHAT, extensions); orpcthat->flags = ORPCF_NULL /* FIXME? */; @@ -533,10 +555,10 @@ static HRESULT WINAPI ServerRpcChannelBuffer_GetBuffer(LPRPCCHANNELBUFFER iface, if (extensions_size) { - ORPC_EXTENT_ARRAY *orpc_extent_array = msg->Buffer; + WIRE_ORPC_EXTENT_ARRAY *orpc_extent_array = msg->Buffer; orpc_extent_array->size = extension_count; orpc_extent_array->reserved = 0; - msg->Buffer = (char *)msg->Buffer + FIELD_OFFSET(ORPC_EXTENT_ARRAY, extent); + msg->Buffer = (char *)msg->Buffer + FIELD_OFFSET(WIRE_ORPC_EXTENT_ARRAY, extent); /* NDR representation of orpc_extent_array->extent */ *(DWORD *)msg->Buffer = 1; msg->Buffer = (char *)msg->Buffer + sizeof(DWORD); @@ -645,10 +667,10 @@ static HRESULT WINAPI ClientRpcChannelBuffer_GetBuffer(LPRPCCHANNELBUFFER iface, extensions_size = ChannelHooks_ClientGetSize(&message_state->channel_hook_info, &channel_hook_data, &channel_hook_count, &extension_count); - msg->BufferLength += FIELD_OFFSET(ORPCTHIS, extensions) + 4; + msg->BufferLength += FIELD_OFFSET(WIRE_ORPCTHIS, extensions) + sizeof(DWORD); if (extensions_size) { - msg->BufferLength += FIELD_OFFSET(ORPC_EXTENT_ARRAY, extent) + 2*sizeof(DWORD) + extensions_size; + msg->BufferLength += FIELD_OFFSET(WIRE_ORPC_EXTENT_ARRAY, extent[2*sizeof(DWORD) + extensions_size]); if (extension_count & 1) msg->BufferLength += FIELD_OFFSET(WIRE_ORPC_EXTENT, data[0]); } @@ -703,7 +725,7 @@ static HRESULT WINAPI ClientRpcChannelBuffer_GetBuffer(LPRPCCHANNELBUFFER iface, if (status == RPC_S_OK) { orpcthis = msg->Buffer; - msg->Buffer = (char *)msg->Buffer + FIELD_OFFSET(ORPCTHIS, extensions); + msg->Buffer = (char *)msg->Buffer + FIELD_OFFSET(WIRE_ORPCTHIS, extensions); orpcthis->version.MajorVersion = COM_MAJOR_VERSION; orpcthis->version.MinorVersion = COM_MINOR_VERSION; @@ -720,7 +742,7 @@ static HRESULT WINAPI ClientRpcChannelBuffer_GetBuffer(LPRPCCHANNELBUFFER iface, ORPC_EXTENT_ARRAY *orpc_extent_array = msg->Buffer; orpc_extent_array->size = extension_count; orpc_extent_array->reserved = 0; - msg->Buffer = (char *)msg->Buffer + FIELD_OFFSET(ORPC_EXTENT_ARRAY, extent); + msg->Buffer = (char *)msg->Buffer + FIELD_OFFSET(WIRE_ORPC_EXTENT_ARRAY, extent); /* NDR representation of orpc_extent_array->extent */ *(DWORD *)msg->Buffer = 1; msg->Buffer = (char *)msg->Buffer + sizeof(DWORD); @@ -1152,8 +1174,8 @@ static HRESULT unmarshal_ORPC_EXTENT_ARRAY(RPC_MESSAGE *msg, const char *end, DWORD pointer_id; DWORD i; - memcpy(extensions, msg->Buffer, FIELD_OFFSET(ORPC_EXTENT_ARRAY, extent)); - msg->Buffer = (char *)msg->Buffer + FIELD_OFFSET(ORPC_EXTENT_ARRAY, extent); + memcpy(extensions, msg->Buffer, FIELD_OFFSET(WIRE_ORPC_EXTENT_ARRAY, extent)); + msg->Buffer = (char *)msg->Buffer + FIELD_OFFSET(WIRE_ORPC_EXTENT_ARRAY, extent); if ((const char *)msg->Buffer + 2 * sizeof(DWORD) > end) return RPC_E_INVALID_HEADER; @@ -1205,14 +1227,14 @@ static HRESULT unmarshal_ORPCTHIS(RPC_MESSAGE *msg, ORPCTHIS *orpcthis, *first_wire_orpc_extent = NULL; - if (msg->BufferLength < FIELD_OFFSET(ORPCTHIS, extensions) + 4) + if (msg->BufferLength < FIELD_OFFSET(WIRE_ORPCTHIS, extensions) + sizeof(DWORD)) { ERR("invalid buffer length\n"); return RPC_E_INVALID_HEADER; } - memcpy(orpcthis, msg->Buffer, FIELD_OFFSET(ORPCTHIS, extensions)); - msg->Buffer = (char *)msg->Buffer + FIELD_OFFSET(ORPCTHIS, extensions); + memcpy(orpcthis, msg->Buffer, FIELD_OFFSET(WIRE_ORPCTHIS, extensions)); + msg->Buffer = (char *)msg->Buffer + FIELD_OFFSET(WIRE_ORPCTHIS, extensions); if ((const char *)msg->Buffer + sizeof(DWORD) > end) return RPC_E_INVALID_HEADER; @@ -1256,14 +1278,14 @@ static HRESULT unmarshal_ORPCTHAT(RPC_MESSAGE *msg, ORPCTHAT *orpcthat, *first_wire_orpc_extent = NULL; - if (msg->BufferLength < FIELD_OFFSET(ORPCTHAT, extensions) + 4) + if (msg->BufferLength < FIELD_OFFSET(WIRE_ORPCTHAT, extensions) + sizeof(DWORD)) { ERR("invalid buffer length\n"); return RPC_E_INVALID_HEADER; } - memcpy(orpcthat, msg->Buffer, FIELD_OFFSET(ORPCTHAT, extensions)); - msg->Buffer = (char *)msg->Buffer + FIELD_OFFSET(ORPCTHAT, extensions); + memcpy(orpcthat, msg->Buffer, FIELD_OFFSET(WIRE_ORPCTHAT, extensions)); + msg->Buffer = (char *)msg->Buffer + FIELD_OFFSET(WIRE_ORPCTHAT, extensions); if ((const char *)msg->Buffer + sizeof(DWORD) > end) return RPC_E_INVALID_HEADER; diff --git a/reactos/dll/win32/ole32/storage32.c b/reactos/dll/win32/ole32/storage32.c index f1706da72fb..434d8b24606 100644 --- a/reactos/dll/win32/ole32/storage32.c +++ b/reactos/dll/win32/ole32/storage32.c @@ -2583,6 +2583,7 @@ static HRESULT StorageImpl_Construct( DWORD openFlags, BOOL fileBased, BOOL create, + ULONG sector_size, StorageImpl** result) { StorageImpl* This; @@ -2634,7 +2635,7 @@ static HRESULT StorageImpl_Construct( /* * Initialize the big block cache. */ - This->bigBlockSize = DEF_BIG_BLOCK_SIZE; + This->bigBlockSize = sector_size; This->smallBlockSize = DEF_SMALL_BLOCK_SIZE; This->bigBlockFile = BIGBLOCKFILE_Construct(hFile, pLkbyt, @@ -2665,8 +2666,12 @@ static HRESULT StorageImpl_Construct( This->bigBlockDepotCount = 1; This->bigBlockDepotStart[0] = 0; This->rootStartBlock = 1; + This->smallBlockLimit = LIMIT_TO_USE_SMALL_BLOCK; This->smallBlockDepotStart = BLOCK_END_OF_CHAIN; - This->bigBlockSizeBits = DEF_BIG_BLOCK_SIZE_BITS; + if (sector_size == 4096) + This->bigBlockSizeBits = MAX_BIG_BLOCK_SIZE_BITS; + else + This->bigBlockSizeBits = MIN_BIG_BLOCK_SIZE_BITS; This->smallBlockSizeBits = DEF_SMALL_BLOCK_SIZE_BITS; This->extBigBlockDepotStart = BLOCK_END_OF_CHAIN; This->extBigBlockDepotCount = 0; @@ -2711,6 +2716,8 @@ static HRESULT StorageImpl_Construct( */ This->prevFreeBlock = 0; + This->firstFreeSmallBlock = 0; + /* * Create the block chain abstractions. */ @@ -3348,6 +3355,11 @@ static HRESULT StorageImpl_LoadFileHeader( OFFSET_ROOTSTARTBLOCK, &This->rootStartBlock); + StorageUtl_ReadDWord( + headerBigBlock, + OFFSET_SMALLBLOCKLIMIT, + &This->smallBlockLimit); + StorageUtl_ReadDWord( headerBigBlock, OFFSET_SBDEPOTSTART, @@ -3382,9 +3394,11 @@ static HRESULT StorageImpl_LoadFileHeader( * blocks, just make sure they are what we're expecting. */ if ((This->bigBlockSize != MIN_BIG_BLOCK_SIZE && This->bigBlockSize != MAX_BIG_BLOCK_SIZE) || - This->smallBlockSize != DEF_SMALL_BLOCK_SIZE) + This->smallBlockSize != DEF_SMALL_BLOCK_SIZE || + This->smallBlockLimit != LIMIT_TO_USE_SMALL_BLOCK) { - WARN("Broken OLE storage file\n"); + FIXME("Broken OLE storage file? bigblock=0x%x, smallblock=0x%x, sblimit=0x%x\n", + This->bigBlockSize, This->smallBlockSize, This->smallBlockLimit); hr = STG_E_INVALIDHEADER; } else @@ -3438,7 +3452,6 @@ static void StorageImpl_SaveFileHeader( StorageUtl_WriteWord(headerBigBlock, 0x18, 0x3b); StorageUtl_WriteWord(headerBigBlock, 0x1a, 0x3); StorageUtl_WriteWord(headerBigBlock, 0x1c, (WORD)-2); - StorageUtl_WriteDWord(headerBigBlock, 0x38, (DWORD)0x1000); } /* @@ -3464,6 +3477,11 @@ static void StorageImpl_SaveFileHeader( OFFSET_ROOTSTARTBLOCK, This->rootStartBlock); + StorageUtl_WriteDWord( + headerBigBlock, + OFFSET_SMALLBLOCKLIMIT, + This->smallBlockLimit); + StorageUtl_WriteDWord( headerBigBlock, OFFSET_SBDEPOTSTART, @@ -4341,13 +4359,14 @@ static HRESULT Storage_Construct( DWORD openFlags, BOOL fileBased, BOOL create, + ULONG sector_size, StorageBaseImpl** result) { StorageImpl *newStorage; StorageBaseImpl *newTransactedStorage; HRESULT hr; - hr = StorageImpl_Construct(hFile, pwcsName, pLkbyt, openFlags, fileBased, create, &newStorage); + hr = StorageImpl_Construct(hFile, pwcsName, pLkbyt, openFlags, fileBased, create, sector_size, &newStorage); if (FAILED(hr)) goto end; if (openFlags & STGM_TRANSACTED) @@ -4840,6 +4859,7 @@ static StorageInternalImpl* StorageInternalImpl_Construct( * Initialize the virtual function table. */ newStorage->base.lpVtbl = &Storage32InternalImpl_Vtbl; + newStorage->base.pssVtbl = &IPropertySetStorage_Vtbl; newStorage->base.baseVtbl = &StorageInternalImpl_BaseVtbl; newStorage->base.openFlags = (openFlags & ~STGM_CREATE); @@ -5710,7 +5730,7 @@ static ULONG SmallBlockChainStream_GetNextFreeBlock( ULARGE_INTEGER offsetOfBlockInDepot; DWORD buffer; ULONG bytesRead; - ULONG blockIndex = 0; + ULONG blockIndex = This->parentStorage->firstFreeSmallBlock; ULONG nextBlockIndex = BLOCK_END_OF_CHAIN; HRESULT res = S_OK; ULONG smallBlocksPerBigBlock; @@ -5819,6 +5839,8 @@ static ULONG SmallBlockChainStream_GetNextFreeBlock( } } + This->parentStorage->firstFreeSmallBlock = blockIndex+1; + smallBlocksPerBigBlock = This->parentStorage->bigBlockSize / This->parentStorage->smallBlockSize; @@ -6117,6 +6139,7 @@ static BOOL SmallBlockChainStream_Shrink( &blockIndex))) return FALSE; SmallBlockChainStream_FreeBlock(This, extraBlock); + This->parentStorage->firstFreeSmallBlock = min(This->parentStorage->firstFreeSmallBlock, extraBlock); extraBlock = blockIndex; } @@ -6293,30 +6316,13 @@ static ULARGE_INTEGER SmallBlockChainStream_GetSize(SmallBlockChainStream* This) return chainEntry.size; } -/****************************************************************************** - * StgCreateDocfile [OLE32.@] - * Creates a new compound file storage object - * - * PARAMS - * pwcsName [ I] Unicode string with filename (can be relative or NULL) - * grfMode [ I] Access mode for opening the new storage object (see STGM_ constants) - * reserved [ ?] unused?, usually 0 - * ppstgOpen [IO] A pointer to IStorage pointer to the new onject - * - * RETURNS - * S_OK if the file was successfully created - * some STG_E_ value if error - * NOTES - * if pwcsName is NULL, create file with new unique name - * the function can returns - * STG_S_CONVERTED if the specified file was successfully converted to storage format - * (unrealized now) - */ -HRESULT WINAPI StgCreateDocfile( +static HRESULT create_storagefile( LPCOLESTR pwcsName, DWORD grfMode, - DWORD reserved, - IStorage **ppstgOpen) + DWORD grfAttrs, + STGOPTIONS* pStgOptions, + REFIID riid, + void** ppstgOpen) { StorageBaseImpl* newStorage = 0; HANDLE hFile = INVALID_HANDLE_VALUE; @@ -6327,13 +6333,10 @@ HRESULT WINAPI StgCreateDocfile( DWORD fileAttributes; WCHAR tempFileName[MAX_PATH]; - TRACE("(%s, %x, %d, %p)\n", - debugstr_w(pwcsName), grfMode, - reserved, ppstgOpen); - if (ppstgOpen == 0) return STG_E_INVALIDPOINTER; - if (reserved != 0) + + if (pStgOptions->ulSectorSize != MIN_BIG_BLOCK_SIZE && pStgOptions->ulSectorSize != MAX_BIG_BLOCK_SIZE) return STG_E_INVALIDPARAMETER; /* if no share mode given then DENY_NONE is the default */ @@ -6435,6 +6438,7 @@ HRESULT WINAPI StgCreateDocfile( grfMode, TRUE, TRUE, + pStgOptions->ulSectorSize, &newStorage); if (FAILED(hr)) @@ -6442,10 +6446,9 @@ HRESULT WINAPI StgCreateDocfile( goto end; } - /* - * Get an "out" pointer for the caller. - */ - *ppstgOpen = (IStorage*)newStorage; + hr = IStorage_QueryInterface((IStorage*)newStorage, riid, ppstgOpen); + + IStorage_Release((IStorage*)newStorage); end: TRACE("<-- %p r = %08x\n", *ppstgOpen, hr); @@ -6453,6 +6456,45 @@ end: return hr; } +/****************************************************************************** + * StgCreateDocfile [OLE32.@] + * Creates a new compound file storage object + * + * PARAMS + * pwcsName [ I] Unicode string with filename (can be relative or NULL) + * grfMode [ I] Access mode for opening the new storage object (see STGM_ constants) + * reserved [ ?] unused?, usually 0 + * ppstgOpen [IO] A pointer to IStorage pointer to the new onject + * + * RETURNS + * S_OK if the file was successfully created + * some STG_E_ value if error + * NOTES + * if pwcsName is NULL, create file with new unique name + * the function can returns + * STG_S_CONVERTED if the specified file was successfully converted to storage format + * (unrealized now) + */ +HRESULT WINAPI StgCreateDocfile( + LPCOLESTR pwcsName, + DWORD grfMode, + DWORD reserved, + IStorage **ppstgOpen) +{ + STGOPTIONS stgoptions = {1, 0, 512}; + + TRACE("(%s, %x, %d, %p)\n", + debugstr_w(pwcsName), grfMode, + reserved, ppstgOpen); + + if (ppstgOpen == 0) + return STG_E_INVALIDPOINTER; + if (reserved != 0) + return STG_E_INVALIDPARAMETER; + + return create_storagefile(pwcsName, grfMode, 0, &stgoptions, &IID_IStorage, (void**)ppstgOpen); +} + /****************************************************************************** * StgCreateStorageEx [OLE32.@] */ @@ -6481,10 +6523,10 @@ HRESULT WINAPI StgCreateStorageEx(const WCHAR* pwcsName, DWORD grfMode, DWORD st if (stgfmt == STGFMT_STORAGE || stgfmt == STGFMT_DOCFILE) { - FIXME("Stub: calling StgCreateDocfile, but ignoring pStgOptions and grfAttrs\n"); - return StgCreateDocfile(pwcsName, grfMode, 0, (IStorage **)ppObjectOpen); + return create_storagefile(pwcsName, grfMode, grfAttrs, pStgOptions, riid, ppObjectOpen); } + ERR("Invalid stgfmt argument\n"); return STG_E_INVALIDPARAMETER; } @@ -6707,6 +6749,7 @@ HRESULT WINAPI StgOpenStorage( grfMode, TRUE, FALSE, + 512, &newStorage); if (FAILED(hr)) @@ -6754,6 +6797,7 @@ HRESULT WINAPI StgCreateDocfileOnILockBytes( grfMode, FALSE, TRUE, + 512, &newStorage); if (FAILED(hr)) @@ -6801,6 +6845,7 @@ HRESULT WINAPI StgOpenStorageOnILockBytes( grfMode, FALSE, FALSE, + 512, &newStorage); if (FAILED(hr)) diff --git a/reactos/dll/win32/ole32/storage32.h b/reactos/dll/win32/ole32/storage32.h index fad5d7766f7..36a7d679af6 100644 --- a/reactos/dll/win32/ole32/storage32.h +++ b/reactos/dll/win32/ole32/storage32.h @@ -46,6 +46,7 @@ static const ULONG OFFSET_BIGBLOCKSIZEBITS = 0x0000001e; static const ULONG OFFSET_SMALLBLOCKSIZEBITS = 0x00000020; static const ULONG OFFSET_BBDEPOTCOUNT = 0x0000002C; static const ULONG OFFSET_ROOTSTARTBLOCK = 0x00000030; +static const ULONG OFFSET_SMALLBLOCKLIMIT = 0x00000038; static const ULONG OFFSET_SBDEPOTSTART = 0x0000003C; static const ULONG OFFSET_SBDEPOTCOUNT = 0x00000040; static const ULONG OFFSET_EXTBBDEPOTSTART = 0x00000044; @@ -65,6 +66,8 @@ static const ULONG OFFSET_PS_MTIMEHIGH = 0x00000070; static const ULONG OFFSET_PS_STARTBLOCK = 0x00000074; static const ULONG OFFSET_PS_SIZE = 0x00000078; static const WORD DEF_BIG_BLOCK_SIZE_BITS = 0x0009; +static const WORD MIN_BIG_BLOCK_SIZE_BITS = 0x0009; +static const WORD MAX_BIG_BLOCK_SIZE_BITS = 0x000c; static const WORD DEF_SMALL_BLOCK_SIZE_BITS = 0x0006; static const WORD DEF_BIG_BLOCK_SIZE = 0x0200; static const WORD DEF_SMALL_BLOCK_SIZE = 0x0040; @@ -97,6 +100,8 @@ static const ULONG DIRENTRY_NULL = 0xFFFFFFFF; #define STGTY_ROOT 0x05 #define COUNT_BBDEPOTINHEADER 109 + +/* FIXME: This value is stored in the header, but we hard-code it to 0x1000. */ #define LIMIT_TO_USE_SMALL_BLOCK 0x1000 #define STGM_ACCESS_MODE(stgm) ((stgm)&0x0000f) @@ -351,6 +356,7 @@ struct StorageImpl ULONG smallBlockSize; ULONG bigBlockDepotCount; ULONG rootStartBlock; + ULONG smallBlockLimit; ULONG smallBlockDepotStart; ULONG extBigBlockDepotStart; ULONG extBigBlockDepotCount; @@ -360,6 +366,9 @@ struct StorageImpl ULONG indexBlockDepotCached; ULONG prevFreeBlock; + /* All small blocks before this one are known to be in use. */ + ULONG firstFreeSmallBlock; + /* * Abstraction of the big block chains for the chains of the header. */ diff --git a/reactos/dll/win32/oleaut32/olepicture.c b/reactos/dll/win32/oleaut32/olepicture.c index 7a5bc29a4e5..c7a3411cf04 100644 --- a/reactos/dll/win32/oleaut32/olepicture.c +++ b/reactos/dll/win32/oleaut32/olepicture.c @@ -1273,7 +1273,7 @@ static HRESULT OLEPictureImpl_LoadEnhMetafile(OLEPictureImpl *This, static HRESULT OLEPictureImpl_LoadAPM(OLEPictureImpl *This, const BYTE *data, ULONG size) { - APM_HEADER *header = (APM_HEADER *)data; + const APM_HEADER *header = (const APM_HEADER *)data; HMETAFILE hmf; if (size < sizeof(APM_HEADER)) diff --git a/reactos/dll/win32/oleaut32/regsvr.c b/reactos/dll/win32/oleaut32/regsvr.c index 12f64faa516..f97544f51ed 100644 --- a/reactos/dll/win32/oleaut32/regsvr.c +++ b/reactos/dll/win32/oleaut32/regsvr.c @@ -480,6 +480,12 @@ static struct regsvr_coclass const coclass_list[] = { "Obsolete Font", "OldFont" }, + { &IID_ISupportErrorInfo, + "PSSupportErrorInfo", + "ole2disp.dll", + "oleaut32.dll", + NULL + }, { NULL } /* list terminator */ }; diff --git a/reactos/dll/win32/oleaut32/typelib.c b/reactos/dll/win32/oleaut32/typelib.c index b09f7ab64d1..5792cc51870 100644 --- a/reactos/dll/win32/oleaut32/typelib.c +++ b/reactos/dll/win32/oleaut32/typelib.c @@ -283,30 +283,9 @@ static WCHAR *get_lcid_subkey( LCID lcid, SYSKIND syskind, WCHAR *buffer ) static HRESULT TLB_ReadTypeLib(LPCWSTR pszFileName, LPWSTR pszPath, UINT cchPath, ITypeLib2 **ppTypeLib); -/**************************************************************************** - * QueryPathOfRegTypeLib [OLEAUT32.164] - * - * Gets the path to a registered type library. - * - * PARAMS - * guid [I] referenced guid - * wMaj [I] major version - * wMin [I] minor version - * lcid [I] locale id - * path [O] path of typelib - * - * RETURNS - * Success: S_OK. - * Failure: If the type library is not registered then TYPE_E_LIBNOTREGISTERED - * or TYPE_E_REGISTRYACCESS if the type library registration key couldn't be - * opened. - */ -HRESULT WINAPI QueryPathOfRegTypeLib( - REFGUID guid, - WORD wMaj, - WORD wMin, - LCID lcid, - LPBSTR path ) +/* Get the path to a registered type library. Helper for QueryPathOfRegTypeLib. */ +static HRESULT query_typelib_path( REFGUID guid, WORD wMaj, WORD wMin, + SYSKIND syskind, LCID lcid, LPBSTR path ) { HRESULT hr = TYPE_E_LIBNOTREGISTERED; LCID myLCID = lcid; @@ -336,7 +315,7 @@ HRESULT WINAPI QueryPathOfRegTypeLib( { LONG dwPathLen = sizeof(Path); - get_lcid_subkey( myLCID, SYS_WIN32, buffer ); + get_lcid_subkey( myLCID, syskind, buffer ); if (RegQueryValueW(hkey, buffer, Path, &dwPathLen)) { @@ -368,6 +347,29 @@ HRESULT WINAPI QueryPathOfRegTypeLib( return hr; } +/**************************************************************************** + * QueryPathOfRegTypeLib [OLEAUT32.164] + * + * Gets the path to a registered type library. + * + * PARAMS + * guid [I] referenced guid + * wMaj [I] major version + * wMin [I] minor version + * lcid [I] locale id + * path [O] path of typelib + * + * RETURNS + * Success: S_OK. + * Failure: If the type library is not registered then TYPE_E_LIBNOTREGISTERED + * or TYPE_E_REGISTRYACCESS if the type library registration key couldn't be + * opened. + */ +HRESULT WINAPI QueryPathOfRegTypeLib( REFGUID guid, WORD wMaj, WORD wMin, LCID lcid, LPBSTR path ) +{ + return query_typelib_path( guid, wMaj, wMin, SYS_WIN32, lcid, path ); +} + /****************************************************************************** * CreateTypeLib [OLEAUT32.160] creates a typelib * @@ -691,7 +693,10 @@ HRESULT WINAPI RegisterTypeLib( MESSAGE("\n"); } - if (tattr->wTypeFlags & (TYPEFLAG_FOLEAUTOMATION|TYPEFLAG_FDUAL|TYPEFLAG_FDISPATCHABLE)) + /* Register all dispinterfaces (which includes dual interfaces) and + oleautomation interfaces */ + if ((kind == TKIND_INTERFACE && (tattr->wTypeFlags & TYPEFLAG_FOLEAUTOMATION)) || + kind == TKIND_DISPATCH) { /* register interface<->typelib coupling */ get_interface_key( &tattr->guid, keyName ); @@ -796,7 +801,7 @@ HRESULT WINAPI UnRegisterTypeLib( } /* get the path to the typelib on disk */ - if (QueryPathOfRegTypeLib(libid, wVerMajor, wVerMinor, lcid, &tlibPath) != S_OK) { + if (query_typelib_path(libid, wVerMajor, wVerMinor, syskind, lcid, &tlibPath) != S_OK) { result = E_INVALIDARG; goto end; } @@ -832,19 +837,23 @@ HRESULT WINAPI UnRegisterTypeLib( goto enddeleteloop; } - /* the path to the type */ - get_interface_key( &typeAttr->guid, subKeyName ); + if ((kind == TKIND_INTERFACE && (typeAttr->wTypeFlags & TYPEFLAG_FOLEAUTOMATION)) || + kind == TKIND_DISPATCH) + { + /* the path to the type */ + get_interface_key( &typeAttr->guid, subKeyName ); - /* Delete its bits */ - if (RegOpenKeyExW(HKEY_CLASSES_ROOT, subKeyName, 0, KEY_WRITE, &subKey) != ERROR_SUCCESS) { - goto enddeleteloop; + /* Delete its bits */ + if (RegOpenKeyExW(HKEY_CLASSES_ROOT, subKeyName, 0, KEY_WRITE, &subKey) != ERROR_SUCCESS) + goto enddeleteloop; + + RegDeleteKeyW(subKey, ProxyStubClsidW); + RegDeleteKeyW(subKey, ProxyStubClsid32W); + RegDeleteKeyW(subKey, TypeLibW); + RegCloseKey(subKey); + subKey = NULL; + RegDeleteKeyW(HKEY_CLASSES_ROOT, subKeyName); } - RegDeleteKeyW(subKey, ProxyStubClsidW); - RegDeleteKeyW(subKey, ProxyStubClsid32W); - RegDeleteKeyW(subKey, TypeLibW); - RegCloseKey(subKey); - subKey = NULL; - RegDeleteKeyW(HKEY_CLASSES_ROOT, subKeyName); enddeleteloop: if (typeAttr) ITypeInfo_ReleaseTypeAttr(typeInfo, typeAttr); @@ -1901,7 +1910,7 @@ MSFT_DoFuncs(TLBContext* pcx, { if (!IS_INTRESOURCE(pFuncRec->OptAttr[2])) ERR("ordinal 0x%08x invalid, IS_INTRESOURCE is false\n", pFuncRec->OptAttr[2]); - (*pptfd)->Entry = (BSTR)pFuncRec->OptAttr[2]; + (*pptfd)->Entry = (BSTR)(DWORD_PTR)LOWORD(pFuncRec->OptAttr[2]); } else { @@ -2927,7 +2936,7 @@ static ITypeLib2* ITypeLib2_Constructor_MSFT(LPVOID pLib, DWORD dwTLBLength) else if(td[0] == VT_CARRAY) { /* array descr table here */ - pTypeLibImpl->pTypeDesc[i].u.lpadesc = (void *)((int) td[2]); /* temp store offset in*/ + pTypeLibImpl->pTypeDesc[i].u.lpadesc = (void *)(INT_PTR)td[2]; /* temp store offset in*/ } else if(td[0] == VT_USERDEFINED) { @@ -2942,7 +2951,7 @@ static ITypeLib2* ITypeLib2_Constructor_MSFT(LPVOID pLib, DWORD dwTLBLength) if(pTypeLibImpl->pTypeDesc[i].vt != VT_CARRAY) continue; if(tlbSegDir.pArrayDescriptions.offset>0) { - MSFT_ReadLEWords(td, sizeof(td), &cx, tlbSegDir.pArrayDescriptions.offset + (int) pTypeLibImpl->pTypeDesc[i].u.lpadesc); + MSFT_ReadLEWords(td, sizeof(td), &cx, tlbSegDir.pArrayDescriptions.offset + (INT_PTR)pTypeLibImpl->pTypeDesc[i].u.lpadesc); pTypeLibImpl->pTypeDesc[i].u.lpadesc = TLB_Alloc(sizeof(ARRAYDESC)+sizeof(SAFEARRAYBOUND)*(td[3]-1)); if(td[1]<0) @@ -4779,13 +4788,7 @@ static HRESULT WINAPI ITypeLibComp_fnBind( &subtypeinfo, &subdesckind, &subbindptr); if (SUCCEEDED(hr) && (subdesckind != DESCKIND_NONE)) { - TYPEDESC tdesc_appobject = - { - { - (TYPEDESC *)pTypeInfo->hreftype - }, - VT_USERDEFINED - }; + TYPEDESC tdesc_appobject; const VARDESC vardesc_appobject = { -2, /* memid */ @@ -4807,6 +4810,9 @@ static HRESULT WINAPI ITypeLibComp_fnBind( VAR_STATIC /* varkind */ }; + tdesc_appobject.u.hreftype = pTypeInfo->hreftype; + tdesc_appobject.vt = VT_USERDEFINED; + TRACE("found in implicit app object: %s\n", debugstr_w(szName)); /* cleanup things filled in by Bind call so we can put our @@ -5696,7 +5702,8 @@ _invoke(FARPROC func,CALLCONV callconv, int nrargs, DWORD *args) { if (TRACE_ON(ole)) { int i; TRACE("Calling %p(",func); - for (i=0;i 30) TRACE("..."); TRACE(")\n"); } @@ -6102,10 +6109,11 @@ static HRESULT WINAPI ITypeInfo_fnInvoke( continue; } + src_arg = NULL; + if (cNamedArgs) { USHORT j; - src_arg = NULL; for (j = 0; j < cNamedArgs; j++) if (rgdispidNamedArgs[j] == i || (i == func_desc->cParams-1 && rgdispidNamedArgs[j] == DISPID_PROPERTYPUT)) { @@ -6113,9 +6121,10 @@ static HRESULT WINAPI ITypeInfo_fnInvoke( break; } } - else + + if (!src_arg && vargs_converted + cNamedArgs < pDispParams->cArgs) { - src_arg = vargs_converted < pDispParams->cArgs ? &pDispParams->rgvarg[pDispParams->cArgs - 1 - vargs_converted] : NULL; + src_arg = &pDispParams->rgvarg[pDispParams->cArgs - 1 - vargs_converted]; vargs_converted++; } @@ -6596,7 +6605,7 @@ static HRESULT WINAPI ITypeInfo_fnGetDllEntry( ITypeInfo2 *iface, MEMBERID memid if (pBstrName) *pBstrName = NULL; if (pwOrdinal) - *pwOrdinal = (DWORD)pFDesc->Entry; + *pwOrdinal = LOWORD(pFDesc->Entry); return S_OK; } return TYPE_E_ELEMENTNOTFOUND; diff --git a/reactos/dll/win32/oleaut32/typelib2.c b/reactos/dll/win32/oleaut32/typelib2.c index 6b1aea062ba..a93e5a4962a 100644 --- a/reactos/dll/win32/oleaut32/typelib2.c +++ b/reactos/dll/win32/oleaut32/typelib2.c @@ -2456,7 +2456,7 @@ static HRESULT WINAPI ICreateTypeInfo2_fnLayOut( return hres; } - This->typeinfo->cbSizeVft = typeattr->cbSizeVft; + This->typeinfo->cbSizeVft = typeattr->cbSizeVft * 4 / sizeof(void *); ITypeInfo_ReleaseTypeAttr(inherited, typeattr); ITypeInfo_Release(inherited); @@ -2928,7 +2928,7 @@ static HRESULT WINAPI ITypeInfo2_fnGetTypeAttr( (*ppTypeAttr)->cFuncs += 7; (*ppTypeAttr)->cVars = This->typeinfo->cElement>>16; (*ppTypeAttr)->cImplTypes = This->typeinfo->cImplTypes; - (*ppTypeAttr)->cbSizeVft = This->typekind==TKIND_DISPATCH ? 28 : This->typeinfo->cbSizeVft; + (*ppTypeAttr)->cbSizeVft = This->typekind==TKIND_DISPATCH ? 7 * sizeof(void*) : This->typeinfo->cbSizeVft; (*ppTypeAttr)->cbAlignment = (This->typeinfo->typekind>>11) & 0x1f; (*ppTypeAttr)->wTypeFlags = This->typeinfo->flags; (*ppTypeAttr)->wMajorVerNum = This->typeinfo->version&0xffff; diff --git a/reactos/dll/win32/oleaut32/vartype.c b/reactos/dll/win32/oleaut32/vartype.c index da1288d4a7c..cfd5e8f8353 100644 --- a/reactos/dll/win32/oleaut32/vartype.c +++ b/reactos/dll/win32/oleaut32/vartype.c @@ -3503,7 +3503,7 @@ HRESULT WINAPI VarCyFromR4(FLOAT fltIn, CY* pCyOut) */ HRESULT WINAPI VarCyFromR8(double dblIn, CY* pCyOut) { -#if defined(__GNUC__) && defined(__i386__) +#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) /* This code gives identical results to Win32 on Intel. * Here we use fp exceptions to catch overflows when storing the value. */ diff --git a/reactos/include/psdk/winbase.h b/reactos/include/psdk/winbase.h index 6b38dacb365..79c52ac5579 100644 --- a/reactos/include/psdk/winbase.h +++ b/reactos/include/psdk/winbase.h @@ -2301,6 +2301,9 @@ VOID WINAPI WakeConditionVariable(PCONDITION_VARIABLE); VOID WINAPI WakeAllConditionVariable(PCONDITION_VARIABLE); #endif BOOL WINAPI WinLoadTrustProvider(GUID*); +BOOL WINAPI Wow64DisableWow64FsRedirection(PVOID*); +BOOLEAN WINAPI Wow64EnableWow64FsRedirection(BOOLEAN); +BOOL WINAPI Wow64RevertWow64FsRedirection(PVOID); BOOL WINAPI WriteFile(HANDLE,LPCVOID,DWORD,LPDWORD,LPOVERLAPPED); BOOL WINAPI WriteFileEx(HANDLE,LPCVOID,DWORD,LPOVERLAPPED,LPOVERLAPPED_COMPLETION_ROUTINE); BOOL WINAPI WriteFileGather(HANDLE,FILE_SEGMENT_ELEMENT*,DWORD,LPDWORD,LPOVERLAPPED); From b88a39e105b5545d31ed3293d35882956ac0a88e Mon Sep 17 00:00:00 2001 From: James Tabor Date: Tue, 20 Apr 2010 18:36:39 +0000 Subject: [PATCH 017/131] [User32] - Dmitry Timoshkov : Do not ask DrawFrameControl() to modify the passed in rectangle. - Nikolay Sivov : Set WM_EXITMENULOOP wParam same way as for WM_ENTERMENULOOP. svn path=/trunk/; revision=46961 --- reactos/dll/win32/user32/controls/button.c | 13 ++++--------- reactos/dll/win32/user32/windows/menu.c | 10 +++++----- 2 files changed, 9 insertions(+), 14 deletions(-) diff --git a/reactos/dll/win32/user32/controls/button.c b/reactos/dll/win32/user32/controls/button.c index 1f448bd1885..8b4003bbe58 100644 --- a/reactos/dll/win32/user32/controls/button.c +++ b/reactos/dll/win32/user32/controls/button.c @@ -829,7 +829,7 @@ static void BUTTON_DrawLabel(HWND hwnd, HDC hdc, UINT dtFlags, const RECT *rc) */ static void PB_Paint( HWND hwnd, HDC hDC, UINT action ) { - RECT rc, focus_rect, r; + RECT rc, r; UINT dtFlags, uState; HPEN hOldPen; HBRUSH hOldBrush; @@ -865,13 +865,11 @@ static void PB_Paint( HWND hwnd, HDC hDC, UINT action ) Rectangle(hDC, rc.left, rc.top, rc.right, rc.bottom); InflateRect( &rc, -1, -1 ); } - - focus_rect = rc; /* completely skip the drawing if only focus has changed */ if (action == ODA_FOCUS) goto draw_focus; - uState = DFCS_BUTTONPUSH | DFCS_ADJUSTRECT; + uState = DFCS_BUTTONPUSH; if (style & BS_FLAT) uState |= DFCS_MONO; @@ -898,8 +896,6 @@ static void PB_Paint( HWND hwnd, HDC hDC, UINT action ) if (pushedState) OffsetRect(&r, 1, 1); - IntersectClipRect(hDC, rc.left, rc.top, rc.right, rc.bottom); - oldTxtColor = SetTextColor( hDC, GetSysColor(COLOR_BTNTEXT) ); BUTTON_DrawLabel(hwnd, hDC, dtFlags, &r); @@ -912,9 +908,8 @@ draw_focus: { if (!(get_ui_state(hwnd) & UISF_HIDEFOCUS)) { - InflateRect( &focus_rect, -1, -1 ); - IntersectRect(&focus_rect, &focus_rect, &rc); - DrawFocusRect( hDC, &focus_rect ); + InflateRect( &rc, -2, -2 ); + DrawFocusRect( hDC, &rc ); } } diff --git a/reactos/dll/win32/user32/windows/menu.c b/reactos/dll/win32/user32/windows/menu.c index ade437c840a..1178558dda0 100644 --- a/reactos/dll/win32/user32/windows/menu.c +++ b/reactos/dll/win32/user32/windows/menu.c @@ -3524,11 +3524,11 @@ static BOOL FASTCALL MenuInitTracking(HWND hWnd, HMENU hMenu, BOOL bPopup, UINT /*********************************************************************** * MenuExitTracking */ -static BOOL FASTCALL MenuExitTracking(HWND hWnd) +static BOOL FASTCALL MenuExitTracking(HWND hWnd, BOOL bPopup) { TRACE("hwnd=%p\n", hWnd); - SendMessageW( hWnd, WM_EXITMENULOOP, 0, 0 ); + SendMessageW( hWnd, WM_EXITMENULOOP, bPopup, 0 ); ShowCaret(0); top_popup = 0; top_popup_hmenu = NULL; @@ -3558,7 +3558,7 @@ VOID MenuTrackMouseMenuBar( HWND hWnd, ULONG ht, POINT pt) MenuInitTracking(hWnd, hMenu, FALSE, wFlags); MenuTrackMenu(hMenu, wFlags, pt.x, pt.y, hWnd, NULL); - MenuExitTracking(hWnd); + MenuExitTracking(hWnd, FALSE); } } @@ -3633,7 +3633,7 @@ VOID MenuTrackKbdMenuBar(HWND hwnd, UINT wParam, WCHAR wChar) track_menu: MenuTrackMenu( hTrackMenu, wFlags, 0, 0, hwnd, NULL ); - MenuExitTracking( hwnd ); + MenuExitTracking( hwnd, FALSE ); } @@ -3660,7 +3660,7 @@ BOOL WINAPI TrackPopupMenuEx( HMENU Menu, UINT Flags, int x, int y, if (MenuShowPopup(Wnd, Menu, 0, Flags, x, y, 0, 0 )) ret = MenuTrackMenu(Menu, Flags | TPM_POPUPMENU, 0, 0, Wnd, Tpm ? &Tpm->rcExclude : NULL); - MenuExitTracking(Wnd); + MenuExitTracking(Wnd, TRUE); return ret; } From 1aa7aa1be5c1f1c6cfac43fb22e4ca61644fcabf Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Tue, 20 Apr 2010 18:55:05 +0000 Subject: [PATCH 018/131] - If MSDN says "BOOLEAN", let it be "BOOLEAN". Fixes build. svn path=/trunk/; revision=46962 --- reactos/dll/win32/kernel32/misc/stubs.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/dll/win32/kernel32/misc/stubs.c b/reactos/dll/win32/kernel32/misc/stubs.c index d22e9baed17..c852f34d1f9 100644 --- a/reactos/dll/win32/kernel32/misc/stubs.c +++ b/reactos/dll/win32/kernel32/misc/stubs.c @@ -885,9 +885,9 @@ NlsGetCacheUpdateCount(VOID) return 0; } -BOOL +BOOLEAN WINAPI -Wow64EnableWow64FsRedirection (BOOL Wow64EnableWow64FsRedirection) +Wow64EnableWow64FsRedirection (BOOLEAN Wow64EnableWow64FsRedirection) { STUB; return FALSE; From b423af097fb007a70366534dcfacf5bf00b14a42 Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Tue, 20 Apr 2010 18:59:58 +0000 Subject: [PATCH 019/131] [NTVDM] Load resource strings in Unicode when printing them in Unicode svn path=/trunk/; revision=46963 --- reactos/subsystems/ntvdm/ntvdm.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/subsystems/ntvdm/ntvdm.c b/reactos/subsystems/ntvdm/ntvdm.c index afa44ef23de..5a9a29a8e58 100644 --- a/reactos/subsystems/ntvdm/ntvdm.c +++ b/reactos/subsystems/ntvdm/ntvdm.c @@ -282,8 +282,8 @@ WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nSho WCHAR PromptMsg[RC_STRING_MAX_SIZE]; CHAR InputBuffer[255]; - LoadString( GetModuleHandle(NULL), STRING_WelcomeMsg, (LPTSTR) WelcomeMsg,sizeof(WelcomeMsg) / sizeof(WelcomeMsg[0])); - LoadString( GetModuleHandle(NULL), STRING_PromptMsg, (LPTSTR) PromptMsg ,sizeof(PromptMsg) / sizeof(PromptMsg[0])); + LoadStringW( GetModuleHandle(NULL), STRING_WelcomeMsg, WelcomeMsg,sizeof(WelcomeMsg) / sizeof(WelcomeMsg[0])); + LoadStringW( GetModuleHandle(NULL), STRING_PromptMsg, PromptMsg ,sizeof(PromptMsg) / sizeof(PromptMsg[0])); AllocConsole(); SetConsoleTitleW(L"ntvdm"); From 34b02b74caa575bfbba74cb508e67f8c3bf9f11f Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Tue, 20 Apr 2010 21:18:54 +0000 Subject: [PATCH 020/131] - Sync rsaenh, schannel, shlwapi, sti, urlmon, usp10, version, windowscodecs, wininet, wintrust to Wine-1.1.43. - Update README.WINE. svn path=/trunk/; revision=46967 --- reactos/dll/win32/lpk/dllmain.c | 2 +- reactos/dll/win32/rsaenh/rsaenh.c | 39 +- reactos/dll/win32/rsaenh/sha2.c | 44 +- reactos/dll/win32/schannel/lsamode.c | 14 +- reactos/dll/win32/shlwapi/ordinal.c | 376 +++++--- reactos/dll/win32/shlwapi/shlwapi.spec | 2 +- reactos/dll/win32/shlwapi/url.c | 13 +- reactos/dll/win32/sti/regsvr.c | 15 +- reactos/dll/win32/sti/sti.c | 352 +++++++ reactos/dll/win32/sti/sti.rbuild | 20 +- reactos/dll/win32/sti/sti.spec | 6 +- reactos/dll/win32/sti/sti_main.c | 140 ++- reactos/dll/win32/sti/sti_private.h | 32 + reactos/dll/win32/sti/sti_wia.idl | 19 + reactos/dll/win32/urlmon/bindprot.c | 4 +- reactos/dll/win32/urlmon/regsvr.c | 2 +- reactos/dll/win32/urlmon/urlmon_main.c | 4 +- reactos/dll/win32/urlmon/urlmon_main.h | 3 +- reactos/dll/win32/urlmon/urlmon_urlmon.idl | 2 +- reactos/dll/win32/urlmon/usrmarshal.c | 2 +- reactos/dll/win32/usp10/bidi.c | 893 ++++++++++++++++++ reactos/dll/win32/usp10/usp10.c | 136 ++- reactos/dll/win32/usp10/usp10.rbuild | 1 + reactos/dll/win32/usp10/usp10.spec | 2 +- reactos/dll/win32/usp10/usp10_internal.h | 28 + reactos/dll/win32/version/resource.c | 33 +- reactos/dll/win32/windowscodecs/bmpdecode.c | 137 ++- reactos/dll/win32/windowscodecs/clsfactory.c | 1 + reactos/dll/win32/windowscodecs/converter.c | 39 +- reactos/dll/win32/windowscodecs/gifformat.c | 22 +- reactos/dll/win32/windowscodecs/icoformat.c | 60 +- reactos/dll/win32/windowscodecs/jpegformat.c | 28 +- reactos/dll/win32/windowscodecs/palette.c | 21 + reactos/dll/win32/windowscodecs/pngformat.c | 186 +++- reactos/dll/win32/windowscodecs/regsvr.c | 53 +- reactos/dll/win32/windowscodecs/stream.c | 54 +- reactos/dll/win32/windowscodecs/tiffformat.c | 866 +++++++++++++++++ .../win32/windowscodecs/wincodecs_private.h | 1 + .../win32/windowscodecs/windowscodecs.rbuild | 1 + reactos/dll/win32/wininet/internet.c | 18 +- reactos/dll/win32/wininet/urlcache.c | 44 +- reactos/dll/win32/wintrust/asn.c | 2 +- reactos/include/psdk/ntsecpkg.h | 36 + reactos/include/psdk/psdk.rbuild | 3 + reactos/include/psdk/shdeprecated.idl | 31 + reactos/include/psdk/shlwapi.h | 27 +- reactos/include/psdk/sti.h | 141 +++ reactos/include/psdk/wia.h | 28 + reactos/include/psdk/wia_lh.idl | 127 +++ reactos/include/psdk/wia_xp.idl | 127 +++ reactos/media/doc/README.WINE | 12 +- 51 files changed, 3806 insertions(+), 443 deletions(-) create mode 100644 reactos/dll/win32/sti/sti.c create mode 100644 reactos/dll/win32/sti/sti_private.h create mode 100644 reactos/dll/win32/sti/sti_wia.idl create mode 100644 reactos/dll/win32/usp10/bidi.c create mode 100644 reactos/dll/win32/usp10/usp10_internal.h create mode 100644 reactos/dll/win32/windowscodecs/tiffformat.c create mode 100644 reactos/include/psdk/shdeprecated.idl create mode 100644 reactos/include/psdk/wia.h create mode 100644 reactos/include/psdk/wia_lh.idl create mode 100644 reactos/include/psdk/wia_xp.idl diff --git a/reactos/dll/win32/lpk/dllmain.c b/reactos/dll/win32/lpk/dllmain.c index 9b7c8e11d0d..1d5bdc0e781 100644 --- a/reactos/dll/win32/lpk/dllmain.c +++ b/reactos/dll/win32/lpk/dllmain.c @@ -36,7 +36,7 @@ LpkDllInitialize ( case DLL_PROCESS_ATTACH: DisableThreadLibraryCalls(hDll); /* Tell usp10 it is activated usp10 */ - LpkPresent(); + //LpkPresent(); break; default: diff --git a/reactos/dll/win32/rsaenh/rsaenh.c b/reactos/dll/win32/rsaenh/rsaenh.c index 74ad392f2f2..8a5be9935c3 100644 --- a/reactos/dll/win32/rsaenh/rsaenh.c +++ b/reactos/dll/win32/rsaenh/rsaenh.c @@ -3354,6 +3354,33 @@ BOOL WINAPI RSAENH_CPSetKeyParam(HCRYPTPROV hProv, HCRYPTKEY hKey, DWORD dwParam setup_key(pCryptKey); return TRUE; + case KP_SALT: + switch (pCryptKey->aiAlgid) { + case CALG_RC2: + case CALG_RC4: + if (!pbData) + { + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } + /* MSDN: the base provider always sets eleven bytes of + * salt value. + */ + memcpy(pCryptKey->abKeyValue + pCryptKey->dwKeyLen, + pbData, 11); + pCryptKey->dwSaltLen = 11; + setup_key(pCryptKey); + /* Strange but true: salt length reset to 0 after setting + * it via KP_SALT. + */ + pCryptKey->dwSaltLen = 0; + break; + default: + SetLastError(NTE_BAD_KEY); + return FALSE; + } + return TRUE; + case KP_SALT_EX: { CRYPT_INTEGER_BLOB *blob = (CRYPT_INTEGER_BLOB *)pbData; @@ -3486,8 +3513,16 @@ BOOL WINAPI RSAENH_CPGetKeyParam(HCRYPTPROV hProv, HCRYPTKEY hKey, DWORD dwParam pCryptKey->dwBlockLen); case KP_SALT: - return copy_param(pbData, pdwDataLen, - &pCryptKey->abKeyValue[pCryptKey->dwKeyLen], pCryptKey->dwSaltLen); + switch (pCryptKey->aiAlgid) { + case CALG_RC2: + case CALG_RC4: + return copy_param(pbData, pdwDataLen, + &pCryptKey->abKeyValue[pCryptKey->dwKeyLen], + pCryptKey->dwSaltLen); + default: + SetLastError(NTE_BAD_KEY); + return FALSE; + } case KP_PADDING: dwValue = PKCS5_PADDING; diff --git a/reactos/dll/win32/rsaenh/sha2.c b/reactos/dll/win32/rsaenh/sha2.c index 559323c54e5..ea5bb28b48f 100644 --- a/reactos/dll/win32/rsaenh/sha2.c +++ b/reactos/dll/win32/rsaenh/sha2.c @@ -273,7 +273,7 @@ static const char sha2_hex_digits[] = "0123456789abcdef"; /*** SHA-256: *********************************************************/ void SHA256_Init(SHA256_CTX* context) { - if (context == (SHA256_CTX*)0) { + if (context == NULL) { return; } MEMCPY_BCOPY(context->state, sha256_initial_hash_value, SHA256_DIGEST_LENGTH); @@ -465,7 +465,7 @@ void SHA256_Update(SHA256_CTX* context, const sha2_byte *data, size_t len) { } /* Sanity check: */ - assert(context != (SHA256_CTX*)0 && data != (sha2_byte*)0); + assert(context != NULL && data != NULL); usedspace = (context->bitcount >> 3) % SHA256_BLOCK_LENGTH; if (usedspace > 0) { @@ -490,7 +490,7 @@ void SHA256_Update(SHA256_CTX* context, const sha2_byte *data, size_t len) { } while (len >= SHA256_BLOCK_LENGTH) { /* Process as many complete blocks as we can */ - SHA256_Transform(context, (sha2_word32*)data); + SHA256_Transform(context, (const sha2_word32*)data); context->bitcount += SHA256_BLOCK_LENGTH << 3; len -= SHA256_BLOCK_LENGTH; data += SHA256_BLOCK_LENGTH; @@ -509,10 +509,10 @@ void SHA256_Final(sha2_byte digest[], SHA256_CTX* context) { unsigned int usedspace; /* Sanity check: */ - assert(context != (SHA256_CTX*)0); + assert(context != NULL); /* If no digest buffer is passed, we don't bother doing this: */ - if (digest != (sha2_byte*)0) { + if (digest != NULL) { usedspace = (context->bitcount >> 3) % SHA256_BLOCK_LENGTH; #ifndef WORDS_BIGENDIAN /* Convert FROM host byte order */ @@ -572,9 +572,9 @@ char *SHA256_End(SHA256_CTX* context, char buffer[]) { int i; /* Sanity check: */ - assert(context != (SHA256_CTX*)0); + assert(context != NULL); - if (buffer != (char*)0) { + if (buffer != NULL) { SHA256_Final(digest, context); for (i = 0; i < SHA256_DIGEST_LENGTH; i++) { @@ -582,7 +582,7 @@ char *SHA256_End(SHA256_CTX* context, char buffer[]) { *buffer++ = sha2_hex_digits[*d & 0x0f]; d++; } - *buffer = (char)0; + *buffer = 0; } else { MEMSET_BZERO(context, sizeof(context)); } @@ -601,7 +601,7 @@ char* SHA256_Data(const sha2_byte* data, size_t len, char digest[SHA256_DIGEST_S /*** SHA-512: *********************************************************/ void SHA512_Init(SHA512_CTX* context) { - if (context == (SHA512_CTX*)0) { + if (context == NULL) { return; } MEMCPY_BCOPY(context->state, sha512_initial_hash_value, SHA512_DIGEST_LENGTH); @@ -787,7 +787,7 @@ void SHA512_Update(SHA512_CTX* context, const sha2_byte *data, size_t len) { } /* Sanity check: */ - assert(context != (SHA512_CTX*)0 && data != (sha2_byte*)0); + assert(context != NULL && data != NULL); usedspace = (context->bitcount[0] >> 3) % SHA512_BLOCK_LENGTH; if (usedspace > 0) { @@ -812,7 +812,7 @@ void SHA512_Update(SHA512_CTX* context, const sha2_byte *data, size_t len) { } while (len >= SHA512_BLOCK_LENGTH) { /* Process as many complete blocks as we can */ - SHA512_Transform(context, (sha2_word64*)data); + SHA512_Transform(context, (const sha2_word64*)data); ADDINC128(context->bitcount, SHA512_BLOCK_LENGTH << 3); len -= SHA512_BLOCK_LENGTH; data += SHA512_BLOCK_LENGTH; @@ -871,10 +871,10 @@ void SHA512_Final(sha2_byte digest[], SHA512_CTX* context) { sha2_word64 *d = (sha2_word64*)digest; /* Sanity check: */ - assert(context != (SHA512_CTX*)0); + assert(context != NULL); /* If no digest buffer is passed, we don't bother doing this: */ - if (digest != (sha2_byte*)0) { + if (digest != NULL) { SHA512_Last(context); /* Save the hash data for output: */ @@ -901,9 +901,9 @@ char *SHA512_End(SHA512_CTX* context, char buffer[]) { int i; /* Sanity check: */ - assert(context != (SHA512_CTX*)0); + assert(context != NULL); - if (buffer != (char*)0) { + if (buffer != NULL) { SHA512_Final(digest, context); for (i = 0; i < SHA512_DIGEST_LENGTH; i++) { @@ -911,7 +911,7 @@ char *SHA512_End(SHA512_CTX* context, char buffer[]) { *buffer++ = sha2_hex_digits[*d & 0x0f]; d++; } - *buffer = (char)0; + *buffer = 0; } else { MEMSET_BZERO(context, sizeof(context)); } @@ -930,7 +930,7 @@ char* SHA512_Data(const sha2_byte* data, size_t len, char digest[SHA512_DIGEST_S /*** SHA-384: *********************************************************/ void SHA384_Init(SHA384_CTX* context) { - if (context == (SHA384_CTX*)0) { + if (context == NULL) { return; } MEMCPY_BCOPY(context->state, sha384_initial_hash_value, SHA512_DIGEST_LENGTH); @@ -946,10 +946,10 @@ void SHA384_Final(sha2_byte digest[], SHA384_CTX* context) { sha2_word64 *d = (sha2_word64*)digest; /* Sanity check: */ - assert(context != (SHA384_CTX*)0); + assert(context != NULL); /* If no digest buffer is passed, we don't bother doing this: */ - if (digest != (sha2_byte*)0) { + if (digest != NULL) { SHA512_Last((SHA512_CTX*)context); /* Save the hash data for output: */ @@ -976,9 +976,9 @@ char *SHA384_End(SHA384_CTX* context, char buffer[]) { int i; /* Sanity check: */ - assert(context != (SHA384_CTX*)0); + assert(context != NULL); - if (buffer != (char*)0) { + if (buffer != NULL) { SHA384_Final(digest, context); for (i = 0; i < SHA384_DIGEST_LENGTH; i++) { @@ -986,7 +986,7 @@ char *SHA384_End(SHA384_CTX* context, char buffer[]) { *buffer++ = sha2_hex_digits[*d & 0x0f]; d++; } - *buffer = (char)0; + *buffer = 0; } else { MEMSET_BZERO(context, sizeof(context)); } diff --git a/reactos/dll/win32/schannel/lsamode.c b/reactos/dll/win32/schannel/lsamode.c index 23d85994cc4..f43150e3d3a 100644 --- a/reactos/dll/win32/schannel/lsamode.c +++ b/reactos/dll/win32/schannel/lsamode.c @@ -109,6 +109,12 @@ static SECPKG_FUNCTION_TABLE secPkgFunctionTable[2] = NULL, /* SetExtendedInformation */ NULL, /* SetContextAttributes */ NULL, /* SetCredentialsAttributes */ + NULL, /* ChangeAccountPassword */ + NULL, /* QueryMetaData */ + NULL, /* ExchangeMetaData */ + NULL, /* GetCredUIContext */ + NULL, /* UpdateCredentials */ + NULL, /* ValidateTargetInfo */ }, { NULL, /* InitializePackage */ NULL, /* LsaLogonUser */ @@ -139,6 +145,12 @@ static SECPKG_FUNCTION_TABLE secPkgFunctionTable[2] = NULL, /* SetExtendedInformation */ NULL, /* SetContextAttributes */ NULL, /* SetCredentialsAttributes */ + NULL, /* ChangeAccountPassword */ + NULL, /* QueryMetaData */ + NULL, /* ExchangeMetaData */ + NULL, /* GetCredUIContext */ + NULL, /* UpdateCredentials */ + NULL, /* ValidateTargetInfo */ } }; @@ -150,7 +162,7 @@ NTSTATUS WINAPI SpLsaModeInitialize(ULONG LsaVersion, PULONG PackageVersion, { TRACE("(%u, %p, %p, %p)\n", LsaVersion, PackageVersion, ppTables, pcTables); - *PackageVersion = SECPKG_INTERFACE_VERSION_3; + *PackageVersion = SECPKG_INTERFACE_VERSION_6; *pcTables = 2; *ppTables = secPkgFunctionTable; diff --git a/reactos/dll/win32/shlwapi/ordinal.c b/reactos/dll/win32/shlwapi/ordinal.c index 364bbfe8af8..332bdb67f79 100644 --- a/reactos/dll/win32/shlwapi/ordinal.c +++ b/reactos/dll/win32/shlwapi/ordinal.c @@ -42,6 +42,7 @@ #include "mmsystem.h" #include "objbase.h" #include "exdisp.h" +#include "shdeprecated.h" #include "shlobj.h" #include "shlwapi.h" #include "shellapi.h" @@ -309,24 +310,22 @@ HRESULT WINAPI RegisterDefaultAcceptHeaders(LPBC lpBC, IUnknown *lpUnknown) BSTR property; IEnumFORMATETC* pIEnumFormatEtc = NULL; VARIANTARG var; - HRESULT hRet; - IWebBrowserApp* pBrowser = NULL; + HRESULT hr; + IWebBrowserApp* pBrowser; TRACE("(%p, %p)\n", lpBC, lpUnknown); - /* Get An IWebBrowserApp interface from lpUnknown */ - hRet = IUnknown_QueryService(lpUnknown, &IID_IWebBrowserApp, &IID_IWebBrowserApp, (PVOID)&pBrowser); - if (FAILED(hRet) || !pBrowser) - return E_NOINTERFACE; + hr = IUnknown_QueryService(lpUnknown, &IID_IWebBrowserApp, &IID_IWebBrowserApp, (void**)&pBrowser); + if (FAILED(hr)) + return hr; V_VT(&var) = VT_EMPTY; /* The property we get is the browsers clipboard enumerator */ property = SysAllocString(szProperty); - hRet = IWebBrowserApp_GetProperty(pBrowser, property, &var); + hr = IWebBrowserApp_GetProperty(pBrowser, property, &var); SysFreeString(property); - if (FAILED(hRet)) - return hRet; + if (FAILED(hr)) goto exit; if (V_VT(&var) == VT_EMPTY) { @@ -340,7 +339,10 @@ HRESULT WINAPI RegisterDefaultAcceptHeaders(LPBC lpBC, IUnknown *lpUnknown) if (!RegOpenKeyA(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\Current" "Version\\Internet Settings\\Accepted Documents", &hDocs)) - return E_FAIL; + { + hr = E_FAIL; + goto exit; + } /* Get count of values in key */ while (!dwRet) @@ -355,7 +357,11 @@ HRESULT WINAPI RegisterDefaultAcceptHeaders(LPBC lpBC, IUnknown *lpUnknown) /* Note: dwCount = number of items + 1; The extra item is the end node */ format = formatList = HeapAlloc(GetProcessHeap(), 0, dwCount * sizeof(FORMATETC)); if (!formatList) - return E_OUTOFMEMORY; + { + RegCloseKey(hDocs); + hr = E_OUTOFMEMORY; + goto exit; + } if (dwNumValues > 1) { @@ -372,7 +378,12 @@ HRESULT WINAPI RegisterDefaultAcceptHeaders(LPBC lpBC, IUnknown *lpUnknown) dwRet = RegEnumValueA(hDocs, dwCount, szKeyBuff, &dwKeySize, 0, &dwType, (PBYTE)szValueBuff, &dwValueSize); if (!dwRet) - return E_FAIL; + { + HeapFree(GetProcessHeap(), 0, formatList); + RegCloseKey(hDocs); + hr = E_FAIL; + goto exit; + } format->cfFormat = RegisterClipboardFormatA(szValueBuff); format->ptd = NULL; @@ -385,6 +396,8 @@ HRESULT WINAPI RegisterDefaultAcceptHeaders(LPBC lpBC, IUnknown *lpUnknown) } } + RegCloseKey(hDocs); + /* Terminate the (maybe empty) list, last entry has a cfFormat of 0 */ format->cfFormat = 0; format->ptd = NULL; @@ -393,22 +406,21 @@ HRESULT WINAPI RegisterDefaultAcceptHeaders(LPBC lpBC, IUnknown *lpUnknown) format->tymed = -1; /* Create a clipboard enumerator */ - hRet = CreateFormatEnumerator(dwNumValues, formatList, &pIEnumFormatEtc); - - if (FAILED(hRet) || !pIEnumFormatEtc) - return hRet; + hr = CreateFormatEnumerator(dwNumValues, formatList, &pIEnumFormatEtc); + HeapFree(GetProcessHeap(), 0, formatList); + if (FAILED(hr)) goto exit; /* Set our enumerator as the browsers property */ V_VT(&var) = VT_UNKNOWN; V_UNKNOWN(&var) = (IUnknown*)pIEnumFormatEtc; property = SysAllocString(szProperty); - hRet = IWebBrowserApp_PutProperty(pBrowser, property, var); + hr = IWebBrowserApp_PutProperty(pBrowser, property, var); SysFreeString(property); - if (FAILED(hRet)) + if (FAILED(hr)) { IEnumFORMATETC_Release(pIEnumFormatEtc); - goto RegisterDefaultAcceptHeaders_Exit; + goto exit; } } @@ -422,28 +434,26 @@ HRESULT WINAPI RegisterDefaultAcceptHeaders(LPBC lpBC, IUnknown *lpUnknown) /* Get an IEnumFormatEtc interface from the variants value */ pIEnumFormatEtc = NULL; - hRet = IUnknown_QueryInterface(pIUnknown, &IID_IEnumFORMATETC, - (PVOID)&pIEnumFormatEtc); - if (hRet == S_OK && pIEnumFormatEtc) + hr = IUnknown_QueryInterface(pIUnknown, &IID_IEnumFORMATETC, (void**)&pIEnumFormatEtc); + if (hr == S_OK && pIEnumFormatEtc) { /* Clone and register the enumerator */ - hRet = IEnumFORMATETC_Clone(pIEnumFormatEtc, &pClone); - if (hRet == S_OK && pClone) + hr = IEnumFORMATETC_Clone(pIEnumFormatEtc, &pClone); + if (hr == S_OK && pClone) { RegisterFormatEnumerator(lpBC, pClone, 0); IEnumFORMATETC_Release(pClone); } - /* Release the IEnumFormatEtc interface */ IEnumFORMATETC_Release(pIUnknown); } IUnknown_Release(V_UNKNOWN(&var)); } -RegisterDefaultAcceptHeaders_Exit: +exit: IWebBrowserApp_Release(pBrowser); - return hRet; + return hr; } /************************************************************************* @@ -500,7 +510,7 @@ HRESULT WINAPI GetAcceptLanguagesW( LPWSTR langbuf, LPDWORD buflen) return S_OK; } - /* Did not find a value in the registry or the user buffer is to small */ + /* Did not find a value in the registry or the user buffer is too small */ mylcid = GetUserDefaultLCID(); retval = LcidToRfc1766W(mylcid, mystr, mystrlen); len = lstrlenW(mystr); @@ -1201,7 +1211,7 @@ HRESULT WINAPI ConnectToConnectionPoint(IUnknown* lpUnkSink, REFIID riid, BOOL f /************************************************************************* * @ [SHLWAPI.169] * - * Release an interface. + * Release an interface and zero a supplied pointer. * * PARAMS * lpUnknown [I] Object to release @@ -1209,19 +1219,16 @@ HRESULT WINAPI ConnectToConnectionPoint(IUnknown* lpUnkSink, REFIID riid, BOOL f * RETURNS * Nothing. */ -DWORD WINAPI IUnknown_AtomicRelease(IUnknown ** lpUnknown) +void WINAPI IUnknown_AtomicRelease(IUnknown ** lpUnknown) { - IUnknown *temp; + TRACE("(%p)\n", lpUnknown); - TRACE("(%p)\n",lpUnknown); - - if(!lpUnknown || !*((LPDWORD)lpUnknown)) return 0; - temp = *lpUnknown; - *lpUnknown = NULL; + if(!lpUnknown || !*lpUnknown) return; TRACE("doing Release\n"); - return IUnknown_Release(temp); + IUnknown_Release(*lpUnknown); + *lpUnknown = NULL; } /************************************************************************* @@ -1258,9 +1265,10 @@ LPCSTR WINAPI PathSkipLeadingSlashesA(LPCSTR lpszSrc) */ BOOL WINAPI SHIsSameObject(IUnknown* lpInt1, IUnknown* lpInt2) { - LPVOID lpUnknown1, lpUnknown2; + IUnknown *lpUnknown1, *lpUnknown2; + BOOL ret; - TRACE("%p %p\n", lpInt1, lpInt2); + TRACE("(%p %p)\n", lpInt1, lpInt2); if (!lpInt1 || !lpInt2) return FALSE; @@ -1268,16 +1276,21 @@ BOOL WINAPI SHIsSameObject(IUnknown* lpInt1, IUnknown* lpInt2) if (lpInt1 == lpInt2) return TRUE; - if (FAILED(IUnknown_QueryInterface(lpInt1, &IID_IUnknown, &lpUnknown1))) + if (IUnknown_QueryInterface(lpInt1, &IID_IUnknown, (void**)&lpUnknown1) != S_OK) return FALSE; - if (FAILED(IUnknown_QueryInterface(lpInt2, &IID_IUnknown, &lpUnknown2))) + if (IUnknown_QueryInterface(lpInt2, &IID_IUnknown, (void**)&lpUnknown2) != S_OK) + { + IUnknown_Release(lpUnknown1); return FALSE; + } - if (lpUnknown1 == lpUnknown2) - return TRUE; + ret = lpUnknown1 == lpUnknown2; - return FALSE; + IUnknown_Release(lpUnknown1); + IUnknown_Release(lpUnknown2); + + return ret; } /************************************************************************* @@ -1337,36 +1350,32 @@ HRESULT WINAPI IUnknown_GetWindow(IUnknown *lpUnknown, HWND *lphWnd) /************************************************************************* * @ [SHLWAPI.173] * - * Call a method on as as yet unidentified object. + * Call a SetOwner method of IShellService from specified object. * * PARAMS - * pUnk [I] Object supporting the unidentified interface, - * arg [I] Argument for the call on the object. + * iface [I] Object that supports IShellService + * pUnk [I] Argument for the SetOwner call * * RETURNS - * S_OK. + * Corresponding return value from last call or E_FAIL for null input */ -HRESULT WINAPI IUnknown_SetOwner(IUnknown *pUnk, ULONG arg) +HRESULT WINAPI IUnknown_SetOwner(IUnknown *iface, IUnknown *pUnk) { - static const GUID guid_173 = { - 0x5836fb00, 0x8187, 0x11cf, { 0xa1,0x2b,0x00,0xaa,0x00,0x4a,0xe8,0x37 } - }; - IMalloc *pUnk2; + IShellService *service; + HRESULT hr; - TRACE("(%p,%d)\n", pUnk, arg); + TRACE("(%p, %p)\n", iface, pUnk); - /* Note: arg may not be a ULONG and pUnk2 is for sure not an IMalloc - - * We use this interface as its vtable entry is compatible with the - * object in question. - * FIXME: Find out what this object is and where it should be defined. - */ - if (pUnk && - SUCCEEDED(IUnknown_QueryInterface(pUnk, &guid_173, (void**)&pUnk2))) + if (!iface) return E_FAIL; + + hr = IUnknown_QueryInterface(iface, &IID_IShellService, (void**)&service); + if (hr == S_OK) { - IMalloc_Alloc(pUnk2, arg); /* Faked call!! */ - IMalloc_Release(pUnk2); + hr = IShellService_SetOwner(service, pUnk); + IShellService_Release(service); } - return S_OK; + + return hr; } /************************************************************************* @@ -1473,7 +1482,6 @@ HRESULT WINAPI IUnknown_QueryService(IUnknown* lpUnknown, REFGUID sid, REFIID ri if (!lpUnknown) return E_FAIL; - /* Get an IServiceProvider interface from the object */ hRet = IUnknown_QueryInterface(lpUnknown, &IID_IServiceProvider, (LPVOID*)&pService); @@ -1486,12 +1494,92 @@ HRESULT WINAPI IUnknown_QueryService(IUnknown* lpUnknown, REFGUID sid, REFIID ri TRACE("(IServiceProvider*)%p returned (IUnknown*)%p\n", pService, *lppOut); - /* Release the IServiceProvider interface */ IUnknown_Release(pService); } return hRet; } +/************************************************************************* + * @ [SHLWAPI.484] + * + * Calls IOleCommandTarget::Exec() for specified service object. + * + * PARAMS + * lpUnknown [I] Object to get an IServiceProvider interface from + * service [I] Service ID for IServiceProvider_QueryService() call + * group [I] Group ID for IOleCommandTarget::Exec() call + * cmdId [I] Command ID for IOleCommandTarget::Exec() call + * cmdOpt [I] Options flags for command + * pIn [I] Input arguments for command + * pOut [O] Output arguments for command + * + * RETURNS + * Success: S_OK. lppOut contains an object providing the requested service + * Failure: An HRESULT error code + * + * NOTES + * lpUnknown is expected to support the IServiceProvider interface. + */ +HRESULT WINAPI IUnknown_QueryServiceExec(IUnknown *lpUnknown, REFIID service, + const GUID *group, DWORD cmdId, DWORD cmdOpt, VARIANT *pIn, VARIANT *pOut) +{ + IOleCommandTarget *target; + HRESULT hr; + + TRACE("%p %s %s %d %08x %p %p\n", lpUnknown, debugstr_guid(service), + debugstr_guid(group), cmdId, cmdOpt, pIn, pOut); + + hr = IUnknown_QueryService(lpUnknown, service, &IID_IOleCommandTarget, (void**)&target); + if (hr == S_OK) + { + hr = IOleCommandTarget_Exec(target, group, cmdId, cmdOpt, pIn, pOut); + IOleCommandTarget_Release(target); + } + + TRACE("<-- hr=0x%08x\n", hr); + + return hr; +} + +/************************************************************************* + * @ [SHLWAPI.514] + * + * Calls IProfferService methods to proffer/revoke specified service. + * + * PARAMS + * lpUnknown [I] Object to get an IServiceProvider interface from + * service [I] Service ID for IProfferService::Proffer/Revoke calls + * pService [I] Service to proffer. If NULL ::Revoke is called + * pCookie [IO] Group ID for IOleCommandTarget::Exec() call + * + * RETURNS + * Success: S_OK. IProffer method returns S_OK + * Failure: An HRESULT error code + * + * NOTES + * lpUnknown is expected to support the IServiceProvider interface. + */ +HRESULT WINAPI IUnknown_ProfferService(IUnknown *lpUnknown, REFGUID service, IServiceProvider *pService, DWORD *pCookie) +{ + IProfferService *proffer; + HRESULT hr; + + TRACE("%p %s %p %p\n", lpUnknown, debugstr_guid(service), pService, pCookie); + + hr = IUnknown_QueryService(lpUnknown, &IID_IProfferService, &IID_IProfferService, (void**)&proffer); + if (hr == S_OK) + { + if (pService) + hr = IProfferService_ProfferService(proffer, service, pService, pCookie); + else + hr = IProfferService_RevokeService(proffer, *pCookie); + + IProfferService_Release(proffer); + } + + return hr; +} + /************************************************************************* * @ [SHLWAPI.479] * @@ -1546,6 +1634,8 @@ BOOL WINAPI SHLoadMenuPopup(HINSTANCE hInst, LPCWSTR szName) { HMENU hMenu; + TRACE("%p %s\n", hInst, debugstr_w(szName)); + if ((hMenu = LoadMenuW(hInst, szName))) { if (GetSubMenu(hMenu, 0)) @@ -1629,6 +1719,9 @@ void WINAPI SHPropagateMessage(HWND hWnd, UINT uiMsgId, WPARAM wParam, LPARAM lP DWORD WINAPI SHRemoveAllSubMenus(HMENU hMenu) { int iItemCount = GetMenuItemCount(hMenu) - 1; + + TRACE("%p\n", hMenu); + while (iItemCount >= 0) { HMENU hSubMenu = GetSubMenu(hMenu, iItemCount); @@ -1654,6 +1747,7 @@ DWORD WINAPI SHRemoveAllSubMenus(HMENU hMenu) */ UINT WINAPI SHEnableMenuItem(HMENU hMenu, UINT wItemID, BOOL bEnable) { + TRACE("%p, %u, %d\n", hMenu, wItemID, bEnable); return EnableMenuItem(hMenu, wItemID, bEnable ? MF_ENABLED : MF_GRAYED); } @@ -1672,6 +1766,7 @@ UINT WINAPI SHEnableMenuItem(HMENU hMenu, UINT wItemID, BOOL bEnable) */ DWORD WINAPI SHCheckMenuItem(HMENU hMenu, UINT uID, BOOL bCheck) { + TRACE("%p, %u, %d\n", hMenu, uID, bCheck); return CheckMenuItem(hMenu, uID, bCheck ? MF_CHECKED : MF_UNCHECKED); } @@ -1703,6 +1798,8 @@ BOOL WINAPI SHSimulateDrop(IDropTarget *pDrop, IDataObject *pDataObj, DWORD dwEffect = DROPEFFECT_LINK | DROPEFFECT_MOVE | DROPEFFECT_COPY; POINTL pt = { 0, 0 }; + TRACE("%p %p 0x%08x %p %p\n", pDrop, pDataObj, grfKeyState, lpPt, pdwEffect); + if (!lpPt) lpPt = &pt; @@ -1711,7 +1808,7 @@ BOOL WINAPI SHSimulateDrop(IDropTarget *pDrop, IDataObject *pDataObj, IDropTarget_DragEnter(pDrop, pDataObj, grfKeyState, *lpPt, pdwEffect); - if (*pdwEffect) + if (*pdwEffect != DROPEFFECT_NONE) return IDropTarget_Drop(pDrop, pDataObj, grfKeyState, *lpPt, pdwEffect); IDropTarget_DragLeave(pDrop); @@ -1803,7 +1900,7 @@ HRESULT WINAPI IUnknown_OnFocusOCS(IUnknown *lpUnknown, BOOL fGotFocus) IOleControlSite* lpCSite = NULL; HRESULT hRet = E_FAIL; - TRACE("(%p,%s)\n", lpUnknown, fGotFocus ? "TRUE" : "FALSE"); + TRACE("(%p, %d)\n", lpUnknown, fGotFocus); if (lpUnknown) { hRet = IUnknown_QueryInterface(lpUnknown, &IID_IOleControlSite, @@ -2061,12 +2158,10 @@ VOID WINAPI IUnknown_Set(IUnknown **lppDest, IUnknown *lpUnknown) { TRACE("(%p,%p)\n", lppDest, lpUnknown); - if (lppDest) - IUnknown_AtomicRelease(lppDest); /* Release existing interface */ + IUnknown_AtomicRelease(lppDest); if (lpUnknown) { - /* Copy */ IUnknown_AddRef(lpUnknown); *lppDest = lpUnknown; } @@ -2256,12 +2351,6 @@ BOOL WINAPI FDSA_DeleteItem(FDSA_info *info, DWORD where) return TRUE; } - -typedef struct { - REFIID refid; - DWORD indx; -} IFACE_INDEX_TBL; - /************************************************************************* * @ [SHLWAPI.219] * @@ -2272,22 +2361,22 @@ typedef struct { * Failure: E_POINTER or E_NOINTERFACE. */ HRESULT WINAPI QISearch( - LPVOID w, /* [in] Table of interfaces */ - IFACE_INDEX_TBL *x, /* [in] Array of REFIIDs and indexes into the table */ + void *base, /* [in] Table of interfaces */ + const QITAB *table, /* [in] Array of REFIIDs and indexes into the table */ REFIID riid, /* [in] REFIID to get interface for */ - LPVOID *ppv) /* [out] Destination for interface pointer */ + void **ppv) /* [out] Destination for interface pointer */ { HRESULT ret; IUnknown *a_vtbl; - IFACE_INDEX_TBL *xmove; + const QITAB *xmove; - TRACE("(%p %p %s %p)\n", w,x,debugstr_guid(riid),ppv); + TRACE("(%p %p %s %p)\n", base, table, debugstr_guid(riid), ppv); if (ppv) { - xmove = x; - while (xmove->refid) { - TRACE("trying (indx %d) %s\n", xmove->indx, debugstr_guid(xmove->refid)); - if (IsEqualIID(riid, xmove->refid)) { - a_vtbl = (IUnknown*)(xmove->indx + (LPBYTE)w); + xmove = table; + while (xmove->piid) { + TRACE("trying (offset %d) %s\n", xmove->dwOffset, debugstr_guid(xmove->piid)); + if (IsEqualIID(riid, xmove->piid)) { + a_vtbl = (IUnknown*)(xmove->dwOffset + (LPBYTE)base); TRACE("matched, returning (%p)\n", a_vtbl); *ppv = a_vtbl; IUnknown_AddRef(a_vtbl); @@ -2297,7 +2386,7 @@ HRESULT WINAPI QISearch( } if (IsEqualIID(riid, &IID_IUnknown)) { - a_vtbl = (IUnknown*)(x->indx + (LPBYTE)w); + a_vtbl = (IUnknown*)(table->dwOffset + (LPBYTE)base); TRACE("returning first for IUnknown (%p)\n", a_vtbl); *ppv = a_vtbl; IUnknown_AddRef(a_vtbl); @@ -2506,27 +2595,27 @@ HRESULT WINAPI IUnknown_GetSite(LPUNKNOWN lpUnknown, REFIID iid, PVOID *lppSite) * dwExStyle [I] Extra style flags * dwStyle [I] Style flags * hMenu [I] Window menu - * z [I] Unknown + * wnd_extra [I] Window extra bytes value * * RETURNS * Success: The window handle of the newly created window. * Failure: 0. */ HWND WINAPI SHCreateWorkerWindowA(LONG wndProc, HWND hWndParent, DWORD dwExStyle, - DWORD dwStyle, HMENU hMenu, LONG z) + DWORD dwStyle, HMENU hMenu, LONG_PTR wnd_extra) { static const char szClass[] = "WorkerA"; WNDCLASSA wc; HWND hWnd; - TRACE("(0x%08x,%p,0x%08x,0x%08x,%p,0x%08x)\n", - wndProc, hWndParent, dwExStyle, dwStyle, hMenu, z); + TRACE("(0x%08x, %p, 0x%08x, 0x%08x, %p, 0x%08lx)\n", + wndProc, hWndParent, dwExStyle, dwStyle, hMenu, wnd_extra); /* Create Window class */ wc.style = 0; wc.lpfnWndProc = DefWindowProcA; wc.cbClsExtra = 0; - wc.cbWndExtra = 4; + wc.cbWndExtra = sizeof(LONG_PTR); wc.hInstance = shlwapi_hInstance; wc.hIcon = NULL; wc.hCursor = LoadCursorA(NULL, (LPSTR)IDC_ARROW); @@ -2534,19 +2623,17 @@ HWND WINAPI SHCreateWorkerWindowA(LONG wndProc, HWND hWndParent, DWORD dwExStyle wc.lpszMenuName = NULL; wc.lpszClassName = szClass; - SHRegisterClassA(&wc); /* Register class */ - - /* FIXME: Set extra bits in dwExStyle */ + SHRegisterClassA(&wc); hWnd = CreateWindowExA(dwExStyle, szClass, 0, dwStyle, 0, 0, 0, 0, hWndParent, hMenu, shlwapi_hInstance, 0); if (hWnd) { - SetWindowLongPtrW(hWnd, DWLP_MSGRESULT, z); + SetWindowLongPtrW(hWnd, 0, wnd_extra); - if (wndProc) - SetWindowLongPtrA(hWnd, GWLP_WNDPROC, wndProc); + if (wndProc) SetWindowLongPtrA(hWnd, GWLP_WNDPROC, wndProc); } + return hWnd; } @@ -2729,7 +2816,7 @@ BOOL WINAPI GUIDFromStringA(LPCSTR idstr, CLSID *id) */ BOOL WINAPI GUIDFromStringW(LPCWSTR idstr, CLSID *id) { - return SUCCEEDED(CLSIDFromString((LPOLESTR)idstr, id)); + return SUCCEEDED(CLSIDFromString((LPCOLESTR)idstr, id)); } /************************************************************************* @@ -2804,18 +2891,21 @@ DWORD WINAPI WhichPlatform(void) * Unicode version of SHCreateWorkerWindowA. */ HWND WINAPI SHCreateWorkerWindowW(LONG wndProc, HWND hWndParent, DWORD dwExStyle, - DWORD dwStyle, HMENU hMenu, LONG z) + DWORD dwStyle, HMENU hMenu, LONG msg_result) { - static const WCHAR szClass[] = { 'W', 'o', 'r', 'k', 'e', 'r', 'W', '\0' }; + static const WCHAR szClass[] = { 'W', 'o', 'r', 'k', 'e', 'r', 'W', 0 }; WNDCLASSW wc; HWND hWnd; - TRACE("(0x%08x,%p,0x%08x,0x%08x,%p,0x%08x)\n", - wndProc, hWndParent, dwExStyle, dwStyle, hMenu, z); + TRACE("(0x%08x, %p, 0x%08x, 0x%08x, %p, 0x%08x)\n", + wndProc, hWndParent, dwExStyle, dwStyle, hMenu, msg_result); - /* If our OS is natively ASCII, use the ASCII version */ - if (!(GetVersion() & 0x80000000)) /* NT */ - return SHCreateWorkerWindowA(wndProc, hWndParent, dwExStyle, dwStyle, hMenu, z); + /* If our OS is natively ANSI, use the ANSI version */ + if (GetVersion() & 0x80000000) /* not NT */ + { + TRACE("fallback to ANSI, ver 0x%08x\n", GetVersion()); + return SHCreateWorkerWindowA(wndProc, hWndParent, dwExStyle, dwStyle, hMenu, msg_result); + } /* Create Window class */ wc.style = 0; @@ -2829,19 +2919,17 @@ HWND WINAPI SHCreateWorkerWindowW(LONG wndProc, HWND hWndParent, DWORD dwExStyle wc.lpszMenuName = NULL; wc.lpszClassName = szClass; - SHRegisterClassW(&wc); /* Register class */ - - /* FIXME: Set extra bits in dwExStyle */ + SHRegisterClassW(&wc); hWnd = CreateWindowExW(dwExStyle, szClass, 0, dwStyle, 0, 0, 0, 0, hWndParent, hMenu, shlwapi_hInstance, 0); if (hWnd) { - SetWindowLongPtrW(hWnd, DWLP_MSGRESULT, z); + SetWindowLongPtrW(hWnd, DWLP_MSGRESULT, msg_result); - if (wndProc) - SetWindowLongPtrW(hWnd, GWLP_WNDPROC, wndProc); + if (wndProc) SetWindowLongPtrW(hWnd, GWLP_WNDPROC, wndProc); } + return hWnd; } @@ -2861,7 +2949,8 @@ HWND WINAPI SHCreateWorkerWindowW(LONG wndProc, HWND hWndParent, DWORD dwExStyle */ HRESULT WINAPI SHInvokeDefaultCommand(HWND hWnd, IShellFolder* lpFolder, LPCITEMIDLIST lpApidl) { - return SHInvokeCommand(hWnd, lpFolder, lpApidl, FALSE); + TRACE("%p %p %p\n", hWnd, lpFolder, lpApidl); + return SHInvokeCommand(hWnd, lpFolder, lpApidl, FALSE); } /************************************************************************* @@ -3376,12 +3465,12 @@ UINT WINAPI SHDefExtractIconWrapW(LPCWSTR pszIconFile, int iIndex, UINT uFlags, HRESULT WINAPI SHInvokeCommand(HWND hWnd, IShellFolder* lpFolder, LPCITEMIDLIST lpApidl, BOOL bInvokeDefault) { IContextMenu *iContext; - HRESULT hRet = E_FAIL; + HRESULT hRet; - TRACE("(%p,%p,%p,%d)\n", hWnd, lpFolder, lpApidl, bInvokeDefault); + TRACE("(%p, %p, %p, %d)\n", hWnd, lpFolder, lpApidl, bInvokeDefault); if (!lpFolder) - return hRet; + return E_FAIL; /* Get the context menu from the shell folder */ hRet = IShellFolder_GetUIObjectOf(lpFolder, hWnd, 1, &lpApidl, @@ -3401,7 +3490,7 @@ HRESULT WINAPI SHInvokeCommand(HWND hWnd, IShellFolder* lpFolder, LPCITEMIDLIST if (SUCCEEDED(hQuery)) { if (bInvokeDefault && - (dwDefaultId = GetMenuDefaultItem(hMenu, 0, 0)) != 0xFFFFFFFF) + (dwDefaultId = GetMenuDefaultItem(hMenu, 0, 0)) != (UINT)-1) { CMINVOKECOMMANDINFO cmIci; /* Invoke the default item */ @@ -3810,7 +3899,7 @@ DWORD WINAPI SHSendMessageBroadcastW(UINT uMsg, WPARAM wParam, LPARAM lParam) */ HRESULT WINAPI CLSIDFromStringWrap(LPCWSTR idstr, CLSID *id) { - return CLSIDFromString((LPOLESTR)idstr, id); + return CLSIDFromString((LPCOLESTR)idstr, id); } /************************************************************************* @@ -4171,18 +4260,24 @@ BOOL WINAPI SHIsLowMemoryMachine (DWORD x) */ INT WINAPI GetMenuPosFromID(HMENU hMenu, UINT wID) { - MENUITEMINFOW mi; - INT nCount = GetMenuItemCount(hMenu), nIter = 0; + MENUITEMINFOW mi; + INT nCount = GetMenuItemCount(hMenu), nIter = 0; - while (nIter < nCount) - { - mi.cbSize = sizeof(mi); - mi.fMask = MIIM_ID; - if (GetMenuItemInfoW(hMenu, nIter, TRUE, &mi) && mi.wID == wID) - return nIter; - nIter++; - } - return -1; + TRACE("%p %u\n", hMenu, wID); + + while (nIter < nCount) + { + mi.cbSize = sizeof(mi); + mi.fMask = MIIM_ID; + if (GetMenuItemInfoW(hMenu, nIter, TRUE, &mi) && mi.wID == wID) + { + TRACE("ret %d\n", nIter); + return nIter; + } + nIter++; + } + + return -1; } /************************************************************************* @@ -4192,6 +4287,7 @@ INT WINAPI GetMenuPosFromID(HMENU hMenu, UINT wID) */ DWORD WINAPI SHMenuIndexFromID(HMENU hMenu, UINT uID) { + TRACE("%p %u\n", hMenu, uID); return GetMenuPosFromID(hMenu, uID); } @@ -4270,10 +4366,10 @@ BOOL WINAPI SHSkipJunction(IBindCtx *pbc, const CLSID *pclsid) /*********************************************************************** * SHGetShellKey (SHLWAPI.@) */ -DWORD WINAPI SHGetShellKey(DWORD a, DWORD b, DWORD c) +HKEY WINAPI SHGetShellKey(DWORD flags, LPCWSTR sub_key, BOOL create) { - FIXME("(%x, %x, %x): stub\n", a, b, c); - return 0x50; + FIXME("(0x%08x, %s, %d): stub\n", flags, debugstr_w(sub_key), create); + return (HKEY)0x50; } /*********************************************************************** @@ -4422,20 +4518,6 @@ INT WINAPIV ShellMessageBoxWrapW(HINSTANCE hInstance, HWND hWnd, LPCWSTR lpText, return ret; } -HRESULT WINAPI IUnknown_QueryServiceExec(IUnknown *unk, REFIID service, REFIID clsid, - DWORD x1, DWORD x2, DWORD x3, void **ppvOut) -{ - FIXME("%p %s %s %08x %08x %08x %p\n", unk, - debugstr_guid(service), debugstr_guid(clsid), x1, x2, x3, ppvOut); - return E_NOTIMPL; -} - -HRESULT WINAPI IUnknown_ProfferService(IUnknown *unk, void *x0, void *x1, void *x2) -{ - FIXME("%p %p %p %p\n", unk, x0, x1, x2); - return E_NOTIMPL; -} - /*********************************************************************** * ZoneComputePaneSize [SHLWAPI.382] */ diff --git a/reactos/dll/win32/shlwapi/shlwapi.spec b/reactos/dll/win32/shlwapi/shlwapi.spec index d899232f9c5..367046b5ebc 100644 --- a/reactos/dll/win32/shlwapi/shlwapi.spec +++ b/reactos/dll/win32/shlwapi/shlwapi.spec @@ -216,7 +216,7 @@ 216 stdcall -noname SHAnsiToUnicodeCP(long str ptr long) 217 stdcall -noname SHUnicodeToAnsi(wstr ptr ptr) 218 stdcall -noname SHUnicodeToAnsiCP(long wstr ptr long) -219 stdcall -noname QISearch(long long long long) +219 stdcall QISearch(long long long long) 220 stdcall -noname SHSetDefaultDialogFont(ptr long) 221 stdcall -noname SHRemoveDefaultDialogFont(ptr) 222 stdcall -noname SHGlobalCounterCreate(long) diff --git a/reactos/dll/win32/shlwapi/url.c b/reactos/dll/win32/shlwapi/url.c index 958a8429f53..cd83b457178 100644 --- a/reactos/dll/win32/shlwapi/url.c +++ b/reactos/dll/win32/shlwapi/url.c @@ -278,7 +278,8 @@ HRESULT WINAPI UrlCanonicalizeW(LPCWSTR pszUrl, LPWSTR pszCanonicalized, { HRESULT hr = S_OK; DWORD EscapeFlags; - LPWSTR lpszUrlCpy, wk1, wk2, mp, mp2, root; + LPCWSTR wk1, root; + LPWSTR lpszUrlCpy, wk2, mp, mp2; INT state; DWORD nByteLen, nLen, nWkLen; WCHAR slash = '/'; @@ -322,7 +323,7 @@ HRESULT WINAPI UrlCanonicalizeW(LPCWSTR pszUrl, LPWSTR pszCanonicalized, * 6 have location (found /) save root location */ - wk1 = (LPWSTR)pszUrl; + wk1 = pszUrl; wk2 = lpszUrlCpy; state = 0; @@ -662,7 +663,7 @@ HRESULT WINAPI UrlCombineW(LPCWSTR pszBase, LPCWSTR pszRelative, } } - /* If there is a '#' and the characters immediately preceeding it are + /* If there is a '#' and the characters immediately preceding it are * ".htm[l]", then begin looking for the last leaf starting from * the '#'. Otherwise the '#' is not meaningful and just start * looking from the end. */ @@ -1718,6 +1719,9 @@ BOOL WINAPI UrlIsA(LPCSTR pszUrl, URLIS Urlis) TRACE("(%s %d)\n", debugstr_a(pszUrl), Urlis); + if(!pszUrl) + return FALSE; + switch (Urlis) { case URLIS_OPAQUE: @@ -1768,6 +1772,9 @@ BOOL WINAPI UrlIsW(LPCWSTR pszUrl, URLIS Urlis) TRACE("(%s %d)\n", debugstr_w(pszUrl), Urlis); + if(!pszUrl) + return FALSE; + switch (Urlis) { case URLIS_OPAQUE: diff --git a/reactos/dll/win32/sti/regsvr.c b/reactos/dll/win32/sti/regsvr.c index 018c1781ef6..3e582ec4964 100644 --- a/reactos/dll/win32/sti/regsvr.c +++ b/reactos/dll/win32/sti/regsvr.c @@ -19,7 +19,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ - #include #include @@ -31,6 +30,7 @@ #include "objbase.h" #include "initguid.h" #include "sti.h" +#include "wia_lh.h" #include "wine/debug.h" #include "wine/unicode.h" @@ -395,8 +395,11 @@ static struct regsvr_interface const interface_list[] = { { NULL } /* list terminator */ }; +extern HRESULT WINAPI STI_DllRegisterServer(void) DECLSPEC_HIDDEN; +extern HRESULT WINAPI STI_DllUnregisterServer(void) DECLSPEC_HIDDEN; + /*********************************************************************** - * DllRegisterServer (INETCOMM.@) + * DllRegisterServer (STI.@) */ HRESULT WINAPI DllRegisterServer(void) { @@ -404,14 +407,16 @@ HRESULT WINAPI DllRegisterServer(void) TRACE("\n"); - hr = register_coclasses(coclass_list); + hr = STI_DllRegisterServer(); + if (SUCCEEDED(hr)) + hr = register_coclasses(coclass_list); if (SUCCEEDED(hr)) hr = register_interfaces(interface_list); return hr; } /*********************************************************************** - * DllUnregisterServer (INETCOMM.@) + * DllUnregisterServer (STI.@) */ HRESULT WINAPI DllUnregisterServer(void) { @@ -422,5 +427,7 @@ HRESULT WINAPI DllUnregisterServer(void) hr = unregister_coclasses(coclass_list); if (SUCCEEDED(hr)) hr = unregister_interfaces(interface_list); + if (SUCCEEDED(hr)) + hr = STI_DllUnregisterServer(); return hr; } diff --git a/reactos/dll/win32/sti/sti.c b/reactos/dll/win32/sti/sti.c new file mode 100644 index 00000000000..974bd06f693 --- /dev/null +++ b/reactos/dll/win32/sti/sti.c @@ -0,0 +1,352 @@ +/* + * Copyright (C) 2002 Aric Stewart for CodeWeavers + * Copyright (C) 2009 Damjan Jovanovic + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include + +#define COBJMACROS + +#include "windef.h" +#include "winbase.h" +#include "winreg.h" +#include "winerror.h" +#include "objbase.h" +#include "sti.h" + +#include "sti_private.h" + +#include "wine/debug.h" +#include "wine/unicode.h" + +WINE_DEFAULT_DEBUG_CHANNEL(sti); + +static const WCHAR registeredAppsLaunchPath[] = { + 'S','O','F','T','W','A','R','E','\\', + 'M','i','c','r','o','s','o','f','t','\\', + 'W','i','n','d','o','w','s','\\', + 'C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\', + 'S','t','i','l','l','I','m','a','g','e','\\', + 'R','e','g','i','s','t','e','r','e','d',' ','A','p','p','l','i','c','a','t','i','o','n','s',0 +}; + +static inline stillimage *impl_from_StillImageW(IStillImageW *iface) +{ + return (stillimage *)((char*)iface - FIELD_OFFSET(stillimage, lpVtbl)); +} + +static HRESULT WINAPI stillimagew_QueryInterface(IStillImageW *iface, REFIID riid, void **ppvObject) +{ + stillimage *This = impl_from_StillImageW(iface); + TRACE("(%p %s %p)\n", This, debugstr_guid(riid), ppvObject); + return IUnknown_QueryInterface(This->pUnkOuter, riid, ppvObject); +} + +static ULONG WINAPI stillimagew_AddRef(IStillImageW *iface) +{ + stillimage *This = impl_from_StillImageW(iface); + return IUnknown_AddRef(This->pUnkOuter); +} + +static ULONG WINAPI stillimagew_Release(IStillImageW *iface) +{ + stillimage *This = impl_from_StillImageW(iface); + return IUnknown_Release(This->pUnkOuter); +} + +static HRESULT WINAPI stillimagew_Initialize(IStillImageW *iface, HINSTANCE hinst, DWORD dwVersion) +{ + stillimage *This = impl_from_StillImageW(iface); + TRACE("(%p, %p, 0x%X)\n", This, hinst, dwVersion); + return S_OK; +} + +static HRESULT WINAPI stillimagew_GetDeviceList(IStillImageW *iface, DWORD dwType, DWORD dwFlags, + DWORD *pdwItemsReturned, LPVOID *ppBuffer) +{ + stillimage *This = impl_from_StillImageW(iface); + FIXME("(%p, %u, 0x%X, %p, %p): stub\n", This, dwType, dwFlags, pdwItemsReturned, ppBuffer); + return E_NOTIMPL; +} + +static HRESULT WINAPI stillimagew_GetDeviceInfo(IStillImageW *iface, LPWSTR pwszDeviceName, + LPVOID *ppBuffer) +{ + stillimage *This = impl_from_StillImageW(iface); + FIXME("(%p, %s, %p): stub\n", This, debugstr_w(pwszDeviceName), ppBuffer); + return E_NOTIMPL; +} + +static HRESULT WINAPI stillimagew_CreateDevice(IStillImageW *iface, LPWSTR pwszDeviceName, DWORD dwMode, + PSTIDEVICEW *pDevice, LPUNKNOWN pUnkOuter) +{ + stillimage *This = impl_from_StillImageW(iface); + FIXME("(%p, %s, %u, %p, %p): stub\n", This, debugstr_w(pwszDeviceName), dwMode, pDevice, pUnkOuter); + return E_NOTIMPL; +} + +static HRESULT WINAPI stillimagew_GetDeviceValue(IStillImageW *iface, LPWSTR pwszDeviceName, LPWSTR pValueName, + LPDWORD pType, LPBYTE pData, LPDWORD cbData) +{ + stillimage *This = impl_from_StillImageW(iface); + FIXME("(%p, %s, %s, %p, %p, %p): stub\n", This, debugstr_w(pwszDeviceName), debugstr_w(pValueName), + pType, pData, cbData); + return E_NOTIMPL; +} + +static HRESULT WINAPI stillimagew_SetDeviceValue(IStillImageW *iface, LPWSTR pwszDeviceName, LPWSTR pValueName, + DWORD type, LPBYTE pData, DWORD cbData) +{ + stillimage *This = impl_from_StillImageW(iface); + FIXME("(%p, %s, %s, %u, %p, %u): stub\n", This, debugstr_w(pwszDeviceName), debugstr_w(pValueName), + type, pData, cbData); + return E_NOTIMPL; +} + +static HRESULT WINAPI stillimagew_GetSTILaunchInformation(IStillImageW *iface, LPWSTR pwszDeviceName, + DWORD *pdwEventCode, LPWSTR pwszEventName) +{ + stillimage *This = impl_from_StillImageW(iface); + FIXME("(%p, %p, %p, %p): stub\n", This, pwszDeviceName, + pdwEventCode, pwszEventName); + return E_NOTIMPL; +} + +static HRESULT WINAPI stillimagew_RegisterLaunchApplication(IStillImageW *iface, LPWSTR pwszAppName, + LPWSTR pwszCommandLine) +{ + static const WCHAR format[] = {'%','s',' ','%','s',0}; + static const WCHAR commandLineSuffix[] = { + '/','S','t','i','D','e','v','i','c','e',':','%','1',' ', + '/','S','t','i','E','v','e','n','t',':','%','2',0}; + HKEY registeredAppsKey = NULL; + DWORD ret; + HRESULT hr = S_OK; + stillimage *This = impl_from_StillImageW(iface); + + TRACE("(%p, %s, %s)\n", This, debugstr_w(pwszAppName), debugstr_w(pwszCommandLine)); + + ret = RegCreateKeyW(HKEY_LOCAL_MACHINE, registeredAppsLaunchPath, ®isteredAppsKey); + if (ret == ERROR_SUCCESS) + { + WCHAR *value = HeapAlloc(GetProcessHeap(), 0, + (lstrlenW(pwszCommandLine) + 1 + lstrlenW(commandLineSuffix) + 1) * sizeof(WCHAR)); + if (value) + { + sprintfW(value, format, pwszCommandLine, commandLineSuffix); + ret = RegSetValueExW(registeredAppsKey, pwszAppName, 0, + REG_SZ, (BYTE*)value, (lstrlenW(value)+1)*sizeof(WCHAR)); + if (ret != ERROR_SUCCESS) + hr = HRESULT_FROM_WIN32(ret); + HeapFree(GetProcessHeap(), 0, value); + } + else + hr = E_OUTOFMEMORY; + RegCloseKey(registeredAppsKey); + } + else + hr = HRESULT_FROM_WIN32(ret); + return hr; +} + +static HRESULT WINAPI stillimagew_UnregisterLaunchApplication(IStillImageW *iface, LPWSTR pwszAppName) +{ + stillimage *This = impl_from_StillImageW(iface); + HKEY registeredAppsKey = NULL; + DWORD ret; + HRESULT hr = S_OK; + + TRACE("(%p, %s)\n", This, debugstr_w(pwszAppName)); + + ret = RegCreateKeyW(HKEY_LOCAL_MACHINE, registeredAppsLaunchPath, ®isteredAppsKey); + if (ret == ERROR_SUCCESS) + { + ret = RegDeleteValueW(registeredAppsKey, pwszAppName); + if (ret != ERROR_SUCCESS) + hr = HRESULT_FROM_WIN32(ret); + RegCloseKey(registeredAppsKey); + } + else + hr = HRESULT_FROM_WIN32(ret); + return hr; +} + +static HRESULT WINAPI stillimagew_EnableHwNotifications(IStillImageW *iface, LPCWSTR pwszDeviceName, + BOOL bNewState) +{ + stillimage *This = impl_from_StillImageW(iface); + FIXME("(%p, %s, %u): stub\n", This, debugstr_w(pwszDeviceName), bNewState); + return E_NOTIMPL; +} + +static HRESULT WINAPI stillimagew_GetHwNotificationState(IStillImageW *iface, LPCWSTR pwszDeviceName, + BOOL *pbCurrentState) +{ + stillimage *This = impl_from_StillImageW(iface); + FIXME("(%p, %s, %p): stub\n", This, debugstr_w(pwszDeviceName), pbCurrentState); + return E_NOTIMPL; +} + +static HRESULT WINAPI stillimagew_RefreshDeviceBus(IStillImageW *iface, LPCWSTR pwszDeviceName) +{ + stillimage *This = impl_from_StillImageW(iface); + FIXME("(%p, %s): stub\n", This, debugstr_w(pwszDeviceName)); + return E_NOTIMPL; +} + +static HRESULT WINAPI stillimagew_LaunchApplicationForDevice(IStillImageW *iface, LPWSTR pwszDeviceName, + LPWSTR pwszAppName, LPSTINOTIFY pStiNotify) +{ + stillimage *This = impl_from_StillImageW(iface); + FIXME("(%p, %s, %s, %p): stub\n", This, debugstr_w(pwszDeviceName), debugstr_w(pwszAppName), + pStiNotify); + return E_NOTIMPL; +} + +static HRESULT WINAPI stillimagew_SetupDeviceParameters(IStillImageW *iface, PSTI_DEVICE_INFORMATIONW pDevInfo) +{ + stillimage *This = impl_from_StillImageW(iface); + FIXME("(%p, %p): stub\n", This, pDevInfo); + return E_NOTIMPL; +} + +static HRESULT WINAPI stillimagew_WriteToErrorLog(IStillImageW *iface, DWORD dwMessageType, LPCWSTR pszMessage) +{ + stillimage *This = impl_from_StillImageW(iface); + FIXME("(%p, %u, %s): stub\n", This, dwMessageType, debugstr_w(pszMessage)); + return E_NOTIMPL; +} + +static const struct IStillImageWVtbl stillimagew_vtbl = +{ + stillimagew_QueryInterface, + stillimagew_AddRef, + stillimagew_Release, + stillimagew_Initialize, + stillimagew_GetDeviceList, + stillimagew_GetDeviceInfo, + stillimagew_CreateDevice, + stillimagew_GetDeviceValue, + stillimagew_SetDeviceValue, + stillimagew_GetSTILaunchInformation, + stillimagew_RegisterLaunchApplication, + stillimagew_UnregisterLaunchApplication, + stillimagew_EnableHwNotifications, + stillimagew_GetHwNotificationState, + stillimagew_RefreshDeviceBus, + stillimagew_LaunchApplicationForDevice, + stillimagew_SetupDeviceParameters, + stillimagew_WriteToErrorLog +}; + +static inline stillimage *impl_from_InternalUnknown(IUnknown *iface) +{ + return (stillimage *)((char*)iface - FIELD_OFFSET(stillimage, lpInternalUnkVtbl)); +} + +static HRESULT WINAPI Internal_QueryInterface(IUnknown *iface, REFIID riid, void **ppvObject) +{ + stillimage *This = impl_from_InternalUnknown(iface); + + TRACE("(%p %s %p)\n", This, debugstr_guid(riid), ppvObject); + + if (IsEqualGUID(riid, &IID_IUnknown)) + *ppvObject = iface; + else if (IsEqualGUID(riid, &IID_IStillImageW)) + *ppvObject = &This->lpVtbl; + else + { + if (IsEqualGUID(riid, &IID_IStillImageA)) + FIXME("interface IStillImageA is unsupported on Windows Vista too, please report if it's needed\n"); + else + FIXME("interface %s not implemented\n", debugstr_guid(riid)); + *ppvObject = NULL; + return E_NOINTERFACE; + } + + IUnknown_AddRef((IUnknown*) *ppvObject); + return S_OK; +} + +static ULONG WINAPI Internal_AddRef(IUnknown *iface) +{ + stillimage *This = impl_from_InternalUnknown(iface); + return InterlockedIncrement(&This->ref); +} + +static ULONG WINAPI Internal_Release(IUnknown *iface) +{ + ULONG ref; + stillimage *This = impl_from_InternalUnknown(iface); + + ref = InterlockedDecrement(&This->ref); + if (ref == 0) + HeapFree(GetProcessHeap(), 0, This); + return ref; +} + +static const struct IUnknownVtbl internal_unk_vtbl = +{ + Internal_QueryInterface, + Internal_AddRef, + Internal_Release +}; + +/****************************************************************************** + * StiCreateInstanceA (STI.@) + */ +HRESULT WINAPI StiCreateInstanceA(HINSTANCE hinst, DWORD dwVer, PSTIA *ppSti, LPUNKNOWN pUnkOuter) +{ + FIXME("(%p, %u, %p, %p): stub, unimplemented on Windows Vista too, please report if it's needed\n", hinst, dwVer, ppSti, pUnkOuter); + return STG_E_UNIMPLEMENTEDFUNCTION; +} + +/****************************************************************************** + * StiCreateInstanceW (STI.@) + */ +HRESULT WINAPI StiCreateInstanceW(HINSTANCE hinst, DWORD dwVer, PSTIW *ppSti, LPUNKNOWN pUnkOuter) +{ + stillimage *This; + HRESULT hr; + + TRACE("(%p, %u, %p, %p)\n", hinst, dwVer, ppSti, pUnkOuter); + + This = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(stillimage)); + if (This) + { + This->lpVtbl = &stillimagew_vtbl; + This->lpInternalUnkVtbl = &internal_unk_vtbl; + if (pUnkOuter) + This->pUnkOuter = pUnkOuter; + else + This->pUnkOuter = (IUnknown*) &This->lpInternalUnkVtbl; + This->ref = 1; + + hr = IStillImage_Initialize((IStillImageW*) &This->lpVtbl, hinst, dwVer); + if (SUCCEEDED(hr)) + { + if (pUnkOuter) + *ppSti = (IStillImageW*) &This->lpInternalUnkVtbl; + else + *ppSti = (IStillImageW*) &This->lpVtbl; + } + } + else + hr = E_OUTOFMEMORY; + + return hr; +} diff --git a/reactos/dll/win32/sti/sti.rbuild b/reactos/dll/win32/sti/sti.rbuild index 592c5f123af..edce67acab8 100644 --- a/reactos/dll/win32/sti/sti.rbuild +++ b/reactos/dll/win32/sti/sti.rbuild @@ -8,11 +8,29 @@ include/reactos/wine 0x600 + STI_ + + + regsvr.c + sti.c sti_main.c + sti_wia.idl wine - advapi32 + sti_proxy ole32 + oleaut32 + rpcrt4 + advapi32 + pseh + uuid ntdll + + + STI_ + + + sti_wia.idl + diff --git a/reactos/dll/win32/sti/sti.spec b/reactos/dll/win32/sti/sti.spec index 186f382f195..300e7fac4b7 100644 --- a/reactos/dll/win32/sti/sti.spec +++ b/reactos/dll/win32/sti/sti.spec @@ -1,7 +1,7 @@ -@ stub DllCanUnloadNow -@ stub DllGetClassObject +@ stdcall -private DllCanUnloadNow() +@ stdcall -private DllGetClassObject(ptr ptr ptr) @ stdcall -private DllRegisterServer() @ stdcall -private DllUnregisterServer() -@ stdcall StiCreateInstance(ptr long ptr ptr) +@ stdcall StiCreateInstance(ptr long ptr ptr) StiCreateInstanceW @ stdcall StiCreateInstanceA(ptr long ptr ptr) @ stdcall StiCreateInstanceW(ptr long ptr ptr) diff --git a/reactos/dll/win32/sti/sti_main.c b/reactos/dll/win32/sti/sti_main.c index 1d4e6ad0408..711c17f14eb 100644 --- a/reactos/dll/win32/sti/sti_main.c +++ b/reactos/dll/win32/sti/sti_main.c @@ -1,5 +1,6 @@ /* * Copyright (C) 2002 Aric Stewart for CodeWeavers + * Copyright (C) 2009 Damjan Jovanovic * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -18,31 +19,148 @@ #include +#define COBJMACROS + #include "windef.h" #include "winbase.h" #include "winreg.h" #include "winerror.h" +#include "objbase.h" +#include "sti.h" -/****************************************************************************** - * StiCreateInstance (STI.@) - */ -HRESULT WINAPI StiCreateInstance( HINSTANCE a, DWORD b, LPVOID c, LPVOID d) +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(sti); + +extern HRESULT WINAPI STI_DllGetClassObject(REFCLSID, REFIID, LPVOID *) DECLSPEC_HIDDEN; +extern BOOL WINAPI STI_DllMain(HINSTANCE, DWORD, LPVOID) DECLSPEC_HIDDEN; + +typedef HRESULT (*fnCreateInstance)(REFIID riid, IUnknown *pUnkOuter, LPVOID *ppObj); + +typedef struct { - return STG_E_UNIMPLEMENTEDFUNCTION; + const struct IClassFactoryVtbl *vtbl; + fnCreateInstance pfnCreateInstance; +} sti_cf; + +static inline sti_cf *impl_from_IClassFactory( IClassFactory *iface ) +{ + return (sti_cf *)((char *)iface - FIELD_OFFSET( sti_cf, vtbl )); +} + +static HRESULT sti_create( REFIID riid, IUnknown *pUnkOuter, LPVOID *ppObj ) +{ + if (pUnkOuter != NULL && !IsEqualIID(riid, &IID_IUnknown)) + return CLASS_E_NOAGGREGATION; + + if (IsEqualGUID(riid, &IID_IUnknown)) + return StiCreateInstanceW(GetCurrentProcess(), STI_VERSION_REAL | STI_VERSION_FLAG_UNICODE, (PSTIW*) ppObj, pUnkOuter); + else if (IsEqualGUID(riid, &IID_IStillImageW)) + return StiCreateInstanceW(GetCurrentProcess(), STI_VERSION_REAL | STI_VERSION_FLAG_UNICODE, (PSTIW*) ppObj, NULL); + else if (IsEqualGUID(riid, &IID_IStillImageA)) + return StiCreateInstanceA(GetCurrentProcess(), STI_VERSION_REAL, (PSTIA*) ppObj, NULL); + else + { + FIXME("no interface %s\n", debugstr_guid(riid)); + return E_NOINTERFACE; + } +} + +static HRESULT WINAPI sti_cf_QueryInterface( IClassFactory *iface, REFIID riid, LPVOID *ppobj ) +{ + if (IsEqualGUID(riid, &IID_IUnknown) || + IsEqualGUID(riid, &IID_IClassFactory)) + { + IClassFactory_AddRef( iface ); + *ppobj = iface; + return S_OK; + } + FIXME("interface %s not implemented\n", debugstr_guid(riid)); + return E_NOINTERFACE; +} + +static ULONG WINAPI sti_cf_AddRef( IClassFactory *iface ) +{ + return 2; +} + +static ULONG WINAPI sti_cf_Release( IClassFactory *iface ) +{ + return 1; +} + +static HRESULT WINAPI sti_cf_CreateInstance( IClassFactory *iface, LPUNKNOWN pOuter, + REFIID riid, LPVOID *ppobj ) +{ + sti_cf *This = impl_from_IClassFactory( iface ); + HRESULT r; + IUnknown *punk; + + TRACE("%p %s %p\n", pOuter, debugstr_guid(riid), ppobj); + + *ppobj = NULL; + + r = This->pfnCreateInstance( riid, pOuter, (LPVOID *)&punk ); + if (FAILED(r)) + return r; + + r = IUnknown_QueryInterface( punk, riid, ppobj ); + if (FAILED(r)) + return r; + + IUnknown_Release( punk ); + return r; +} + +static HRESULT WINAPI sti_cf_LockServer( IClassFactory *iface, BOOL dolock ) +{ + FIXME("(%p)->(%d)\n", iface, dolock); + return S_OK; +} + +static const struct IClassFactoryVtbl sti_cf_vtbl = +{ + sti_cf_QueryInterface, + sti_cf_AddRef, + sti_cf_Release, + sti_cf_CreateInstance, + sti_cf_LockServer +}; + +static sti_cf the_sti_cf = { &sti_cf_vtbl, sti_create }; + +BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpvReserved) +{ + TRACE("(0x%p, %d, %p)\n",hInstDLL,fdwReason,lpvReserved); + + if (fdwReason == DLL_WINE_PREATTACH) + return FALSE; + return STI_DllMain(hInstDLL, fdwReason, lpvReserved); } /****************************************************************************** - * StiCreateInstanceA (STI.@) + * DllGetClassObject (STI.@) */ -HRESULT WINAPI StiCreateInstanceA( HINSTANCE a, DWORD b, LPVOID c, LPVOID d) +HRESULT WINAPI DllGetClassObject( REFCLSID rclsid, REFIID iid, LPVOID *ppv ) { - return STG_E_UNIMPLEMENTEDFUNCTION; + IClassFactory *cf = NULL; + + TRACE("%s %s %p\n", debugstr_guid(rclsid), debugstr_guid(iid), ppv); + + if (IsEqualGUID( rclsid, &CLSID_Sti )) + { + cf = (IClassFactory *)&the_sti_cf.vtbl; + } + + if (cf) + return IClassFactory_QueryInterface( cf, iid, ppv ); + return STI_DllGetClassObject( rclsid, iid, ppv ); } /****************************************************************************** - * StiCreateInstanceW (STI.@) + * DllCanUnloadNow (STI.@) */ -HRESULT WINAPI StiCreateInstanceW( HINSTANCE a, DWORD b, LPVOID c, LPVOID d) +HRESULT WINAPI DllCanUnloadNow( void ) { - return STG_E_UNIMPLEMENTEDFUNCTION; + return S_FALSE; } diff --git a/reactos/dll/win32/sti/sti_private.h b/reactos/dll/win32/sti/sti_private.h new file mode 100644 index 00000000000..b5e106b60b6 --- /dev/null +++ b/reactos/dll/win32/sti/sti_private.h @@ -0,0 +1,32 @@ +/* + * STI private definitions + * + * Copyright 2009 Damjan Jovanovic + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#ifndef __STI_PRIVATE__ +#define __STI_PRIVATE__ + +typedef struct _stillimage +{ + const struct IStillImageWVtbl *lpVtbl; + const struct IUnknownVtbl *lpInternalUnkVtbl; + IUnknown *pUnkOuter; + LONG ref; +} stillimage; + +#endif /* __STI_PRIVATE__ */ diff --git a/reactos/dll/win32/sti/sti_wia.idl b/reactos/dll/win32/sti/sti_wia.idl new file mode 100644 index 00000000000..aaac943445f --- /dev/null +++ b/reactos/dll/win32/sti/sti_wia.idl @@ -0,0 +1,19 @@ +/* + * Copyright 2009 Damjan Jovanovic + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "wia_lh.idl" diff --git a/reactos/dll/win32/urlmon/bindprot.c b/reactos/dll/win32/urlmon/bindprot.c index 07d6fc2f525..29b8532b13d 100644 --- a/reactos/dll/win32/urlmon/bindprot.c +++ b/reactos/dll/win32/urlmon/bindprot.c @@ -155,7 +155,7 @@ HWND get_notif_hwnd(void) NULL }; - wndclass.hInstance = URLMON_hInstance; + wndclass.hInstance = hProxyDll; wnd_class = RegisterClassExW(&wndclass); if (!wnd_class && GetLastError() == ERROR_CLASS_ALREADY_EXISTS) @@ -164,7 +164,7 @@ HWND get_notif_hwnd(void) tls_data->notif_hwnd = CreateWindowExW(0, wszURLMonikerNotificationWindow, wszURLMonikerNotificationWindow, 0, 0, 0, 0, 0, HWND_MESSAGE, - NULL, URLMON_hInstance, NULL); + NULL, hProxyDll, NULL); if(tls_data->notif_hwnd) tls_data->notif_hwnd_cnt++; diff --git a/reactos/dll/win32/urlmon/regsvr.c b/reactos/dll/win32/urlmon/regsvr.c index 9e278259e37..6e417ac9607 100644 --- a/reactos/dll/win32/urlmon/regsvr.c +++ b/reactos/dll/win32/urlmon/regsvr.c @@ -560,7 +560,7 @@ static HRESULT register_inf(BOOL doregister) hAdvpack = LoadLibraryW(wszAdvpack); pRegInstall = (void *)GetProcAddress(hAdvpack, "RegInstall"); - hres = pRegInstall(URLMON_hInstance, doregister ? "RegisterDll" : "UnregisterDll", &strtable); + hres = pRegInstall(hProxyDll, doregister ? "RegisterDll" : "UnregisterDll", &strtable); for(i=0; i < sizeof(pse)/sizeof(pse[0]); i++) heap_free(pse[i].pszValue); diff --git a/reactos/dll/win32/urlmon/urlmon_main.c b/reactos/dll/win32/urlmon/urlmon_main.c index 272884eb2a6..edaad42289f 100644 --- a/reactos/dll/win32/urlmon/urlmon_main.c +++ b/reactos/dll/win32/urlmon/urlmon_main.c @@ -34,7 +34,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(urlmon); LONG URLMON_refCount = 0; -HINSTANCE URLMON_hInstance = 0; static HMODULE hCabinet = NULL; static DWORD urlmon_tls = TLS_OUT_OF_INDEXES; @@ -144,9 +143,10 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID fImpLoad) { TRACE("%p 0x%x %p\n", hinstDLL, fdwReason, fImpLoad); + URLMON_DllMain( hinstDLL, fdwReason, fImpLoad ); + switch(fdwReason) { case DLL_PROCESS_ATTACH: - URLMON_hInstance = hinstDLL; init_session(TRUE); break; diff --git a/reactos/dll/win32/urlmon/urlmon_main.h b/reactos/dll/win32/urlmon/urlmon_main.h index 8db786b7d80..071af8dd73e 100644 --- a/reactos/dll/win32/urlmon/urlmon_main.h +++ b/reactos/dll/win32/urlmon/urlmon_main.h @@ -36,7 +36,7 @@ #include "wine/unicode.h" #include "wine/list.h" -extern HINSTANCE URLMON_hInstance; +extern HINSTANCE hProxyDll DECLSPEC_HIDDEN; extern HRESULT SecManagerImpl_Construct(IUnknown *pUnkOuter, LPVOID *ppobj); extern HRESULT ZoneMgrImpl_Construct(IUnknown *pUnkOuter, LPVOID *ppobj); extern HRESULT StdURLMoniker_Construct(IUnknown *pUnkOuter, LPVOID *ppobj); @@ -48,6 +48,7 @@ extern HRESULT GopherProtocol_Construct(IUnknown *pUnkOuter, LPVOID *ppobj); extern HRESULT MkProtocol_Construct(IUnknown *pUnkOuter, LPVOID *ppobj); extern HRESULT MimeFilter_Construct(IUnknown *pUnkOuter, LPVOID *ppobj); +extern BOOL WINAPI URLMON_DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) DECLSPEC_HIDDEN; extern HRESULT WINAPI URLMON_DllGetClassObject(REFCLSID rclsid, REFIID iid,LPVOID *ppv) DECLSPEC_HIDDEN; extern HRESULT WINAPI URLMON_DllRegisterServer(void) DECLSPEC_HIDDEN; extern HRESULT WINAPI URLMON_DllUnregisterServer(void) DECLSPEC_HIDDEN; diff --git a/reactos/dll/win32/urlmon/urlmon_urlmon.idl b/reactos/dll/win32/urlmon/urlmon_urlmon.idl index 71a0719d7d9..d45ba07e456 100644 --- a/reactos/dll/win32/urlmon/urlmon_urlmon.idl +++ b/reactos/dll/win32/urlmon/urlmon_urlmon.idl @@ -1,5 +1,5 @@ /* - * Copyright 2009 Piotr Caban for Codeweavers + * Copyright 2009 Piotr Caban for CodeWeavers * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/reactos/dll/win32/urlmon/usrmarshal.c b/reactos/dll/win32/urlmon/usrmarshal.c index b94556362be..6ff8f04ef26 100644 --- a/reactos/dll/win32/urlmon/usrmarshal.c +++ b/reactos/dll/win32/urlmon/usrmarshal.c @@ -1,5 +1,5 @@ /* - * Copyright 2009 Piotr Caban for Codeweavers + * Copyright 2009 Piotr Caban for CodeWeavers * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/reactos/dll/win32/usp10/bidi.c b/reactos/dll/win32/usp10/bidi.c new file mode 100644 index 00000000000..28b5d3e76ce --- /dev/null +++ b/reactos/dll/win32/usp10/bidi.c @@ -0,0 +1,893 @@ +/* + * Uniscribe BiDirectional handling + * + * Copyright 2003 Shachar Shemesh + * Copyright 2007 Maarten Lankhorst + * Copyright 2010 CodeWeavers, Aric Stewart + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + * + * Code derived from the modified reference implementation + * that was found in revision 17 of http://unicode.org/reports/tr9/ + * "Unicode Standard Annex #9: THE BIDIRECTIONAL ALGORITHM" + * + * -- Copyright (C) 1999-2005, ASMUS, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of the Unicode data files and any associated documentation (the + * "Data Files") or Unicode software and any associated documentation (the + * "Software") to deal in the Data Files or Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, and/or sell copies of the Data Files or Software, + * and to permit persons to whom the Data Files or Software are furnished + * to do so, provided that (a) the above copyright notice(s) and this + * permission notice appear with all copies of the Data Files or Software, + * (b) both the above copyright notice(s) and this permission notice appear + * in associated documentation, and (c) there is clear notice in each + * modified Data File or in the Software as well as in the documentation + * associated with the Data File(s) or Software that the data or software + * has been modified. + */ + +#include "config.h" + +#include +#include "windef.h" +#include "winbase.h" +#include "wingdi.h" +#include "winnls.h" +#include "usp10.h" +#include "wine/unicode.h" +#include "wine/debug.h" + +#include "usp10_internal.h" + +WINE_DEFAULT_DEBUG_CHANNEL(bidi); + +#define ASSERT(x) do { if (!(x)) FIXME("assert failed: %s\n", #x); } while(0) +#define MAX_LEVEL 61 + +/* HELPER FUNCTIONS AND DECLARATIONS */ + +/*------------------------------------------------------------------------ + Bidirectional Character Types + + as defined by the Unicode Bidirectional Algorithm Table 3-7. + + Note: + + The list of bidirectional character types here is not grouped the + same way as the table 3-7, since the numberic values for the types + are chosen to keep the state and action tables compact. +------------------------------------------------------------------------*/ +enum directions +{ + /* input types */ + /* ON MUST be zero, code relies on ON = N = 0 */ + ON = 0, /* Other Neutral */ + L, /* Left Letter */ + R, /* Right Letter */ + AN, /* Arabic Number */ + EN, /* European Number */ + AL, /* Arabic Letter (Right-to-left) */ + NSM, /* Non-spacing Mark */ + CS, /* Common Separator */ + ES, /* European Separator */ + ET, /* European Terminator (post/prefix e.g. $ and %) */ + + /* resolved types */ + BN, /* Boundary neutral (type of RLE etc after explicit levels) */ + + /* input types, */ + S, /* Segment Separator (TAB) // used only in L1 */ + WS, /* White space // used only in L1 */ + B, /* Paragraph Separator (aka as PS) */ + + /* types for explicit controls */ + RLO, /* these are used only in X1-X9 */ + RLE, + LRO, + LRE, + PDF, + + /* resolved types, also resolved directions */ + N = ON, /* alias, where ON, WS and S are treated the same */ +}; + +/* HELPER FUNCTIONS */ +/* the character type contains the C1_* flags in the low 12 bits */ +/* and the C2_* type in the high 4 bits */ +static __inline unsigned short get_char_typeW( WCHAR ch ) +{ + WORD CharType; + GetStringTypeW(CT_CTYPE1, &ch, 1, &CharType); + return CharType; +} + +/* Convert the libwine information to the direction enum */ +static void classify(LPCWSTR lpString, WORD *chartype, DWORD uCount, const SCRIPT_CONTROL *c) +{ + static const enum directions dir_map[16] = + { + L, /* unassigned defaults to L */ + L, + R, + EN, + ES, + ET, + AN, + CS, + B, + S, + WS, + ON, + AL, + NSM, + BN, + PDF /* also LRE, LRO, RLE, RLO */ + }; + + unsigned i; + + for (i = 0; i < uCount; ++i) + { + chartype[i] = dir_map[get_char_typeW(lpString[i]) >> 12]; + switch (chartype[i]) + { + case ES: + if (!c->fLegacyBidiClass) break; + switch (lpString[i]) + { + case '-': + case '+': chartype[i] = N; break; + case '/': chartype[i] = CS; break; + } + break; + case PDF: + switch (lpString[i]) + { + case 0x202A: chartype[i] = LRE; break; + case 0x202B: chartype[i] = RLE; break; + case 0x202C: chartype[i] = PDF; break; + case 0x202D: chartype[i] = LRO; break; + case 0x202E: chartype[i] = RLO; break; + } + break; + } + } +} + +/* Set a run of cval values at locations all prior to, but not including */ +/* iStart, to the new value nval. */ +static void SetDeferredRun(WORD *pval, int cval, int iStart, int nval) +{ + int i = iStart - 1; + for (; i >= iStart - cval; i--) + { + pval[i] = nval; + } +} + +/* RESOLVE EXPLICIT */ + +static WORD GreaterEven(int i) +{ + return odd(i) ? i + 1 : i + 2; +} + +static WORD GreaterOdd(int i) +{ + return odd(i) ? i + 2 : i + 1; +} + +static WORD EmbeddingDirection(int level) +{ + return odd(level) ? R : L; +} + +/*------------------------------------------------------------------------ + Function: resolveExplicit + + Recursively resolves explicit embedding levels and overrides. + Implements rules X1-X9, of the Unicode Bidirectional Algorithm. + + Input: Base embedding level and direction + Character count + + Output: Array of embedding levels + + In/Out: Array of direction classes + + + Note: The function uses two simple counters to keep track of + matching explicit codes and PDF. Use the default argument for + the outermost call. The nesting counter counts the recursion + depth and not the embedding level. +------------------------------------------------------------------------*/ + +static int resolveExplicit(int level, int dir, WORD *pcls, WORD *plevel, int cch, int nNest) +{ + /* always called with a valid nesting level + nesting levels are != embedding levels */ + int nLastValid = nNest; + int ich = 0; + + /* check input values */ + ASSERT(nNest >= 0 && level >= 0 && level <= MAX_LEVEL); + + /* process the text */ + for (; ich < cch; ich++) + { + WORD cls = pcls[ich]; + switch (cls) + { + case LRO: + case LRE: + nNest++; + if (GreaterEven(level) <= MAX_LEVEL - (cls == LRO ? 2 : 0)) + { + plevel[ich] = GreaterEven(level); + pcls[ich] = BN; + ich += resolveExplicit(plevel[ich], (cls == LRE ? N : L), + &pcls[ich+1], &plevel[ich+1], + cch - (ich+1), nNest); + nNest--; + continue; + } + cls = pcls[ich] = BN; + break; + + case RLO: + case RLE: + nNest++; + if (GreaterOdd(level) <= MAX_LEVEL - (cls == RLO ? 2 : 0)) + { + plevel[ich] = GreaterOdd(level); + pcls[ich] = BN; + ich += resolveExplicit(plevel[ich], (cls == RLE ? N : R), + &pcls[ich+1], &plevel[ich+1], + cch - (ich+1), nNest); + nNest--; + continue; + } + cls = pcls[ich] = BN; + break; + + case PDF: + cls = pcls[ich] = BN; + if (nNest) + { + if (nLastValid < nNest) + { + nNest--; + } + else + { + cch = ich; /* break the loop, but complete body */ + } + } + } + + /* Apply the override */ + if (dir != N) + { + cls = dir; + } + plevel[ich] = level; + if (pcls[ich] != BN) + pcls[ich] = cls; + } + + return ich; +} + +/* RESOLVE WEAK TYPES */ + +enum states /* possible states */ +{ + xa, /* arabic letter */ + xr, /* right letter */ + xl, /* left letter */ + + ao, /* arabic lett. foll by ON */ + ro, /* right lett. foll by ON */ + lo, /* left lett. foll by ON */ + + rt, /* ET following R */ + lt, /* ET following L */ + + cn, /* EN, AN following AL */ + ra, /* arabic number foll R */ + re, /* european number foll R */ + la, /* arabic number foll L */ + le, /* european number foll L */ + + ac, /* CS following cn */ + rc, /* CS following ra */ + rs, /* CS,ES following re */ + lc, /* CS following la */ + ls, /* CS,ES following le */ + + ret, /* ET following re */ + let, /* ET following le */ +} ; + +static const int stateWeak[][10] = +{ + /* N, L, R, AN, EN, AL,NSM, CS, ES, ET */ +/*xa*/ { ao, xl, xr, cn, cn, xa, xa, ao, ao, ao }, /* arabic letter */ +/*xr*/ { ro, xl, xr, ra, re, xa, xr, ro, ro, rt }, /* right letter */ +/*xl*/ { lo, xl, xr, la, le, xa, xl, lo, lo, lt }, /* left letter */ + +/*ao*/ { ao, xl, xr, cn, cn, xa, ao, ao, ao, ao }, /* arabic lett. foll by ON*/ +/*ro*/ { ro, xl, xr, ra, re, xa, ro, ro, ro, rt }, /* right lett. foll by ON */ +/*lo*/ { lo, xl, xr, la, le, xa, lo, lo, lo, lt }, /* left lett. foll by ON */ + +/*rt*/ { ro, xl, xr, ra, re, xa, rt, ro, ro, rt }, /* ET following R */ +/*lt*/ { lo, xl, xr, la, le, xa, lt, lo, lo, lt }, /* ET following L */ + +/*cn*/ { ao, xl, xr, cn, cn, xa, cn, ac, ao, ao }, /* EN, AN following AL */ +/*ra*/ { ro, xl, xr, ra, re, xa, ra, rc, ro, rt }, /* arabic number foll R */ +/*re*/ { ro, xl, xr, ra, re, xa, re, rs, rs,ret }, /* european number foll R */ +/*la*/ { lo, xl, xr, la, le, xa, la, lc, lo, lt }, /* arabic number foll L */ +/*le*/ { lo, xl, xr, la, le, xa, le, ls, ls,let }, /* european number foll L */ + +/*ac*/ { ao, xl, xr, cn, cn, xa, ao, ao, ao, ao }, /* CS following cn */ +/*rc*/ { ro, xl, xr, ra, re, xa, ro, ro, ro, rt }, /* CS following ra */ +/*rs*/ { ro, xl, xr, ra, re, xa, ro, ro, ro, rt }, /* CS,ES following re */ +/*lc*/ { lo, xl, xr, la, le, xa, lo, lo, lo, lt }, /* CS following la */ +/*ls*/ { lo, xl, xr, la, le, xa, lo, lo, lo, lt }, /* CS,ES following le */ + +/*ret*/{ ro, xl, xr, ra, re, xa,ret, ro, ro,ret }, /* ET following re */ +/*let*/{ lo, xl, xr, la, le, xa,let, lo, lo,let }, /* ET following le */ +}; + +enum actions /* possible actions */ +{ + /* primitives */ + IX = 0x100, /* increment */ + XX = 0xF, /* no-op */ + + /* actions */ + xxx = (XX << 4) + XX, /* no-op */ + xIx = IX + xxx, /* increment run */ + xxN = (XX << 4) + ON, /* set current to N */ + xxE = (XX << 4) + EN, /* set current to EN */ + xxA = (XX << 4) + AN, /* set current to AN */ + xxR = (XX << 4) + R, /* set current to R */ + xxL = (XX << 4) + L, /* set current to L */ + Nxx = (ON << 4) + 0xF, /* set run to neutral */ + Axx = (AN << 4) + 0xF, /* set run to AN */ + ExE = (EN << 4) + EN, /* set run to EN, set current to EN */ + NIx = (ON << 4) + 0xF + IX, /* set run to N, increment */ + NxN = (ON << 4) + ON, /* set run to N, set current to N */ + NxR = (ON << 4) + R, /* set run to N, set current to R */ + NxE = (ON << 4) + EN, /* set run to N, set current to EN */ + + AxA = (AN << 4) + AN, /* set run to AN, set current to AN */ + NxL = (ON << 4) + L, /* set run to N, set current to L */ + LxL = (L << 4) + L, /* set run to L, set current to L */ +} ; + +static const int actionWeak[][10] = +{ + /* N, L, R, AN, EN, AL, NSM, CS, ES, ET */ +/*xa*/ { xxx, xxx, xxx, xxx, xxA, xxR, xxR, xxN, xxN, xxN }, /* arabic letter */ +/*xr*/ { xxx, xxx, xxx, xxx, xxE, xxR, xxR, xxN, xxN, xIx }, /* right letter */ +/*xl*/ { xxx, xxx, xxx, xxx, xxL, xxR, xxL, xxN, xxN, xIx }, /* left letter */ + +/*ao*/ { xxx, xxx, xxx, xxx, xxA, xxR, xxN, xxN, xxN, xxN }, /* arabic lett. foll by ON */ +/*ro*/ { xxx, xxx, xxx, xxx, xxE, xxR, xxN, xxN, xxN, xIx }, /* right lett. foll by ON */ +/*lo*/ { xxx, xxx, xxx, xxx, xxL, xxR, xxN, xxN, xxN, xIx }, /* left lett. foll by ON */ + +/*rt*/ { Nxx, Nxx, Nxx, Nxx, ExE, NxR, xIx, NxN, NxN, xIx }, /* ET following R */ +/*lt*/ { Nxx, Nxx, Nxx, Nxx, LxL, NxR, xIx, NxN, NxN, xIx }, /* ET following L */ + +/*cn*/ { xxx, xxx, xxx, xxx, xxA, xxR, xxA, xIx, xxN, xxN }, /* EN, AN following AL */ +/*ra*/ { xxx, xxx, xxx, xxx, xxE, xxR, xxA, xIx, xxN, xIx }, /* arabic number foll R */ +/*re*/ { xxx, xxx, xxx, xxx, xxE, xxR, xxE, xIx, xIx, xxE }, /* european number foll R */ +/*la*/ { xxx, xxx, xxx, xxx, xxL, xxR, xxA, xIx, xxN, xIx }, /* arabic number foll L */ +/*le*/ { xxx, xxx, xxx, xxx, xxL, xxR, xxL, xIx, xIx, xxL }, /* european number foll L */ + +/*ac*/ { Nxx, Nxx, Nxx, Axx, AxA, NxR, NxN, NxN, NxN, NxN }, /* CS following cn */ +/*rc*/ { Nxx, Nxx, Nxx, Axx, NxE, NxR, NxN, NxN, NxN, NIx }, /* CS following ra */ +/*rs*/ { Nxx, Nxx, Nxx, Nxx, ExE, NxR, NxN, NxN, NxN, NIx }, /* CS,ES following re */ +/*lc*/ { Nxx, Nxx, Nxx, Axx, NxL, NxR, NxN, NxN, NxN, NIx }, /* CS following la */ +/*ls*/ { Nxx, Nxx, Nxx, Nxx, LxL, NxR, NxN, NxN, NxN, NIx }, /* CS,ES following le */ + +/*ret*/{ xxx, xxx, xxx, xxx, xxE, xxR, xxE, xxN, xxN, xxE }, /* ET following re */ +/*let*/{ xxx, xxx, xxx, xxx, xxL, xxR, xxL, xxN, xxN, xxL }, /* ET following le */ +}; + +static int GetDeferredType(int action) +{ + return (action >> 4) & 0xF; +} + +static int GetResolvedType(int action) +{ + return action & 0xF; +} + +/* Note on action table: + + States can be of two kinds: + - Immediate Resolution State, where each input token + is resolved as soon as it is seen. These states have + only single action codes (xxN) or the no-op (xxx) + for static input tokens. + - Deferred Resolution State, where input tokens either + either extend the run (xIx) or resolve its Type (e.g. Nxx). + + Input classes are of three kinds + - Static Input Token, where the class of the token remains + unchanged on output (AN, L, N, R) + - Replaced Input Token, where the class of the token is + always replaced on output (AL, BN, NSM, CS, ES, ET) + - Conditional Input Token, where the class of the token is + changed on output in some, but not all, cases (EN) + + Where tokens are subject to change, a double action + (e.g. NxA, or NxN) is _required_ after deferred states, + resolving both the deferred state and changing the current token. +*/ + +/*------------------------------------------------------------------------ + Function: resolveWeak + + Resolves the directionality of numeric and other weak character types + + Implements rules X10 and W1-W6 of the Unicode Bidirectional Algorithm. + + Input: Array of embedding levels + Character count + + In/Out: Array of directional classes + + Note: On input only these directional classes are expected + AL, HL, R, L, ON, BN, NSM, AN, EN, ES, ET, CS, +------------------------------------------------------------------------*/ +static void resolveWeak(int baselevel, WORD *pcls, WORD *plevel, int cch) +{ + int state = odd(baselevel) ? xr : xl; + int cls; + + int level = baselevel; + int action, clsRun, clsNew; + int cchRun = 0; + int ich = 0; + + for (; ich < cch; ich++) + { + /* ignore boundary neutrals */ + if (pcls[ich] == BN) + { + /* must flatten levels unless at a level change; */ + plevel[ich] = level; + + /* lookahead for level changes */ + if (ich + 1 == cch && level != baselevel) + { + /* have to fixup last BN before end of the loop, since + * its fix-upped value will be needed below the assert */ + pcls[ich] = EmbeddingDirection(level); + } + else if (ich + 1 < cch && level != plevel[ich+1] && pcls[ich+1] != BN) + { + /* fixup LAST BN in front / after a level run to make + * it act like the SOR/EOR in rule X10 */ + int newlevel = plevel[ich+1]; + if (level > newlevel) { + newlevel = level; + } + plevel[ich] = newlevel; + + /* must match assigned level */ + pcls[ich] = EmbeddingDirection(newlevel); + level = plevel[ich+1]; + } + else + { + /* don't interrupt runs */ + if (cchRun) + { + cchRun++; + } + continue; + } + } + + ASSERT(pcls[ich] <= BN); + cls = pcls[ich]; + + action = actionWeak[state][cls]; + + /* resolve the directionality for deferred runs */ + clsRun = GetDeferredType(action); + if (clsRun != XX) + { + SetDeferredRun(pcls, cchRun, ich, clsRun); + cchRun = 0; + } + + /* resolve the directionality class at the current location */ + clsNew = GetResolvedType(action); + if (clsNew != XX) + pcls[ich] = clsNew; + + /* increment a deferred run */ + if (IX & action) + cchRun++; + + state = stateWeak[state][cls]; + } + + /* resolve any deferred runs + * use the direction of the current level to emulate PDF */ + cls = EmbeddingDirection(level); + + /* resolve the directionality for deferred runs */ + clsRun = GetDeferredType(actionWeak[state][cls]); + if (clsRun != XX) + SetDeferredRun(pcls, cchRun, ich, clsRun); +} + +/* RESOLVE NEUTRAL TYPES */ + +/* action values */ +enum neutralactions +{ + /* action to resolve previous input */ + nL = L, /* resolve EN to L */ + En = 3 << 4, /* resolve neutrals run to embedding level direction */ + Rn = R << 4, /* resolve neutrals run to strong right */ + Ln = L << 4, /* resolved neutrals run to strong left */ + In = (1<<8), /* increment count of deferred neutrals */ + LnL = (1<<4)+L, /* set run and EN to L */ +}; + +static int GetDeferredNeutrals(int action, int level) +{ + action = (action >> 4) & 0xF; + if (action == (En >> 4)) + return EmbeddingDirection(level); + else + return action; +} + +static int GetResolvedNeutrals(int action) +{ + action = action & 0xF; + if (action == In) + return 0; + else + return action; +} + +/* state values */ +enum resolvestates +{ + /* new temporary class */ + r, /* R and characters resolved to R */ + l, /* L and characters resolved to L */ + rn, /* N preceded by right */ + ln, /* N preceded by left */ + a, /* AN preceded by left (the abbreviation 'la' is used up above) */ + na, /* N preceded by a */ +} ; + + +/*------------------------------------------------------------------------ + Notes: + + By rule W7, whenever a EN is 'dominated' by an L (including start of + run with embedding direction = L) it is resolved to, and further treated + as L. + + This leads to the need for 'a' and 'na' states. +------------------------------------------------------------------------*/ + +static const int actionNeutrals[][5] = +{ +/* N, L, R, AN, EN = cls */ + { In, 0, 0, 0, 0 }, /* r right */ + { In, 0, 0, 0, L }, /* l left */ + + { In, En, Rn, Rn, Rn }, /* rn N preceded by right */ + { In, Ln, En, En, LnL}, /* ln N preceded by left */ + + { In, 0, 0, 0, L }, /* a AN preceded by left */ + { In, En, Rn, Rn, En }, /* na N preceded by a */ +} ; + +static const int stateNeutrals[][5] = +{ +/* N, L, R, AN, EN */ + { rn, l, r, r, r }, /* r right */ + { ln, l, r, a, l }, /* l left */ + + { rn, l, r, r, r }, /* rn N preceded by right */ + { ln, l, r, a, l }, /* ln N preceded by left */ + + { na, l, r, a, l }, /* a AN preceded by left */ + { na, l, r, a, l }, /* na N preceded by la */ +} ; + +/*------------------------------------------------------------------------ + Function: resolveNeutrals + + Resolves the directionality of neutral character types. + + Implements rules W7, N1 and N2 of the Unicode Bidi Algorithm. + + Input: Array of embedding levels + Character count + Baselevel + + In/Out: Array of directional classes + + Note: On input only these directional classes are expected + R, L, N, AN, EN and BN + + W8 resolves a number of ENs to L +------------------------------------------------------------------------*/ +static void resolveNeutrals(int baselevel, WORD *pcls, const WORD *plevel, int cch) +{ + /* the state at the start of text depends on the base level */ + int state = odd(baselevel) ? r : l; + int cls; + + int cchRun = 0; + int level = baselevel; + + int action, clsRun, clsNew; + int ich = 0; + for (; ich < cch; ich++) + { + /* ignore boundary neutrals */ + if (pcls[ich] == BN) + { + /* include in the count for a deferred run */ + if (cchRun) + cchRun++; + + /* skip any further processing */ + continue; + } + + ASSERT(pcls[ich] < 5); /* "Only N, L, R, AN, EN are allowed" */ + cls = pcls[ich]; + + action = actionNeutrals[state][cls]; + + /* resolve the directionality for deferred runs */ + clsRun = GetDeferredNeutrals(action, level); + if (clsRun != N) + { + SetDeferredRun(pcls, cchRun, ich, clsRun); + cchRun = 0; + } + + /* resolve the directionality class at the current location */ + clsNew = GetResolvedNeutrals(action); + if (clsNew != N) + pcls[ich] = clsNew; + + if (In & action) + cchRun++; + + state = stateNeutrals[state][cls]; + level = plevel[ich]; + } + + /* resolve any deferred runs */ + cls = EmbeddingDirection(level); /* eor has type of current level */ + + /* resolve the directionality for deferred runs */ + clsRun = GetDeferredNeutrals(actionNeutrals[state][cls], level); + if (clsRun != N) + SetDeferredRun(pcls, cchRun, ich, clsRun); +} + +/* RESOLVE IMPLICIT */ + +/*------------------------------------------------------------------------ + Function: resolveImplicit + + Recursively resolves implicit embedding levels. + Implements rules I1 and I2 of the Unicode Bidirectional Algorithm. + + Input: Array of direction classes + Character count + Base level + + In/Out: Array of embedding levels + + Note: levels may exceed 15 on output. + Accepted subset of direction classes + R, L, AN, EN +------------------------------------------------------------------------*/ +static const WORD addLevel[][4] = +{ + /* L, R, AN, EN */ +/* even */ { 0, 1, 2, 2, }, +/* odd */ { 1, 0, 1, 1, } + +}; + +static void resolveImplicit(const WORD * pcls, WORD *plevel, int cch) +{ + int ich = 0; + for (; ich < cch; ich++) + { + /* cannot resolve bn here, since some bn were resolved to strong + * types in resolveWeak. To remove these we need the original + * types, which are available again in resolveWhiteSpace */ + if (pcls[ich] == BN) + { + continue; + } + ASSERT(pcls[ich] > 0); /* "No Neutrals allowed to survive here." */ + ASSERT(pcls[ich] < 5); /* "Out of range." */ + plevel[ich] += addLevel[odd(plevel[ich])][pcls[ich] - 1]; + } +} + +/************************************************************* + * BIDI_DeterminLevels + */ +BOOL BIDI_DetermineLevels( + LPCWSTR lpString, /* [in] The string for which information is to be returned */ + INT uCount, /* [in] Number of WCHARs in string. */ + const SCRIPT_STATE *s, + const SCRIPT_CONTROL *c, + WORD *lpOutLevels /* [out] final string levels */ + ) +{ + WORD *chartype; + unsigned baselevel = 0,j; + TRACE("%s, %d", debugstr_wn(lpString, uCount), uCount); + + chartype = HeapAlloc(GetProcessHeap(), 0, uCount * sizeof(WORD)); + if (!chartype) + { + WARN("Out of memory\n"); + return FALSE; + } + + baselevel = s->uBidiLevel; + + classify(lpString, chartype, uCount, c); + + for (j = 0; j < uCount; ++j) + switch(chartype[j]) + { + case B: + case S: + case WS: + case ON: chartype[j] = N; + default: continue; + } + + /* resolve explicit */ + resolveExplicit(baselevel, N, chartype, lpOutLevels, uCount, 0); + + /* resolve weak */ + resolveWeak(baselevel, chartype, lpOutLevels, uCount); + + /* resolve neutrals */ + resolveNeutrals(baselevel, chartype, lpOutLevels, uCount); + + /* resolveImplicit */ + resolveImplicit(chartype, lpOutLevels, uCount); + + HeapFree(GetProcessHeap(), 0, chartype); + return TRUE; +} + +/* reverse cch indexes */ +static void reverse(int *pidx, int cch) +{ + int temp; + int ich = 0; + for (; ich < --cch; ich++) + { + temp = pidx[ich]; + pidx[ich] = pidx[cch]; + pidx[cch] = temp; + } +} + + +/*------------------------------------------------------------------------ + Functions: reorder/reorderLevel + + Recursively reorders the display string + "From the highest level down, reverse all characters at that level and + higher, down to the lowest odd level" + + Implements rule L2 of the Unicode bidi Algorithm. + + Input: Array of embedding levels + Character count + Flag enabling reversal (set to false by initial caller) + + In/Out: Text to reorder + + Note: levels may exceed 15 resp. 61 on input. + + Rule L3 - reorder combining marks is not implemented here + Rule L4 - glyph mirroring is implemented as a display option below + + Note: this should be applied a line at a time +-------------------------------------------------------------------------*/ +int BIDI_ReorderV2lLevel(int level, int *pIndexs, const BYTE* plevel, int cch, BOOL fReverse) +{ + int ich = 0; + + /* true as soon as first odd level encountered */ + fReverse = fReverse || odd(level); + + for (; ich < cch; ich++) + { + if (plevel[ich] < level) + { + break; + } + else if (plevel[ich] > level) + { + ich += BIDI_ReorderV2lLevel(level + 1, pIndexs + ich, plevel + ich, + cch - ich, fReverse) - 1; + } + } + if (fReverse) + { + reverse(pIndexs, ich); + } + return ich; +} + +/* Applies the reorder in reverse. Taking an already reordered string and returing the original */ +int BIDI_ReorderL2vLevel(int level, int *pIndexs, const BYTE* plevel, int cch, BOOL fReverse) +{ + int ich = 0; + int newlevel = -1; + + /* true as soon as first odd level encountered */ + fReverse = fReverse || odd(level); + + for (; ich < cch; ich++) + { + if (plevel[ich] < level) + break; + else if (plevel[ich] > level) + newlevel = ich; + } + if (fReverse) + { + reverse(pIndexs, ich); + } + + if (newlevel > 1) + { + ich = 0; + for (; ich < cch; ich++) + if (plevel[ich] > level) + ich += BIDI_ReorderL2vLevel(level + 1, pIndexs + ich, plevel + ich, + cch - ich, fReverse) - 1; + } + + return ich; +} diff --git a/reactos/dll/win32/usp10/usp10.c b/reactos/dll/win32/usp10/usp10.c index cdd6d7b2919..85957143557 100644 --- a/reactos/dll/win32/usp10/usp10.c +++ b/reactos/dll/win32/usp10/usp10.c @@ -3,6 +3,7 @@ * * Copyright 2005 Steven Edwards for CodeWeavers * Copyright 2006 Hans Leidekker + * Copyright 2010 CodeWeavers, Aric Stewart * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -32,6 +33,8 @@ #include "winnls.h" #include "usp10.h" +#include "usp10_internal.h" + #include "wine/debug.h" #include "wine/unicode.h" @@ -524,6 +527,7 @@ HRESULT WINAPI ScriptItemize(const WCHAR *pwcInChars, int cInChars, int cMaxItem int cnt = 0, index = 0; int New_Script = SCRIPT_UNDEFINED; + WORD *levels = NULL; TRACE("%s,%d,%d,%p,%p,%p,%p\n", debugstr_wn(pwcInChars, cInChars), cInChars, cMaxItems, psControl, psState, pItems, pcItems); @@ -531,6 +535,24 @@ HRESULT WINAPI ScriptItemize(const WCHAR *pwcInChars, int cInChars, int cMaxItem if (!pwcInChars || !cInChars || !pItems || cMaxItems < 2) return E_INVALIDARG; + if (psState && psControl) + { + int i; + levels = heap_alloc_zero(cInChars * sizeof(WORD)); + if (!levels) + return E_OUTOFMEMORY; + + BIDI_DetermineLevels(pwcInChars, cInChars, psState, psControl, levels); + for (i = 0; i < cInChars; i++) + if (levels[i]!=levels[0]) + break; + if (i >= cInChars) + { + heap_free(levels); + levels = NULL; + } + } + pItems[index].iCharPos = 0; memset(&pItems[index].a, 0, sizeof(SCRIPT_ANALYSIS)); @@ -549,15 +571,29 @@ HRESULT WINAPI ScriptItemize(const WCHAR *pwcInChars, int cInChars, int cMaxItem if (pwcInChars[cnt] >= Latin_start && pwcInChars[cnt] <= Latin_stop) pItems[index].a.eScript = Script_Latin; - if (pItems[index].a.eScript == Script_Arabic) + if (levels) + { + pItems[index].a.fRTL = odd(levels[cnt]); + pItems[index].a.fLayoutRTL = odd(levels[cnt]); + pItems[index].a.s.uBidiLevel = levels[cnt]; + } + else if (pItems[index].a.eScript == Script_Arabic) + { pItems[index].a.s.uBidiLevel = 1; + pItems[index].a.fRTL = 1; + pItems[index].a.fLayoutRTL = 1; + } - TRACE("New_Script=%d, eScript=%d index=%d cnt=%d iCharPos=%d\n", - New_Script, pItems[index].a.eScript, index, cnt, + + TRACE("New_Level=%i New_Script=%d, eScript=%d index=%d cnt=%d iCharPos=%d\n", + levels?levels[cnt]:-1, New_Script, pItems[index].a.eScript, index, cnt, pItems[index].iCharPos); for (cnt=1; cnt < cInChars; cnt++) { + if (levels && (levels[cnt] == pItems[index].a.s.uBidiLevel)) + continue; + if (pwcInChars[cnt] == '\r') New_Script = Script_CR; else @@ -578,9 +614,9 @@ HRESULT WINAPI ScriptItemize(const WCHAR *pwcInChars, int cInChars, int cMaxItem else New_Script = SCRIPT_UNDEFINED; - if (New_Script != pItems[index].a.eScript) + if ((levels && (levels[cnt] != pItems[index].a.s.uBidiLevel)) || New_Script != pItems[index].a.eScript) { - TRACE("New_Script=%d, eScript=%d ", New_Script, pItems[index].a.eScript); + TRACE("New_Level = %i, New_Script=%d, eScript=%d ", levels?levels[cnt]:-1, New_Script, pItems[index].a.eScript); index++; if (index+1 > cMaxItems) return E_OUTOFMEMORY; @@ -588,9 +624,18 @@ HRESULT WINAPI ScriptItemize(const WCHAR *pwcInChars, int cInChars, int cMaxItem pItems[index].iCharPos = cnt; memset(&pItems[index].a, 0, sizeof(SCRIPT_ANALYSIS)); - if (New_Script == Script_Arabic) + if (levels) + { + pItems[index].a.fRTL = odd(levels[cnt]); + pItems[index].a.fLayoutRTL = odd(levels[cnt]); + pItems[index].a.s.uBidiLevel = levels[cnt]; + } + else if (New_Script == Script_Arabic) + { pItems[index].a.s.uBidiLevel = 1; - + pItems[index].a.fRTL = 1; + pItems[index].a.fLayoutRTL = 1; + } pItems[index].a.eScript = New_Script; TRACE("index=%d cnt=%d iCharPos=%d\n", index, cnt, pItems[index].iCharPos); @@ -610,6 +655,7 @@ HRESULT WINAPI ScriptItemize(const WCHAR *pwcInChars, int cInChars, int cMaxItem /* Set SCRIPT_ITEM */ pItems[index+1].iCharPos = cnt; /* the last + 1 item contains the ptr to the lastchar */ + heap_free(levels); return S_OK; } @@ -686,7 +732,7 @@ HRESULT WINAPI ScriptStringAnalyse(HDC hdc, const void *pString, int cString, int numGlyphsReturned; /* FIXME: non unicode strings */ - WCHAR* pStr = (WCHAR*)pString; + const WCHAR* pStr = (const WCHAR*)pString; hr = ScriptShape(hdc, sc, &pStr[analysis->pItem[i].iCharPos], cChar, numGlyphs, &analysis->pItem[i].a, glyphs, pwLogClust, psva, &numGlyphsReturned); @@ -1286,6 +1332,7 @@ HRESULT WINAPI ScriptShape(HDC hdc, SCRIPT_CACHE *psc, const WCHAR *pwcChars, { HRESULT hr; unsigned int i; + BOOL rtl; TRACE("(%p, %p, %s, %d, %d, %p, %p, %p, %p, %p)\n", hdc, psc, debugstr_wn(pwcChars, cChars), cChars, cMaxGlyphs, psa, pwOutGlyphs, pwLogClust, psva, pcGlyphs); @@ -1295,6 +1342,7 @@ HRESULT WINAPI ScriptShape(HDC hdc, SCRIPT_CACHE *psc, const WCHAR *pwcChars, if (!psva || !pcGlyphs) return E_INVALIDARG; if (cChars > cMaxGlyphs) return E_OUTOFMEMORY; + rtl = (!psa->fLogicalOrder && psa->fRTL); *pcGlyphs = cChars; if ((hr = init_script_cache(hdc, psc)) != S_OK) return hr; @@ -1304,33 +1352,42 @@ HRESULT WINAPI ScriptShape(HDC hdc, SCRIPT_CACHE *psc, const WCHAR *pwcChars, { for (i = 0; i < cChars; i++) { - if (!(pwOutGlyphs[i] = get_cache_glyph(psc, pwcChars[i]))) + int idx = i; + if (rtl) idx = cChars - 1 - i; + if (!(pwOutGlyphs[i] = get_cache_glyph(psc, pwcChars[idx]))) { WORD glyph; if (!hdc) return E_PENDING; - if (GetGlyphIndicesW(hdc, &pwcChars[i], 1, &glyph, 0) == GDI_ERROR) return S_FALSE; - pwOutGlyphs[i] = set_cache_glyph(psc, pwcChars[i], glyph); + if (GetGlyphIndicesW(hdc, &pwcChars[idx], 1, &glyph, 0) == GDI_ERROR) return S_FALSE; + pwOutGlyphs[i] = set_cache_glyph(psc, pwcChars[idx], glyph); } } } else { TRACE("no glyph translation\n"); - for (i = 0; i < cChars; i++) pwOutGlyphs[i] = pwcChars[i]; + for (i = 0; i < cChars; i++) + { + int idx = i; + if (rtl) idx = cChars - 1 - i; + pwOutGlyphs[i] = pwcChars[idx]; + } } /* set up a valid SCRIPT_VISATTR and LogClust for each char in this run */ for (i = 0; i < cChars; i++) { + int idx = i; + if (rtl) idx = cChars - 1 - i; /* FIXME: set to better values */ - psva[i].uJustification = (pwcChars[i] == ' ') ? SCRIPT_JUSTIFY_BLANK : SCRIPT_JUSTIFY_CHARACTER; + psva[i].uJustification = (pwcChars[idx] == ' ') ? SCRIPT_JUSTIFY_BLANK : SCRIPT_JUSTIFY_CHARACTER; psva[i].fClusterStart = 1; psva[i].fDiacritic = 0; psva[i].fZeroWidth = 0; psva[i].fReserved = 0; psva[i].fShapeReserved = 0; - pwLogClust[i] = i; + pwLogClust[i] = idx; } return S_OK; } @@ -1573,28 +1630,45 @@ HRESULT WINAPI ScriptGetGlyphABCWidth(HDC hdc, SCRIPT_CACHE *psc, WORD glyph, AB */ HRESULT WINAPI ScriptLayout(int runs, const BYTE *level, int *vistolog, int *logtovis) { - int i, j = runs - 1, k = 0; + int* indexs; + int ich; TRACE("(%d, %p, %p, %p)\n", runs, level, vistolog, logtovis); if (!level || (!vistolog && !logtovis)) return E_INVALIDARG; - for (i = 0; i < runs; i++) + indexs = heap_alloc(sizeof(int) * runs); + if (!indexs) + return E_OUTOFMEMORY; + + + if (vistolog) { - if (level[i] % 2) - { - if (vistolog) *vistolog++ = j; - if (logtovis) *logtovis++ = j; - j--; - } - else - { - if (vistolog) *vistolog++ = k; - if (logtovis) *logtovis++ = k; - k++; - } + for( ich = 0; ich < runs; ich++) + indexs[ich] = ich; + + ich = 0; + while (ich < runs) + ich += BIDI_ReorderV2lLevel(0, indexs+ich, level+ich, runs - ich, FALSE); + for (ich = 0; ich < runs; ich++) + vistolog[ich] = indexs[ich]; } + + + if (logtovis) + { + for( ich = 0; ich < runs; ich++) + indexs[ich] = ich; + + ich = 0; + while (ich < runs) + ich += BIDI_ReorderL2vLevel(0, indexs+ich, level+ich, runs - ich, FALSE); + for (ich = 0; ich < runs; ich++) + logtovis[ich] = indexs[ich]; + } + heap_free(indexs); + return S_OK; } @@ -1839,9 +1913,3 @@ HRESULT WINAPI ScriptJustify(const SCRIPT_VISATTR *sva, const int *advance, for (i = 0; i < num_glyphs; i++) justify[i] = advance[i]; return S_OK; } - -BOOL gbLpkPresent = FALSE; -VOID WINAPI LpkPresent() -{ - gbLpkPresent = TRUE; /* Turn it on this way! Wine is out of control! */ -} diff --git a/reactos/dll/win32/usp10/usp10.rbuild b/reactos/dll/win32/usp10/usp10.rbuild index ad071018a46..527578c6edd 100644 --- a/reactos/dll/win32/usp10/usp10.rbuild +++ b/reactos/dll/win32/usp10/usp10.rbuild @@ -6,6 +6,7 @@ . include/reactos/wine + bidi.c usp10.c wine gdi32 diff --git a/reactos/dll/win32/usp10/usp10.spec b/reactos/dll/win32/usp10/usp10.spec index 0f7b0aa87c5..5e358707c41 100644 --- a/reactos/dll/win32/usp10/usp10.spec +++ b/reactos/dll/win32/usp10/usp10.spec @@ -1,4 +1,4 @@ -@ stdcall LpkPresent() +@ stub LpkPresent @ stdcall ScriptApplyDigitSubstitution(ptr ptr ptr) @ stdcall ScriptApplyLogicalWidth(ptr long long ptr ptr ptr ptr ptr ptr) @ stdcall ScriptBreak(ptr long ptr ptr) diff --git a/reactos/dll/win32/usp10/usp10_internal.h b/reactos/dll/win32/usp10/usp10_internal.h new file mode 100644 index 00000000000..60e4eff14ab --- /dev/null +++ b/reactos/dll/win32/usp10/usp10_internal.h @@ -0,0 +1,28 @@ +/* + * Implementation of Uniscribe Script Processor (usp10.dll) + * + * Copyright 2010 CodeWeavers, Aric Stewart + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + * + */ + +#define odd(x) ((x) & 1) + +BOOL BIDI_DetermineLevels( LPCWSTR lpString, INT uCount, const SCRIPT_STATE *s, + const SCRIPT_CONTROL *c, WORD *lpOutLevels ); + +INT BIDI_ReorderV2lLevel(int level, int *pIndexs, const BYTE* plevel, int cch, BOOL fReverse); +INT BIDI_ReorderL2vLevel(int level, int *pIndexs, const BYTE* plevel, int cch, BOOL fReverse); diff --git a/reactos/dll/win32/version/resource.c b/reactos/dll/win32/version/resource.c index e7d34e08a88..16d9eacf83e 100644 --- a/reactos/dll/win32/version/resource.c +++ b/reactos/dll/win32/version/resource.c @@ -199,7 +199,11 @@ static BOOL find_ne_resource( HFILE lzfd, DWORD *resLen, DWORD *resOff ) */ static BOOL find_pe_resource( HFILE lzfd, DWORD *resLen, DWORD *resOff ) { - IMAGE_NT_HEADERS pehd; + union + { + IMAGE_NT_HEADERS32 nt32; + IMAGE_NT_HEADERS64 nt64; + } pehd; DWORD pehdoffset; PIMAGE_DATA_DIRECTORY resDataDir; PIMAGE_SECTION_HEADER sections; @@ -208,14 +212,27 @@ static BOOL find_pe_resource( HFILE lzfd, DWORD *resLen, DWORD *resOff ) const void *resDir; const IMAGE_RESOURCE_DIRECTORY *resPtr; const IMAGE_RESOURCE_DATA_ENTRY *resData; - int i, nSections; + int i, len, nSections; BOOL ret = FALSE; /* Read in PE header */ pehdoffset = LZSeek( lzfd, 0, SEEK_CUR ); - if ( sizeof(pehd) != LZRead( lzfd, (LPSTR)&pehd, sizeof(pehd) ) ) return 0; + len = LZRead( lzfd, (LPSTR)&pehd, sizeof(pehd) ); + if (len < sizeof(pehd.nt32.FileHeader)) return 0; + if (len < sizeof(pehd)) memset( (char *)&pehd + len, 0, sizeof(pehd) - len ); + + switch (pehd.nt32.OptionalHeader.Magic) + { + case IMAGE_NT_OPTIONAL_HDR32_MAGIC: + resDataDir = pehd.nt32.OptionalHeader.DataDirectory + IMAGE_DIRECTORY_ENTRY_RESOURCE; + break; + case IMAGE_NT_OPTIONAL_HDR64_MAGIC: + resDataDir = pehd.nt64.OptionalHeader.DataDirectory + IMAGE_DIRECTORY_ENTRY_RESOURCE; + break; + default: + return 0; + } - resDataDir = pehd.OptionalHeader.DataDirectory+IMAGE_DIRECTORY_ENTRY_RESOURCE; if ( !resDataDir->Size ) { TRACE("No resources in PE dll\n" ); @@ -223,15 +240,13 @@ static BOOL find_pe_resource( HFILE lzfd, DWORD *resLen, DWORD *resOff ) } /* Read in section table */ - nSections = pehd.FileHeader.NumberOfSections; + nSections = pehd.nt32.FileHeader.NumberOfSections; sections = HeapAlloc( GetProcessHeap(), 0, nSections * sizeof(IMAGE_SECTION_HEADER) ); if ( !sections ) return FALSE; - LZSeek( lzfd, pehdoffset + - sizeof(DWORD) + /* Signature */ - sizeof(IMAGE_FILE_HEADER) + - pehd.FileHeader.SizeOfOptionalHeader, SEEK_SET ); + len = FIELD_OFFSET( IMAGE_NT_HEADERS32, OptionalHeader ) + pehd.nt32.FileHeader.SizeOfOptionalHeader; + LZSeek( lzfd, pehdoffset + len, SEEK_SET ); if ( nSections * sizeof(IMAGE_SECTION_HEADER) != LZRead( lzfd, (LPSTR)sections, nSections * sizeof(IMAGE_SECTION_HEADER) ) ) diff --git a/reactos/dll/win32/windowscodecs/bmpdecode.c b/reactos/dll/win32/windowscodecs/bmpdecode.c index 5c805c8c098..854b3374b02 100644 --- a/reactos/dll/win32/windowscodecs/bmpdecode.c +++ b/reactos/dll/win32/windowscodecs/bmpdecode.c @@ -58,12 +58,14 @@ typedef struct { DWORD bc2AppData; } BITMAPCOREHEADER2; -struct BmpFrameDecode; -typedef HRESULT (*ReadDataFunc)(struct BmpFrameDecode* This); +struct BmpDecoder; +typedef HRESULT (*ReadDataFunc)(struct BmpDecoder* This); -typedef struct BmpFrameDecode { - const IWICBitmapFrameDecodeVtbl *lpVtbl; +typedef struct BmpDecoder { + const IWICBitmapDecoderVtbl *lpVtbl; + const IWICBitmapFrameDecodeVtbl *lpFrameVtbl; LONG ref; + BOOL initialized; IStream *stream; BITMAPFILEHEADER bfh; BITMAPV5HEADER bih; @@ -73,12 +75,17 @@ typedef struct BmpFrameDecode { INT stride; BYTE *imagedata; BYTE *imagedatastart; -} BmpFrameDecode; + CRITICAL_SECTION lock; /* must be held when initialized/imagedata is set or stream is accessed */ +} BmpDecoder; + +static inline BmpDecoder *impl_from_frame(IWICBitmapFrameDecode *iface) +{ + return CONTAINING_RECORD(iface, BmpDecoder, lpFrameVtbl); +} static HRESULT WINAPI BmpFrameDecode_QueryInterface(IWICBitmapFrameDecode *iface, REFIID iid, void **ppv) { - BmpFrameDecode *This = (BmpFrameDecode*)iface; TRACE("(%p,%s,%p)\n", iface, debugstr_guid(iid), ppv); if (!ppv) return E_INVALIDARG; @@ -87,7 +94,7 @@ static HRESULT WINAPI BmpFrameDecode_QueryInterface(IWICBitmapFrameDecode *iface IsEqualIID(&IID_IWICBitmapSource, iid) || IsEqualIID(&IID_IWICBitmapFrameDecode, iid)) { - *ppv = This; + *ppv = iface; } else { @@ -101,35 +108,22 @@ static HRESULT WINAPI BmpFrameDecode_QueryInterface(IWICBitmapFrameDecode *iface static ULONG WINAPI BmpFrameDecode_AddRef(IWICBitmapFrameDecode *iface) { - BmpFrameDecode *This = (BmpFrameDecode*)iface; - ULONG ref = InterlockedIncrement(&This->ref); + BmpDecoder *This = impl_from_frame(iface); - TRACE("(%p) refcount=%u\n", iface, ref); - - return ref; + return IUnknown_AddRef((IUnknown*)This); } static ULONG WINAPI BmpFrameDecode_Release(IWICBitmapFrameDecode *iface) { - BmpFrameDecode *This = (BmpFrameDecode*)iface; - ULONG ref = InterlockedDecrement(&This->ref); + BmpDecoder *This = impl_from_frame(iface); - TRACE("(%p) refcount=%u\n", iface, ref); - - if (ref == 0) - { - IStream_Release(This->stream); - HeapFree(GetProcessHeap(), 0, This->imagedata); - HeapFree(GetProcessHeap(), 0, This); - } - - return ref; + return IUnknown_Release((IUnknown*)This); } static HRESULT WINAPI BmpFrameDecode_GetSize(IWICBitmapFrameDecode *iface, UINT *puiWidth, UINT *puiHeight) { - BmpFrameDecode *This = (BmpFrameDecode*)iface; + BmpDecoder *This = impl_from_frame(iface); TRACE("(%p,%p,%p)\n", iface, puiWidth, puiHeight); if (This->bih.bV5Size == sizeof(BITMAPCOREHEADER)) @@ -149,7 +143,7 @@ static HRESULT WINAPI BmpFrameDecode_GetSize(IWICBitmapFrameDecode *iface, static HRESULT WINAPI BmpFrameDecode_GetPixelFormat(IWICBitmapFrameDecode *iface, WICPixelFormatGUID *pPixelFormat) { - BmpFrameDecode *This = (BmpFrameDecode*)iface; + BmpDecoder *This = impl_from_frame(iface); TRACE("(%p,%p)\n", iface, pPixelFormat); memcpy(pPixelFormat, This->pixelformat, sizeof(GUID)); @@ -180,7 +174,7 @@ static HRESULT BmpHeader_GetResolution(BITMAPV5HEADER *bih, double *pDpiX, doubl static HRESULT WINAPI BmpFrameDecode_GetResolution(IWICBitmapFrameDecode *iface, double *pDpiX, double *pDpiY) { - BmpFrameDecode *This = (BmpFrameDecode*)iface; + BmpDecoder *This = impl_from_frame(iface); TRACE("(%p,%p,%p)\n", iface, pDpiX, pDpiY); return BmpHeader_GetResolution(&This->bih, pDpiX, pDpiY); @@ -190,13 +184,15 @@ static HRESULT WINAPI BmpFrameDecode_CopyPalette(IWICBitmapFrameDecode *iface, IWICPalette *pIPalette) { HRESULT hr; - BmpFrameDecode *This = (BmpFrameDecode*)iface; + BmpDecoder *This = impl_from_frame(iface); int count; WICColor *wiccolors=NULL; RGBTRIPLE *bgrcolors=NULL; TRACE("(%p,%p)\n", iface, pIPalette); + EnterCriticalSection(&This->lock); + if (This->bih.bV5Size == sizeof(BITMAPCOREHEADER)) { BITMAPCOREHEADER *bch = (BITMAPCOREHEADER*)&This->bih; @@ -238,7 +234,8 @@ static HRESULT WINAPI BmpFrameDecode_CopyPalette(IWICBitmapFrameDecode *iface, } else { - return WINCODEC_ERR_PALETTEUNAVAILABLE; + hr = WINCODEC_ERR_PALETTEUNAVAILABLE; + goto end; } } else @@ -256,7 +253,11 @@ static HRESULT WINAPI BmpFrameDecode_CopyPalette(IWICBitmapFrameDecode *iface, tablesize = sizeof(WICColor) * count; wiccolors = HeapAlloc(GetProcessHeap(), 0, tablesize); - if (!wiccolors) return E_OUTOFMEMORY; + if (!wiccolors) + { + hr = E_OUTOFMEMORY; + goto end; + } offset.QuadPart = sizeof(BITMAPFILEHEADER) + This->bih.bV5Size; hr = IStream_Seek(This->stream, offset, STREAM_SEEK_SET, NULL); @@ -275,13 +276,18 @@ static HRESULT WINAPI BmpFrameDecode_CopyPalette(IWICBitmapFrameDecode *iface, } else { - return WINCODEC_ERR_PALETTEUNAVAILABLE; + hr = WINCODEC_ERR_PALETTEUNAVAILABLE; + goto end; } } - hr = IWICPalette_InitializeCustom(pIPalette, wiccolors, count); - end: + + LeaveCriticalSection(&This->lock); + + if (SUCCEEDED(hr)) + hr = IWICPalette_InitializeCustom(pIPalette, wiccolors, count); + HeapFree(GetProcessHeap(), 0, wiccolors); HeapFree(GetProcessHeap(), 0, bgrcolors); return hr; @@ -290,16 +296,18 @@ end: static HRESULT WINAPI BmpFrameDecode_CopyPixels(IWICBitmapFrameDecode *iface, const WICRect *prc, UINT cbStride, UINT cbBufferSize, BYTE *pbBuffer) { - BmpFrameDecode *This = (BmpFrameDecode*)iface; - HRESULT hr; + BmpDecoder *This = impl_from_frame(iface); + HRESULT hr=S_OK; UINT width, height; TRACE("(%p,%p,%u,%u,%p)\n", iface, prc, cbStride, cbBufferSize, pbBuffer); + EnterCriticalSection(&This->lock); if (!This->imagedata) { hr = This->read_data_func(This); - if (FAILED(hr)) return hr; } + LeaveCriticalSection(&This->lock); + if (FAILED(hr)) return hr; hr = BmpFrameDecode_GetSize(iface, &width, &height); if (FAILED(hr)) return hr; @@ -330,7 +338,7 @@ static HRESULT WINAPI BmpFrameDecode_GetThumbnail(IWICBitmapFrameDecode *iface, return WINCODEC_ERR_CODECNOTHUMBNAIL; } -static HRESULT BmpFrameDecode_ReadUncompressed(BmpFrameDecode* This) +static HRESULT BmpFrameDecode_ReadUncompressed(BmpDecoder* This) { UINT bytesperrow; UINT width, height; @@ -387,7 +395,7 @@ fail: return hr; } -static HRESULT BmpFrameDecode_ReadRLE8(BmpFrameDecode* This) +static HRESULT BmpFrameDecode_ReadRLE8(BmpDecoder* This) { UINT bytesperrow; UINT width, height; @@ -493,7 +501,7 @@ fail: return hr; } -static HRESULT BmpFrameDecode_ReadRLE4(BmpFrameDecode* This) +static HRESULT BmpFrameDecode_ReadRLE4(BmpDecoder* This) { UINT bytesperrow; UINT width, height; @@ -614,7 +622,7 @@ fail: return hr; } -static HRESULT BmpFrameDecode_ReadUnsupported(BmpFrameDecode* This) +static HRESULT BmpFrameDecode_ReadUnsupported(BmpDecoder* This) { return E_FAIL; } @@ -637,7 +645,7 @@ static const struct bitfields_format bitfields_formats[] = { {0} }; -static const IWICBitmapFrameDecodeVtbl BmpFrameDecode_Vtbl = { +static const IWICBitmapFrameDecodeVtbl BmpDecoder_FrameVtbl = { BmpFrameDecode_QueryInterface, BmpFrameDecode_AddRef, BmpFrameDecode_Release, @@ -651,19 +659,6 @@ static const IWICBitmapFrameDecodeVtbl BmpFrameDecode_Vtbl = { BmpFrameDecode_GetThumbnail }; -typedef struct { - const IWICBitmapDecoderVtbl *lpVtbl; - LONG ref; - BOOL initialized; - IStream *stream; - BITMAPFILEHEADER bfh; - BITMAPV5HEADER bih; - BmpFrameDecode *framedecode; - const WICPixelFormatGUID *pixelformat; - int bitsperpixel; - ReadDataFunc read_data_func; -} BmpDecoder; - static HRESULT BmpDecoder_ReadHeaders(BmpDecoder* This, IStream *stream) { HRESULT hr; @@ -873,7 +868,9 @@ static ULONG WINAPI BmpDecoder_Release(IWICBitmapDecoder *iface) if (ref == 0) { if (This->stream) IStream_Release(This->stream); - if (This->framedecode) IUnknown_Release((IUnknown*)This->framedecode); + HeapFree(GetProcessHeap(), 0, This->imagedata); + This->lock.DebugInfo->Spare[0] = 0; + DeleteCriticalSection(&This->lock); HeapFree(GetProcessHeap(), 0, This); } @@ -886,7 +883,9 @@ static HRESULT WINAPI BmpDecoder_QueryCapability(IWICBitmapDecoder *iface, IStre HRESULT hr; BmpDecoder *This = (BmpDecoder*)iface; + EnterCriticalSection(&This->lock); hr = BmpDecoder_ReadHeaders(This, pIStream); + LeaveCriticalSection(&This->lock); if (FAILED(hr)) return hr; if (This->read_data_func == BmpFrameDecode_ReadUnsupported) @@ -903,6 +902,7 @@ static HRESULT WINAPI BmpDecoder_Initialize(IWICBitmapDecoder *iface, IStream *p HRESULT hr; BmpDecoder *This = (BmpDecoder*)iface; + EnterCriticalSection(&This->lock); hr = BmpDecoder_ReadHeaders(This, pIStream); if (SUCCEEDED(hr)) @@ -910,6 +910,7 @@ static HRESULT WINAPI BmpDecoder_Initialize(IWICBitmapDecoder *iface, IStream *p This->stream = pIStream; IStream_AddRef(pIStream); } + LeaveCriticalSection(&This->lock); return hr; } @@ -992,25 +993,8 @@ static HRESULT WINAPI BmpDecoder_GetFrame(IWICBitmapDecoder *iface, if (!This->stream) return WINCODEC_ERR_WRONGSTATE; - if (!This->framedecode) - { - This->framedecode = HeapAlloc(GetProcessHeap(), 0, sizeof(BmpFrameDecode)); - if (!This->framedecode) return E_OUTOFMEMORY; - - This->framedecode->lpVtbl = &BmpFrameDecode_Vtbl; - This->framedecode->ref = 1; - This->framedecode->stream = This->stream; - IStream_AddRef(This->stream); - This->framedecode->bfh = This->bfh; - This->framedecode->bih = This->bih; - This->framedecode->pixelformat = This->pixelformat; - This->framedecode->bitsperpixel = This->bitsperpixel; - This->framedecode->read_data_func = This->read_data_func; - This->framedecode->imagedata = NULL; - } - - *ppIBitmapFrame = (IWICBitmapFrameDecode*)This->framedecode; - IWICBitmapFrameDecode_AddRef((IWICBitmapFrameDecode*)This->framedecode); + *ppIBitmapFrame = (IWICBitmapFrameDecode*)&This->lpFrameVtbl; + IWICBitmapDecoder_AddRef(iface); return S_OK; } @@ -1047,10 +1031,13 @@ HRESULT BmpDecoder_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** ppv) if (!This) return E_OUTOFMEMORY; This->lpVtbl = &BmpDecoder_Vtbl; + This->lpFrameVtbl = &BmpDecoder_FrameVtbl; This->ref = 1; This->initialized = FALSE; This->stream = NULL; - This->framedecode = NULL; + This->imagedata = NULL; + InitializeCriticalSection(&This->lock); + This->lock.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": BmpDecoder.lock"); ret = IUnknown_QueryInterface((IUnknown*)This, iid, ppv); IUnknown_Release((IUnknown*)This); diff --git a/reactos/dll/win32/windowscodecs/clsfactory.c b/reactos/dll/win32/windowscodecs/clsfactory.c index d8d21052d5e..68e0530fbdc 100644 --- a/reactos/dll/win32/windowscodecs/clsfactory.c +++ b/reactos/dll/win32/windowscodecs/clsfactory.c @@ -50,6 +50,7 @@ static classinfo wic_classes[] = { {&CLSID_WICGifDecoder, GifDecoder_CreateInstance}, {&CLSID_WICIcoDecoder, IcoDecoder_CreateInstance}, {&CLSID_WICJpegDecoder, JpegDecoder_CreateInstance}, + {&CLSID_WICTiffDecoder, TiffDecoder_CreateInstance}, {&CLSID_WICDefaultFormatConverter, FormatConverter_CreateInstance}, {0}}; diff --git a/reactos/dll/win32/windowscodecs/converter.c b/reactos/dll/win32/windowscodecs/converter.c index 15c7b0f380a..b1c0952b9a2 100644 --- a/reactos/dll/win32/windowscodecs/converter.c +++ b/reactos/dll/win32/windowscodecs/converter.c @@ -71,6 +71,7 @@ typedef struct FormatConverter { WICBitmapDitherType dither; double alpha_threshold; WICBitmapPaletteType palette_type; + CRITICAL_SECTION lock; /* must be held when initialized */ } FormatConverter; static void make_grayscale_palette(WICColor *colors, UINT num_colors) @@ -765,6 +766,8 @@ static ULONG WINAPI FormatConverter_Release(IWICFormatConverter *iface) if (ref == 0) { + This->lock.DebugInfo->Spare[0] = 0; + DeleteCriticalSection(&This->lock); if (This->source) IWICBitmapSource_Release(This->source); HeapFree(GetProcessHeap(), 0, This); } @@ -841,38 +844,56 @@ static HRESULT WINAPI FormatConverter_Initialize(IWICFormatConverter *iface, const struct pixelformatinfo *srcinfo, *dstinfo; static INT fixme=0; GUID srcFormat; - HRESULT res; + HRESULT res=S_OK; TRACE("(%p,%p,%s,%u,%p,%0.1f,%u)\n", iface, pISource, debugstr_guid(dstFormat), dither, pIPalette, alphaThresholdPercent, paletteTranslate); if (pIPalette && !fixme++) FIXME("ignoring palette\n"); - if (This->source) return WINCODEC_ERR_WRONGSTATE; + EnterCriticalSection(&This->lock); + + if (This->source) + { + res = WINCODEC_ERR_WRONGSTATE; + goto end; + } res = IWICBitmapSource_GetPixelFormat(pISource, &srcFormat); - if (FAILED(res)) return res; + if (FAILED(res)) goto end; srcinfo = get_formatinfo(&srcFormat); - if (!srcinfo) return WINCODEC_ERR_UNSUPPORTEDPIXELFORMAT; + if (!srcinfo) + { + res = WINCODEC_ERR_UNSUPPORTEDPIXELFORMAT; + goto end; + } dstinfo = get_formatinfo(dstFormat); - if (!dstinfo) return WINCODEC_ERR_UNSUPPORTEDPIXELFORMAT; + if (!dstinfo) + { + res = WINCODEC_ERR_UNSUPPORTEDPIXELFORMAT; + goto end; + } if (dstinfo->copy_function) { IWICBitmapSource_AddRef(pISource); - This->source = pISource; This->src_format = srcinfo; This->dst_format = dstinfo; This->dither = dither; This->alpha_threshold = alphaThresholdPercent; This->palette_type = paletteTranslate; + This->source = pISource; } else - return WINCODEC_ERR_UNSUPPORTEDOPERATION; + res = WINCODEC_ERR_UNSUPPORTEDOPERATION; - return S_OK; +end: + + LeaveCriticalSection(&This->lock); + + return res; } static HRESULT WINAPI FormatConverter_CanConvert(IWICFormatConverter *iface, @@ -930,6 +951,8 @@ HRESULT FormatConverter_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** p This->lpVtbl = &FormatConverter_Vtbl; This->ref = 1; This->source = NULL; + InitializeCriticalSection(&This->lock); + This->lock.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": FormatConverter.lock"); ret = IUnknown_QueryInterface((IUnknown*)This, iid, ppv); IUnknown_Release((IUnknown*)This); diff --git a/reactos/dll/win32/windowscodecs/gifformat.c b/reactos/dll/win32/windowscodecs/gifformat.c index 0597b1afbe3..3443b2c1ae1 100644 --- a/reactos/dll/win32/windowscodecs/gifformat.c +++ b/reactos/dll/win32/windowscodecs/gifformat.c @@ -40,6 +40,7 @@ typedef struct { LONG ref; BOOL initialized; GifFileType *gif; + CRITICAL_SECTION lock; } GifDecoder; typedef struct { @@ -302,6 +303,8 @@ static ULONG WINAPI GifDecoder_Release(IWICBitmapDecoder *iface) if (ref == 0) { + This->lock.DebugInfo->Spare[0] = 0; + DeleteCriticalSection(&This->lock); DGifCloseFile(This->gif); HeapFree(GetProcessHeap(), 0, This); } @@ -341,9 +344,12 @@ static HRESULT WINAPI GifDecoder_Initialize(IWICBitmapDecoder *iface, IStream *p TRACE("(%p,%p,%x)\n", iface, pIStream, cacheOptions); + EnterCriticalSection(&This->lock); + if (This->initialized || This->gif) { WARN("already initialized\n"); + LeaveCriticalSection(&This->lock); return WINCODEC_ERR_WRONGSTATE; } @@ -353,16 +359,26 @@ static HRESULT WINAPI GifDecoder_Initialize(IWICBitmapDecoder *iface, IStream *p /* read all data from the stream */ This->gif = DGifOpen((void*)pIStream, _gif_inputfunc); - if (!This->gif) return E_FAIL; + if (!This->gif) + { + LeaveCriticalSection(&This->lock); + return E_FAIL; + } ret = DGifSlurp(This->gif); - if (ret == GIF_ERROR) return E_FAIL; + if (ret == GIF_ERROR) + { + LeaveCriticalSection(&This->lock); + return E_FAIL; + } /* make sure we don't use the stream after this method returns */ This->gif->UserData = NULL; This->initialized = TRUE; + LeaveCriticalSection(&This->lock); + return S_OK; } @@ -502,6 +518,8 @@ HRESULT GifDecoder_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** ppv) This->ref = 1; This->initialized = FALSE; This->gif = NULL; + InitializeCriticalSection(&This->lock); + This->lock.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": GifDecoder.lock"); ret = IUnknown_QueryInterface((IUnknown*)This, iid, ppv); IUnknown_Release((IUnknown*)This); diff --git a/reactos/dll/win32/windowscodecs/icoformat.c b/reactos/dll/win32/windowscodecs/icoformat.c index ab30ab0a8af..e1ea7c6c8d6 100644 --- a/reactos/dll/win32/windowscodecs/icoformat.c +++ b/reactos/dll/win32/windowscodecs/icoformat.c @@ -62,6 +62,7 @@ typedef struct { BOOL initialized; IStream *stream; ICONHEADER header; + CRITICAL_SECTION lock; /* must be held when accessing stream */ } IcoDecoder; typedef struct { @@ -512,15 +513,17 @@ static HRESULT WINAPI IcoFrameDecode_CopyPixels(IWICBitmapFrameDecode *iface, const WICRect *prc, UINT cbStride, UINT cbBufferSize, BYTE *pbBuffer) { IcoFrameDecode *This = (IcoFrameDecode*)iface; - HRESULT hr; + HRESULT hr=S_OK; UINT width, height, stride; TRACE("(%p,%p,%u,%u,%p)\n", iface, prc, cbStride, cbBufferSize, pbBuffer); + EnterCriticalSection(&This->parent->lock); if (!This->bits) { hr = IcoFrameDecode_ReadPixels(This); - if (FAILED(hr)) return hr; } + LeaveCriticalSection(&This->parent->lock); + if (FAILED(hr)) return hr; width = This->entry.bWidth ? This->entry.bWidth : 256; height = This->entry.bHeight ? This->entry.bHeight : 256; @@ -606,6 +609,8 @@ static ULONG WINAPI IcoDecoder_Release(IWICBitmapDecoder *iface) if (ref == 0) { + This->lock.DebugInfo->Spare[0] = 0; + DeleteCriticalSection(&This->lock); if (This->stream) IStream_Release(This->stream); HeapFree(GetProcessHeap(), 0, This); } @@ -629,23 +634,37 @@ static HRESULT WINAPI IcoDecoder_Initialize(IWICBitmapDecoder *iface, IStream *p ULONG bytesread; TRACE("(%p,%p,%x)\n", iface, pIStream, cacheOptions); - if (This->initialized) return WINCODEC_ERR_WRONGSTATE; + EnterCriticalSection(&This->lock); + + if (This->initialized) + { + hr = WINCODEC_ERR_WRONGSTATE; + goto end; + } seek.QuadPart = 0; hr = IStream_Seek(pIStream, seek, STREAM_SEEK_SET, NULL); - if (FAILED(hr)) return hr; + if (FAILED(hr)) goto end; hr = IStream_Read(pIStream, &This->header, sizeof(ICONHEADER), &bytesread); - if (FAILED(hr)) return hr; + if (FAILED(hr)) goto end; if (bytesread != sizeof(ICONHEADER) || This->header.idReserved != 0 || - This->header.idType != 1) return E_FAIL; + This->header.idType != 1) + { + hr = E_FAIL; + goto end; + } This->initialized = TRUE; This->stream = pIStream; IStream_AddRef(pIStream); - return S_OK; +end: + + LeaveCriticalSection(&This->lock); + + return hr; } static HRESULT WINAPI IcoDecoder_GetContainerFormat(IWICBitmapDecoder *iface, @@ -715,18 +734,32 @@ static HRESULT WINAPI IcoDecoder_GetFrame(IWICBitmapDecoder *iface, UINT index, IWICBitmapFrameDecode **ppIBitmapFrame) { IcoDecoder *This = (IcoDecoder*)iface; - IcoFrameDecode *result; + IcoFrameDecode *result=NULL; LARGE_INTEGER seek; HRESULT hr; ULONG bytesread; TRACE("(%p,%u,%p)\n", iface, index, ppIBitmapFrame); - if (!This->initialized) return WINCODEC_ERR_NOTINITIALIZED; + EnterCriticalSection(&This->lock); - if (This->header.idCount < index) return E_INVALIDARG; + if (!This->initialized) + { + hr = WINCODEC_ERR_NOTINITIALIZED; + goto fail; + } + + if (This->header.idCount < index) + { + hr = E_INVALIDARG; + goto fail; + } result = HeapAlloc(GetProcessHeap(), 0, sizeof(IcoFrameDecode)); - if (!result) return E_OUTOFMEMORY; + if (!result) + { + hr = E_OUTOFMEMORY; + goto fail; + } result->lpVtbl = &IcoFrameDecode_Vtbl; result->ref = 1; @@ -745,9 +778,12 @@ static HRESULT WINAPI IcoDecoder_GetFrame(IWICBitmapDecoder *iface, *ppIBitmapFrame = (IWICBitmapFrameDecode*)result; + LeaveCriticalSection(&This->lock); + return S_OK; fail: + LeaveCriticalSection(&This->lock); HeapFree(GetProcessHeap(), 0, result); if (SUCCEEDED(hr)) hr = E_FAIL; TRACE("<-- %x\n", hr); @@ -789,6 +825,8 @@ HRESULT IcoDecoder_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** ppv) This->ref = 1; This->stream = NULL; This->initialized = FALSE; + InitializeCriticalSection(&This->lock); + This->lock.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": IcoDecoder.lock"); ret = IUnknown_QueryInterface((IUnknown*)This, iid, ppv); IUnknown_Release((IUnknown*)This); diff --git a/reactos/dll/win32/windowscodecs/jpegformat.c b/reactos/dll/win32/windowscodecs/jpegformat.c index 017e6045790..b5676eaacc8 100644 --- a/reactos/dll/win32/windowscodecs/jpegformat.c +++ b/reactos/dll/win32/windowscodecs/jpegformat.c @@ -103,6 +103,7 @@ typedef struct { struct jpeg_source_mgr source_mgr; BYTE source_buffer[1024]; BYTE *image_data; + CRITICAL_SECTION lock; } JpegDecoder; static inline JpegDecoder *decoder_from_decompress(j_decompress_ptr decompress) @@ -156,6 +157,8 @@ static ULONG WINAPI JpegDecoder_Release(IWICBitmapDecoder *iface) if (ref == 0) { + This->lock.DebugInfo->Spare[0] = 0; + DeleteCriticalSection(&This->lock); if (This->cinfo_initialized) pjpeg_destroy_decompress(&This->cinfo); if (This->stream) IStream_Release(This->stream); HeapFree(GetProcessHeap(), 0, This->image_data); @@ -225,7 +228,13 @@ static HRESULT WINAPI JpegDecoder_Initialize(IWICBitmapDecoder *iface, IStream * int ret; TRACE("(%p,%p,%u)\n", iface, pIStream, cacheOptions); - if (This->cinfo_initialized) return WINCODEC_ERR_WRONGSTATE; + EnterCriticalSection(&This->lock); + + if (This->cinfo_initialized) + { + LeaveCriticalSection(&This->lock); + return WINCODEC_ERR_WRONGSTATE; + } This->cinfo.err = pjpeg_std_error(&This->jerr); @@ -249,6 +258,7 @@ static HRESULT WINAPI JpegDecoder_Initialize(IWICBitmapDecoder *iface, IStream * if (ret != JPEG_HEADER_OK) { WARN("Jpeg image in stream has bad format, read header returned %d.\n",ret); + LeaveCriticalSection(&This->lock); return E_FAIL; } @@ -260,11 +270,14 @@ static HRESULT WINAPI JpegDecoder_Initialize(IWICBitmapDecoder *iface, IStream * if (!pjpeg_start_decompress(&This->cinfo)) { ERR("jpeg_start_decompress failed\n"); + LeaveCriticalSection(&This->lock); return E_FAIL; } This->initialized = TRUE; + LeaveCriticalSection(&This->lock); + return S_OK; } @@ -448,10 +461,16 @@ static HRESULT WINAPI JpegDecoder_Frame_CopyPixels(IWICBitmapFrameDecode *iface, max_row_needed = prc->Y + prc->Height; if (max_row_needed > This->cinfo.output_height) return E_INVALIDARG; + EnterCriticalSection(&This->lock); + if (!This->image_data) { This->image_data = HeapAlloc(GetProcessHeap(), 0, data_size); - if (!This->image_data) return E_OUTOFMEMORY; + if (!This->image_data) + { + LeaveCriticalSection(&This->lock); + return E_OUTOFMEMORY; + } } while (max_row_needed > This->cinfo.output_scanline) @@ -471,6 +490,7 @@ static HRESULT WINAPI JpegDecoder_Frame_CopyPixels(IWICBitmapFrameDecode *iface, if (ret == 0) { ERR("read_scanlines failed\n"); + LeaveCriticalSection(&This->lock); return E_FAIL; } @@ -492,6 +512,8 @@ static HRESULT WINAPI JpegDecoder_Frame_CopyPixels(IWICBitmapFrameDecode *iface, } } + LeaveCriticalSection(&This->lock); + return copy_pixels(bpp, This->image_data, This->cinfo.output_width, This->cinfo.output_height, stride, prc, cbStride, cbBufferSize, pbBuffer); @@ -559,6 +581,8 @@ HRESULT JpegDecoder_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** ppv) This->cinfo_initialized = FALSE; This->stream = NULL; This->image_data = NULL; + InitializeCriticalSection(&This->lock); + This->lock.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": JpegDecoder.lock"); ret = IUnknown_QueryInterface((IUnknown*)This, iid, ppv); IUnknown_Release((IUnknown*)This); diff --git a/reactos/dll/win32/windowscodecs/palette.c b/reactos/dll/win32/windowscodecs/palette.c index 842d3b51c30..40ab190958e 100644 --- a/reactos/dll/win32/windowscodecs/palette.c +++ b/reactos/dll/win32/windowscodecs/palette.c @@ -40,6 +40,7 @@ typedef struct { UINT count; WICColor *colors; WICBitmapPaletteType type; + CRITICAL_SECTION lock; /* must be held when count, colors, or type is accessed */ } PaletteImpl; static HRESULT WINAPI PaletteImpl_QueryInterface(IWICPalette *iface, REFIID iid, @@ -83,6 +84,8 @@ static ULONG WINAPI PaletteImpl_Release(IWICPalette *iface) if (ref == 0) { + This->lock.DebugInfo->Spare[0] = 0; + DeleteCriticalSection(&This->lock); HeapFree(GetProcessHeap(), 0, This->colors); HeapFree(GetProcessHeap(), 0, This); } @@ -117,10 +120,12 @@ static HRESULT WINAPI PaletteImpl_InitializeCustom(IWICPalette *iface, memcpy(new_colors, pColors, sizeof(WICColor) * colorCount); } + EnterCriticalSection(&This->lock); HeapFree(GetProcessHeap(), 0, This->colors); This->colors = new_colors; This->count = colorCount; This->type = WICBitmapPaletteTypeCustom; + LeaveCriticalSection(&This->lock); return S_OK; } @@ -148,7 +153,9 @@ static HRESULT WINAPI PaletteImpl_GetType(IWICPalette *iface, if (!pePaletteType) return E_INVALIDARG; + EnterCriticalSection(&This->lock); *pePaletteType = This->type; + LeaveCriticalSection(&This->lock); return S_OK; } @@ -161,7 +168,9 @@ static HRESULT WINAPI PaletteImpl_GetColorCount(IWICPalette *iface, UINT *pcCoun if (!pcCount) return E_INVALIDARG; + EnterCriticalSection(&This->lock); *pcCount = This->count; + LeaveCriticalSection(&This->lock); return S_OK; } @@ -175,12 +184,16 @@ static HRESULT WINAPI PaletteImpl_GetColors(IWICPalette *iface, UINT colorCount, if (!pColors || !pcActualColors) return E_INVALIDARG; + EnterCriticalSection(&This->lock); + if (This->count < colorCount) colorCount = This->count; memcpy(pColors, This->colors, sizeof(WICColor) * colorCount); *pcActualColors = colorCount; + LeaveCriticalSection(&This->lock); + return S_OK; } @@ -192,10 +205,12 @@ static HRESULT WINAPI PaletteImpl_IsBlackWhite(IWICPalette *iface, BOOL *pfIsBla if (!pfIsBlackWhite) return E_INVALIDARG; + EnterCriticalSection(&This->lock); if (This->type == WICBitmapPaletteTypeFixedBW) *pfIsBlackWhite = TRUE; else *pfIsBlackWhite = FALSE; + LeaveCriticalSection(&This->lock); return S_OK; } @@ -208,6 +223,7 @@ static HRESULT WINAPI PaletteImpl_IsGrayscale(IWICPalette *iface, BOOL *pfIsGray if (!pfIsGrayscale) return E_INVALIDARG; + EnterCriticalSection(&This->lock); switch(This->type) { case WICBitmapPaletteTypeFixedBW: @@ -219,6 +235,7 @@ static HRESULT WINAPI PaletteImpl_IsGrayscale(IWICPalette *iface, BOOL *pfIsGray default: *pfIsGrayscale = FALSE; } + LeaveCriticalSection(&This->lock); return S_OK; } @@ -234,12 +251,14 @@ static HRESULT WINAPI PaletteImpl_HasAlpha(IWICPalette *iface, BOOL *pfHasAlpha) *pfHasAlpha = FALSE; + EnterCriticalSection(&This->lock); for (i=0; icount; i++) if ((This->colors[i]&0xff000000) != 0xff000000) { *pfHasAlpha = TRUE; break; } + LeaveCriticalSection(&This->lock); return S_OK; } @@ -272,6 +291,8 @@ HRESULT PaletteImpl_Create(IWICPalette **palette) This->count = 0; This->colors = NULL; This->type = WICBitmapPaletteTypeCustom; + InitializeCriticalSection(&This->lock); + This->lock.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": PaletteImpl.lock"); *palette = (IWICPalette*)This; diff --git a/reactos/dll/win32/windowscodecs/pngformat.c b/reactos/dll/win32/windowscodecs/pngformat.c index 5af680e876c..3dcbd9aeb44 100644 --- a/reactos/dll/win32/windowscodecs/pngformat.c +++ b/reactos/dll/win32/windowscodecs/pngformat.c @@ -162,6 +162,7 @@ typedef struct { UINT stride; const WICPixelFormatGUID *format; BYTE *image_bits; + CRITICAL_SECTION lock; /* must be held when png structures are accessed or initialized is set */ } PngDecoder; static inline PngDecoder *impl_from_frame(IWICBitmapFrameDecode *iface) @@ -214,6 +215,8 @@ static ULONG WINAPI PngDecoder_Release(IWICBitmapDecoder *iface) { if (This->png_ptr) ppng_destroy_read_struct(&This->png_ptr, &This->info_ptr, &This->end_info); + This->lock.DebugInfo->Spare[0] = 0; + DeleteCriticalSection(&This->lock); HeapFree(GetProcessHeap(), 0, This->image_bits); HeapFree(GetProcessHeap(), 0, This); } @@ -246,7 +249,7 @@ static HRESULT WINAPI PngDecoder_Initialize(IWICBitmapDecoder *iface, IStream *p { PngDecoder *This = (PngDecoder*)iface; LARGE_INTEGER seek; - HRESULT hr; + HRESULT hr=S_OK; png_bytep *row_pointers=NULL; UINT image_size; UINT i; @@ -259,16 +262,23 @@ static HRESULT WINAPI PngDecoder_Initialize(IWICBitmapDecoder *iface, IStream *p TRACE("(%p,%p,%x)\n", iface, pIStream, cacheOptions); + EnterCriticalSection(&This->lock); + /* initialize libpng */ This->png_ptr = ppng_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); - if (!This->png_ptr) return E_FAIL; + if (!This->png_ptr) + { + hr = E_FAIL; + goto end; + } This->info_ptr = ppng_create_info_struct(This->png_ptr); if (!This->info_ptr) { ppng_destroy_read_struct(&This->png_ptr, NULL, NULL); This->png_ptr = NULL; - return E_FAIL; + hr = E_FAIL; + goto end; } This->end_info = ppng_create_info_struct(This->png_ptr); @@ -276,7 +286,8 @@ static HRESULT WINAPI PngDecoder_Initialize(IWICBitmapDecoder *iface, IStream *p { ppng_destroy_read_struct(&This->png_ptr, &This->info_ptr, NULL); This->png_ptr = NULL; - return E_FAIL; + hr = E_FAIL; + goto end; } /* set up setjmp/longjmp error handling */ @@ -285,14 +296,15 @@ static HRESULT WINAPI PngDecoder_Initialize(IWICBitmapDecoder *iface, IStream *p ppng_destroy_read_struct(&This->png_ptr, &This->info_ptr, &This->end_info); HeapFree(GetProcessHeap(), 0, row_pointers); This->png_ptr = NULL; - return E_FAIL; + hr = E_FAIL; + goto end; } ppng_set_error_fn(This->png_ptr, &jmpbuf, user_error_fn, user_warning_fn); /* seek to the start of the stream */ seek.QuadPart = 0; hr = IStream_Seek(pIStream, seek, STREAM_SEEK_SET, NULL); - if (FAILED(hr)) return hr; + if (FAILED(hr)) goto end; /* set up custom i/o handling */ ppng_set_read_fn(This->png_ptr, pIStream, user_read_data); @@ -340,7 +352,8 @@ static HRESULT WINAPI PngDecoder_Initialize(IWICBitmapDecoder *iface, IStream *p case 16: This->format = &GUID_WICPixelFormat16bppGray; break; default: ERR("invalid grayscale bit depth: %i\n", bit_depth); - return E_FAIL; + hr = E_FAIL; + goto end; } break; case PNG_COLOR_TYPE_GRAY_ALPHA: @@ -357,7 +370,8 @@ static HRESULT WINAPI PngDecoder_Initialize(IWICBitmapDecoder *iface, IStream *p case 16: This->format = &GUID_WICPixelFormat64bppRGBA; break; default: ERR("invalid RGBA bit depth: %i\n", bit_depth); - return E_FAIL; + hr = E_FAIL; + goto end; } break; case PNG_COLOR_TYPE_PALETTE: @@ -370,7 +384,8 @@ static HRESULT WINAPI PngDecoder_Initialize(IWICBitmapDecoder *iface, IStream *p case 8: This->format = &GUID_WICPixelFormat8bppIndexed; break; default: ERR("invalid indexed color bit depth: %i\n", bit_depth); - return E_FAIL; + hr = E_FAIL; + goto end; } break; case PNG_COLOR_TYPE_RGB: @@ -384,12 +399,14 @@ static HRESULT WINAPI PngDecoder_Initialize(IWICBitmapDecoder *iface, IStream *p case 16: This->format = &GUID_WICPixelFormat48bppRGB; break; default: ERR("invalid RGB color bit depth: %i\n", bit_depth); - return E_FAIL; + hr = E_FAIL; + goto end; } break; default: ERR("invalid color type %i\n", color_type); - return E_FAIL; + hr = E_FAIL; + goto end; } /* read the image data */ @@ -399,10 +416,18 @@ static HRESULT WINAPI PngDecoder_Initialize(IWICBitmapDecoder *iface, IStream *p image_size = This->stride * This->height; This->image_bits = HeapAlloc(GetProcessHeap(), 0, image_size); - if (!This->image_bits) return E_OUTOFMEMORY; + if (!This->image_bits) + { + hr = E_OUTOFMEMORY; + goto end; + } row_pointers = HeapAlloc(GetProcessHeap(), 0, sizeof(png_bytep)*This->height); - if (!row_pointers) return E_OUTOFMEMORY; + if (!row_pointers) + { + hr = E_OUTOFMEMORY; + goto end; + } for (i=0; iheight; i++) row_pointers[i] = This->image_bits + i * This->stride; @@ -416,7 +441,11 @@ static HRESULT WINAPI PngDecoder_Initialize(IWICBitmapDecoder *iface, IStream *p This->initialized = TRUE; - return S_OK; +end: + + LeaveCriticalSection(&This->lock); + + return hr; } static HRESULT WINAPI PngDecoder_GetContainerFormat(IWICBitmapDecoder *iface, @@ -570,6 +599,8 @@ static HRESULT WINAPI PngDecoder_Frame_GetResolution(IWICBitmapFrameDecode *ifac png_uint_32 ret, xres, yres; int unit_type; + EnterCriticalSection(&This->lock); + ret = ppng_get_pHYs(This->png_ptr, This->info_ptr, &xres, &yres, &unit_type); if (ret && unit_type == PNG_RESOLUTION_METER) @@ -583,6 +614,8 @@ static HRESULT WINAPI PngDecoder_Frame_GetResolution(IWICBitmapFrameDecode *ifac *pDpiX = *pDpiY = 96.0; } + LeaveCriticalSection(&This->lock); + TRACE("(%p)->(%0.2f,%0.2f)\n", iface, *pDpiX, *pDpiY); return S_OK; @@ -600,16 +633,24 @@ static HRESULT WINAPI PngDecoder_Frame_CopyPalette(IWICBitmapFrameDecode *iface, int num_trans; png_color_16p trans_values; int i; + HRESULT hr=S_OK; TRACE("(%p,%p)\n", iface, pIPalette); + EnterCriticalSection(&This->lock); + ret = ppng_get_PLTE(This->png_ptr, This->info_ptr, &png_palette, &num_palette); - if (!ret) return WINCODEC_ERR_PALETTEUNAVAILABLE; + if (!ret) + { + hr = WINCODEC_ERR_PALETTEUNAVAILABLE; + goto end; + } if (num_palette > 256) { ERR("palette has %i colors?!\n", num_palette); - return E_FAIL; + hr = E_FAIL; + goto end; } for (i=0; ilock); + + if (SUCCEEDED(hr)) + hr = IWICPalette_InitializeCustom(pIPalette, palette, num_palette); + + return hr; } static HRESULT WINAPI PngDecoder_Frame_CopyPixels(IWICBitmapFrameDecode *iface, @@ -706,6 +754,8 @@ HRESULT PngDecoder_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** ppv) This->end_info = NULL; This->initialized = FALSE; This->image_bits = NULL; + InitializeCriticalSection(&This->lock); + This->lock.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": PngDecoder.lock"); ret = IUnknown_QueryInterface((IUnknown*)This, iid, ppv); IUnknown_Release((IUnknown*)This); @@ -752,6 +802,7 @@ typedef struct PngEncoder { UINT lines_written; BOOL frame_committed; BOOL committed; + CRITICAL_SECTION lock; } PngEncoder; static inline PngEncoder *encoder_from_frame(IWICBitmapFrameEncode *iface) @@ -800,10 +851,18 @@ static HRESULT WINAPI PngFrameEncode_Initialize(IWICBitmapFrameEncode *iface, PngEncoder *This = encoder_from_frame(iface); TRACE("(%p,%p)\n", iface, pIEncoderOptions); - if (This->frame_initialized) return WINCODEC_ERR_WRONGSTATE; + EnterCriticalSection(&This->lock); + + if (This->frame_initialized) + { + LeaveCriticalSection(&This->lock); + return WINCODEC_ERR_WRONGSTATE; + } This->frame_initialized = TRUE; + LeaveCriticalSection(&This->lock); + return S_OK; } @@ -813,11 +872,19 @@ static HRESULT WINAPI PngFrameEncode_SetSize(IWICBitmapFrameEncode *iface, PngEncoder *This = encoder_from_frame(iface); TRACE("(%p,%u,%u)\n", iface, uiWidth, uiHeight); - if (!This->frame_initialized || This->info_written) return WINCODEC_ERR_WRONGSTATE; + EnterCriticalSection(&This->lock); + + if (!This->frame_initialized || This->info_written) + { + LeaveCriticalSection(&This->lock); + return WINCODEC_ERR_WRONGSTATE; + } This->width = uiWidth; This->height = uiHeight; + LeaveCriticalSection(&This->lock); + return S_OK; } @@ -827,11 +894,19 @@ static HRESULT WINAPI PngFrameEncode_SetResolution(IWICBitmapFrameEncode *iface, PngEncoder *This = encoder_from_frame(iface); TRACE("(%p,%0.2f,%0.2f)\n", iface, dpiX, dpiY); - if (!This->frame_initialized || This->info_written) return WINCODEC_ERR_WRONGSTATE; + EnterCriticalSection(&This->lock); + + if (!This->frame_initialized || This->info_written) + { + LeaveCriticalSection(&This->lock); + return WINCODEC_ERR_WRONGSTATE; + } This->xres = dpiX; This->yres = dpiY; + LeaveCriticalSection(&This->lock); + return S_OK; } @@ -842,7 +917,13 @@ static HRESULT WINAPI PngFrameEncode_SetPixelFormat(IWICBitmapFrameEncode *iface int i; TRACE("(%p,%s)\n", iface, debugstr_guid(pPixelFormat)); - if (!This->frame_initialized || This->info_written) return WINCODEC_ERR_WRONGSTATE; + EnterCriticalSection(&This->lock); + + if (!This->frame_initialized || This->info_written) + { + LeaveCriticalSection(&This->lock); + return WINCODEC_ERR_WRONGSTATE; + } for (i=0; formats[i].guid; i++) { @@ -855,6 +936,8 @@ static HRESULT WINAPI PngFrameEncode_SetPixelFormat(IWICBitmapFrameEncode *iface This->format = &formats[i]; memcpy(pPixelFormat, This->format->guid, sizeof(GUID)); + LeaveCriticalSection(&This->lock); + return S_OK; } @@ -888,15 +971,24 @@ static HRESULT WINAPI PngFrameEncode_WritePixels(IWICBitmapFrameEncode *iface, jmp_buf jmpbuf; TRACE("(%p,%u,%u,%u,%p)\n", iface, lineCount, cbStride, cbBufferSize, pbPixels); + EnterCriticalSection(&This->lock); + if (!This->frame_initialized || !This->width || !This->height || !This->format) + { + LeaveCriticalSection(&This->lock); return WINCODEC_ERR_WRONGSTATE; + } if (lineCount == 0 || lineCount + This->lines_written > This->height) + { + LeaveCriticalSection(&This->lock); return E_INVALIDARG; + } /* set up setjmp/longjmp error handling */ if (setjmp(jmpbuf)) { + LeaveCriticalSection(&This->lock); HeapFree(GetProcessHeap(), 0, row_pointers); return E_FAIL; } @@ -927,7 +1019,10 @@ static HRESULT WINAPI PngFrameEncode_WritePixels(IWICBitmapFrameEncode *iface, row_pointers = HeapAlloc(GetProcessHeap(), 0, lineCount * sizeof(png_byte*)); if (!row_pointers) + { + LeaveCriticalSection(&This->lock); return E_OUTOFMEMORY; + } for (i=0; ipng_ptr, row_pointers, lineCount); This->lines_written += lineCount; + LeaveCriticalSection(&This->lock); + HeapFree(GetProcessHeap(), 0, row_pointers); return S_OK; @@ -1019,12 +1116,18 @@ static HRESULT WINAPI PngFrameEncode_Commit(IWICBitmapFrameEncode *iface) jmp_buf jmpbuf; TRACE("(%p)\n", iface); + EnterCriticalSection(&This->lock); + if (!This->info_written || This->lines_written != This->height || This->frame_committed) + { + LeaveCriticalSection(&This->lock); return WINCODEC_ERR_WRONGSTATE; + } /* set up setjmp/longjmp error handling */ if (setjmp(jmpbuf)) { + LeaveCriticalSection(&This->lock); return E_FAIL; } ppng_set_error_fn(This->png_ptr, &jmpbuf, user_error_fn, user_warning_fn); @@ -1033,6 +1136,8 @@ static HRESULT WINAPI PngFrameEncode_Commit(IWICBitmapFrameEncode *iface) This->frame_committed = TRUE; + LeaveCriticalSection(&This->lock); + return S_OK; } @@ -1102,6 +1207,8 @@ static ULONG WINAPI PngEncoder_Release(IWICBitmapEncoder *iface) if (ref == 0) { + This->lock.DebugInfo->Spare[0] = 0; + DeleteCriticalSection(&This->lock); if (This->png_ptr) ppng_destroy_write_struct(&This->png_ptr, &This->info_ptr); if (This->stream) @@ -1137,19 +1244,28 @@ static HRESULT WINAPI PngEncoder_Initialize(IWICBitmapEncoder *iface, TRACE("(%p,%p,%u)\n", iface, pIStream, cacheOption); + EnterCriticalSection(&This->lock); + if (This->png_ptr) + { + LeaveCriticalSection(&This->lock); return WINCODEC_ERR_WRONGSTATE; + } /* initialize libpng */ This->png_ptr = ppng_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); if (!This->png_ptr) + { + LeaveCriticalSection(&This->lock); return E_FAIL; + } This->info_ptr = ppng_create_info_struct(This->png_ptr); if (!This->info_ptr) { ppng_destroy_write_struct(&This->png_ptr, NULL); This->png_ptr = NULL; + LeaveCriticalSection(&This->lock); return E_FAIL; } @@ -1163,6 +1279,7 @@ static HRESULT WINAPI PngEncoder_Initialize(IWICBitmapEncoder *iface, This->png_ptr = NULL; IStream_Release(This->stream); This->stream = NULL; + LeaveCriticalSection(&This->lock); return E_FAIL; } ppng_set_error_fn(This->png_ptr, &jmpbuf, user_error_fn, user_warning_fn); @@ -1170,6 +1287,8 @@ static HRESULT WINAPI PngEncoder_Initialize(IWICBitmapEncoder *iface, /* set up custom i/o handling */ ppng_set_write_fn(This->png_ptr, This, user_write_data, user_flush); + LeaveCriticalSection(&This->lock); + return S_OK; } @@ -1219,17 +1338,31 @@ static HRESULT WINAPI PngEncoder_CreateNewFrame(IWICBitmapEncoder *iface, HRESULT hr; TRACE("(%p,%p,%p)\n", iface, ppIFrameEncode, ppIEncoderOptions); + EnterCriticalSection(&This->lock); + if (This->frame_count != 0) + { + LeaveCriticalSection(&This->lock); return WINCODEC_ERR_UNSUPPORTEDOPERATION; + } if (!This->stream) + { + LeaveCriticalSection(&This->lock); return WINCODEC_ERR_NOTINITIALIZED; + } hr = CreatePropertyBag2(ppIEncoderOptions); - if (FAILED(hr)) return hr; + if (FAILED(hr)) + { + LeaveCriticalSection(&This->lock); + return hr; + } This->frame_count = 1; + LeaveCriticalSection(&This->lock); + IWICBitmapEncoder_AddRef(iface); *ppIFrameEncode = (IWICBitmapFrameEncode*)&This->lpFrameVtbl; @@ -1241,11 +1374,18 @@ static HRESULT WINAPI PngEncoder_Commit(IWICBitmapEncoder *iface) PngEncoder *This = (PngEncoder*)iface; TRACE("(%p)\n", iface); + EnterCriticalSection(&This->lock); + if (!This->frame_committed || This->committed) + { + LeaveCriticalSection(&This->lock); return WINCODEC_ERR_WRONGSTATE; + } This->committed = TRUE; + EnterCriticalSection(&This->lock); + return S_OK; } @@ -1309,6 +1449,8 @@ HRESULT PngEncoder_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** ppv) This->lines_written = 0; This->frame_committed = FALSE; This->committed = FALSE; + InitializeCriticalSection(&This->lock); + This->lock.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": PngEncoder.lock"); ret = IUnknown_QueryInterface((IUnknown*)This, iid, ppv); IUnknown_Release((IUnknown*)This); diff --git a/reactos/dll/win32/windowscodecs/regsvr.c b/reactos/dll/win32/windowscodecs/regsvr.c index c87aa4b2458..c5828a6b8b9 100644 --- a/reactos/dll/win32/windowscodecs/regsvr.c +++ b/reactos/dll/win32/windowscodecs/regsvr.c @@ -727,25 +727,25 @@ static struct regsvr_coclass const coclass_list[] = { "WIC Imaging Factory", NULL, "windowscodecs.dll", - "Apartment" + "Both" }, { &CLSID_WICBmpDecoder, "WIC BMP Decoder", NULL, "windowscodecs.dll", - "Apartment" + "Both" }, { &CLSID_WICPngDecoder, "WIC PNG Decoder", NULL, "windowscodecs.dll", - "Apartment" + "Both" }, { &CLSID_WICPngEncoder, "WIC PNG Encoder", NULL, "windowscodecs.dll", - "Apartment" + "Both" }, { &CLSID_WICBmpEncoder, "WIC BMP Encoder", @@ -757,25 +757,31 @@ static struct regsvr_coclass const coclass_list[] = { "WIC GIF Decoder", NULL, "windowscodecs.dll", - "Apartment" + "Both" }, { &CLSID_WICIcoDecoder, "WIC ICO Decoder", NULL, "windowscodecs.dll", - "Apartment" + "Both" }, { &CLSID_WICJpegDecoder, "WIC JPEG Decoder", NULL, "windowscodecs.dll", - "Apartment" + "Both" + }, + { &CLSID_WICTiffDecoder, + "WIC TIFF Decoder", + NULL, + "windowscodecs.dll", + "Both" }, { &CLSID_WICDefaultFormatConverter, "WIC Default Format Converter", NULL, "windowscodecs.dll", - "Apartment" + "Both" }, { NULL } /* list terminator */ }; @@ -868,6 +874,27 @@ static struct decoder_pattern const png_patterns[] = { {0} }; +static const BYTE tiff_magic_le[] = {0x49,0x49,42,0}; +static const BYTE tiff_magic_be[] = {0x4d,0x4d,0,42}; + +static GUID const * const tiff_formats[] = { + &GUID_WICPixelFormatBlackWhite, + &GUID_WICPixelFormat4bppGray, + &GUID_WICPixelFormat8bppGray, + &GUID_WICPixelFormat4bppIndexed, + &GUID_WICPixelFormat8bppIndexed, + &GUID_WICPixelFormat32bppBGR, + &GUID_WICPixelFormat32bppBGRA, + &GUID_WICPixelFormat32bppPBGRA, + NULL +}; + +static struct decoder_pattern const tiff_patterns[] = { + {4,0,tiff_magic_le,mask_all,0}, + {4,0,tiff_magic_be,mask_all,0}, + {0} +}; + static struct regsvr_decoder const decoder_list[] = { { &CLSID_WICBmpDecoder, "The Wine Project", @@ -919,6 +946,16 @@ static struct regsvr_decoder const decoder_list[] = { png_formats, png_patterns }, + { &CLSID_WICTiffDecoder, + "The Wine Project", + "TIFF Decoder", + "1.0.0.0", + &GUID_VendorMicrosoft, + "image/tiff", + ".tif;.tiff", + tiff_formats, + tiff_patterns + }, { NULL } /* list terminator */ }; diff --git a/reactos/dll/win32/windowscodecs/stream.c b/reactos/dll/win32/windowscodecs/stream.c index c59a9d27861..bd5592b9f30 100644 --- a/reactos/dll/win32/windowscodecs/stream.c +++ b/reactos/dll/win32/windowscodecs/stream.c @@ -41,6 +41,8 @@ typedef struct StreamOnMemory { BYTE *pbMemory; DWORD dwMemsize; DWORD dwCurPos; + + CRITICAL_SECTION lock; /* must be held when pbMemory or dwCurPos is accessed */ } StreamOnMemory; static HRESULT WINAPI StreamOnMemory_QueryInterface(IStream *iface, @@ -82,6 +84,8 @@ static ULONG WINAPI StreamOnMemory_Release(IStream *iface) TRACE("(%p) refcount=%u\n", iface, ref); if (ref == 0) { + This->lock.DebugInfo->Spare[0] = 0; + DeleteCriticalSection(&This->lock); HeapFree(GetProcessHeap(), 0, This); } return ref; @@ -96,9 +100,12 @@ static HRESULT WINAPI StreamOnMemory_Read(IStream *iface, if (!pv) return E_INVALIDARG; + EnterCriticalSection(&This->lock); uBytesRead = min(cb, This->dwMemsize - This->dwCurPos); memcpy(pv, This->pbMemory + This->dwCurPos, uBytesRead); This->dwCurPos += uBytesRead; + LeaveCriticalSection(&This->lock); + if (pcbRead) *pcbRead = uBytesRead; return S_OK; @@ -108,18 +115,24 @@ static HRESULT WINAPI StreamOnMemory_Write(IStream *iface, void const *pv, ULONG cb, ULONG *pcbWritten) { StreamOnMemory *This = (StreamOnMemory*)iface; + HRESULT hr; TRACE("(%p)\n", This); if (!pv) return E_INVALIDARG; - if (cb > This->dwMemsize - This->dwCurPos) return STG_E_MEDIUMFULL; - if (cb) { + EnterCriticalSection(&This->lock); + if (cb > This->dwMemsize - This->dwCurPos) { + hr = STG_E_MEDIUMFULL; + } + else { memcpy(This->pbMemory + This->dwCurPos, pv, cb); This->dwCurPos += cb; + hr = S_OK; + if (pcbWritten) *pcbWritten = cb; } - if (pcbWritten) *pcbWritten = cb; + LeaveCriticalSection(&This->lock); - return S_OK; + return hr; } static HRESULT WINAPI StreamOnMemory_Seek(IStream *iface, @@ -127,20 +140,29 @@ static HRESULT WINAPI StreamOnMemory_Seek(IStream *iface, { StreamOnMemory *This = (StreamOnMemory*)iface; LARGE_INTEGER NewPosition; + HRESULT hr=S_OK; TRACE("(%p)\n", This); + EnterCriticalSection(&This->lock); if (dwOrigin == STREAM_SEEK_SET) NewPosition.QuadPart = dlibMove.QuadPart; else if (dwOrigin == STREAM_SEEK_CUR) NewPosition.QuadPart = This->dwCurPos + dlibMove.QuadPart; else if (dwOrigin == STREAM_SEEK_END) NewPosition.QuadPart = This->dwMemsize + dlibMove.QuadPart; - else return E_INVALIDARG; + else hr = E_INVALIDARG; - if (NewPosition.u.HighPart) return HRESULT_FROM_WIN32(ERROR_ARITHMETIC_OVERFLOW); - if (NewPosition.QuadPart > This->dwMemsize) return E_INVALIDARG; - if (NewPosition.QuadPart < 0) return E_INVALIDARG; - This->dwCurPos = NewPosition.u.LowPart; + if (SUCCEEDED(hr)) { + if (NewPosition.u.HighPart) hr = HRESULT_FROM_WIN32(ERROR_ARITHMETIC_OVERFLOW); + else if (NewPosition.QuadPart > This->dwMemsize) hr = E_INVALIDARG; + else if (NewPosition.QuadPart < 0) hr = E_INVALIDARG; + } - if(plibNewPosition) plibNewPosition->QuadPart = This->dwCurPos; - return S_OK; + if (SUCCEEDED(hr)) { + This->dwCurPos = NewPosition.u.LowPart; + + if(plibNewPosition) plibNewPosition->QuadPart = This->dwCurPos; + } + LeaveCriticalSection(&This->lock); + + return hr; } /* SetSize isn't implemented in the native windowscodecs DLL either */ @@ -450,8 +472,16 @@ static HRESULT WINAPI IWICStreamImpl_InitializeFromMemory(IWICStream *iface, pObject->pbMemory = pbBuffer; pObject->dwMemsize = cbBufferSize; pObject->dwCurPos = 0; + InitializeCriticalSection(&pObject->lock); + pObject->lock.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": StreamOnMemory.lock"); + + if (InterlockedCompareExchangePointer((void**)&This->pStream, pObject, NULL)) + { + /* Some other thread set the stream first. */ + IStream_Release((IStream*)pObject); + return WINCODEC_ERR_WRONGSTATE; + } - This->pStream = (IStream*)pObject; return S_OK; } diff --git a/reactos/dll/win32/windowscodecs/tiffformat.c b/reactos/dll/win32/windowscodecs/tiffformat.c new file mode 100644 index 00000000000..fe87ddd6ba5 --- /dev/null +++ b/reactos/dll/win32/windowscodecs/tiffformat.c @@ -0,0 +1,866 @@ +/* + * Copyright 2010 Vincent Povirk for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "config.h" +#include "wine/port.h" + +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#ifdef HAVE_TIFFIO_H +#include +#endif + +#define COBJMACROS + +#include "windef.h" +#include "winbase.h" +#include "objbase.h" +#include "wincodec.h" + +#include "wincodecs_private.h" + +#include "wine/debug.h" +#include "wine/library.h" + +WINE_DEFAULT_DEBUG_CHANNEL(wincodecs); + +#ifdef SONAME_LIBTIFF + +static CRITICAL_SECTION init_tiff_cs; +static CRITICAL_SECTION_DEBUG init_tiff_cs_debug = +{ + 0, 0, &init_tiff_cs, + { &init_tiff_cs_debug.ProcessLocksList, + &init_tiff_cs_debug.ProcessLocksList }, + 0, 0, { (DWORD_PTR)(__FILE__ ": init_tiff_cs") } +}; +static CRITICAL_SECTION init_tiff_cs = { &init_tiff_cs_debug, -1, 0, 0, 0, 0 }; + +static void *libtiff_handle; +#define MAKE_FUNCPTR(f) static typeof(f) * p##f +MAKE_FUNCPTR(TIFFClientOpen); +MAKE_FUNCPTR(TIFFClose); +MAKE_FUNCPTR(TIFFCurrentDirectory); +MAKE_FUNCPTR(TIFFGetField); +MAKE_FUNCPTR(TIFFReadDirectory); +MAKE_FUNCPTR(TIFFReadEncodedStrip); +MAKE_FUNCPTR(TIFFSetDirectory); +#undef MAKE_FUNCPTR + +static void *load_libtiff(void) +{ + void *result; + + EnterCriticalSection(&init_tiff_cs); + + if (!libtiff_handle && + (libtiff_handle = wine_dlopen(SONAME_LIBTIFF, RTLD_NOW, NULL, 0)) != NULL) + { + +#define LOAD_FUNCPTR(f) \ + if((p##f = wine_dlsym(libtiff_handle, #f, NULL, 0)) == NULL) { \ + ERR("failed to load symbol %s\n", #f); \ + libtiff_handle = NULL; \ + LeaveCriticalSection(&init_tiff_cs); \ + return NULL; \ + } + LOAD_FUNCPTR(TIFFClientOpen); + LOAD_FUNCPTR(TIFFClose); + LOAD_FUNCPTR(TIFFCurrentDirectory); + LOAD_FUNCPTR(TIFFGetField); + LOAD_FUNCPTR(TIFFReadDirectory); + LOAD_FUNCPTR(TIFFReadEncodedStrip); + LOAD_FUNCPTR(TIFFSetDirectory); +#undef LOAD_FUNCPTR + + } + + result = libtiff_handle; + + LeaveCriticalSection(&init_tiff_cs); + return result; +} + +static tsize_t tiff_stream_read(thandle_t client_data, tdata_t data, tsize_t size) +{ + IStream *stream = (IStream*)client_data; + ULONG bytes_read; + HRESULT hr; + + hr = IStream_Read(stream, data, size, &bytes_read); + if (FAILED(hr)) bytes_read = 0; + return bytes_read; +} + +static tsize_t tiff_stream_write(thandle_t client_data, tdata_t data, tsize_t size) +{ + IStream *stream = (IStream*)client_data; + ULONG bytes_written; + HRESULT hr; + + hr = IStream_Write(stream, data, size, &bytes_written); + if (FAILED(hr)) bytes_written = 0; + return bytes_written; +} + +static toff_t tiff_stream_seek(thandle_t client_data, toff_t offset, int whence) +{ + IStream *stream = (IStream*)client_data; + LARGE_INTEGER move; + DWORD origin; + ULARGE_INTEGER new_position; + HRESULT hr; + + move.QuadPart = offset; + switch (whence) + { + case SEEK_SET: + origin = STREAM_SEEK_SET; + break; + case SEEK_CUR: + origin = STREAM_SEEK_CUR; + break; + case SEEK_END: + origin = STREAM_SEEK_END; + break; + default: + ERR("unknown whence value %i\n", whence); + return -1; + } + + hr = IStream_Seek(stream, move, origin, &new_position); + if (SUCCEEDED(hr)) return new_position.QuadPart; + else return -1; +} + +static int tiff_stream_close(thandle_t client_data) +{ + /* Caller is responsible for releasing the stream object. */ + return 0; +} + +static toff_t tiff_stream_size(thandle_t client_data) +{ + IStream *stream = (IStream*)client_data; + STATSTG statstg; + HRESULT hr; + + hr = IStream_Stat(stream, &statstg, STATFLAG_NONAME); + + if (SUCCEEDED(hr)) return statstg.cbSize.QuadPart; + else return -1; +} + +static int tiff_stream_map(thandle_t client_data, tdata_t *addr, toff_t *size) +{ + /* Cannot mmap streams */ + return 0; +} + +static void tiff_stream_unmap(thandle_t client_data, tdata_t addr, toff_t size) +{ + /* No need to ever do this, since we can't map things. */ +} + +static TIFF* tiff_open_stream(IStream *stream, const char *mode) +{ + return pTIFFClientOpen("", mode, stream, tiff_stream_read, + tiff_stream_write, tiff_stream_seek, tiff_stream_close, + tiff_stream_size, tiff_stream_map, tiff_stream_unmap); +} + +typedef struct { + const IWICBitmapDecoderVtbl *lpVtbl; + LONG ref; + IStream *stream; + CRITICAL_SECTION lock; /* Must be held when tiff is used or initiailzed is set */ + TIFF *tiff; + BOOL initialized; +} TiffDecoder; + +typedef struct { + const WICPixelFormatGUID *format; + int bpp; + int indexed; + int reverse_bgr; + UINT width, height; + UINT tile_width, tile_height; + UINT tile_stride; + UINT tile_size; +} tiff_decode_info; + +typedef struct { + const IWICBitmapFrameDecodeVtbl *lpVtbl; + LONG ref; + TiffDecoder *parent; + UINT index; + tiff_decode_info decode_info; + INT cached_tile_x, cached_tile_y; + BYTE *cached_tile; +} TiffFrameDecode; + +static const IWICBitmapFrameDecodeVtbl TiffFrameDecode_Vtbl; + +static HRESULT tiff_get_decode_info(TIFF *tiff, tiff_decode_info *decode_info) +{ + uint16 photometric, bps, samples, planar; + int ret; + + decode_info->indexed = 0; + decode_info->reverse_bgr = 0; + + ret = pTIFFGetField(tiff, TIFFTAG_PHOTOMETRIC, &photometric); + if (!ret) + { + WARN("missing PhotometricInterpretation tag\n"); + return E_FAIL; + } + + ret = pTIFFGetField(tiff, TIFFTAG_BITSPERSAMPLE, &bps); + if (!ret) bps = 1; + + switch(photometric) + { + case 1: /* BlackIsZero */ + decode_info->bpp = bps; + switch (bps) + { + case 1: + decode_info->format = &GUID_WICPixelFormatBlackWhite; + break; + case 4: + decode_info->format = &GUID_WICPixelFormat4bppGray; + break; + case 8: + decode_info->format = &GUID_WICPixelFormat8bppGray; + break; + default: + FIXME("unhandled greyscale bit count %u\n", bps); + return E_FAIL; + } + break; + case 2: /* RGB */ + if (bps != 8) + { + FIXME("unhandled RGB bit count %u\n", bps); + return E_FAIL; + } + ret = pTIFFGetField(tiff, TIFFTAG_SAMPLESPERPIXEL, &samples); + if (samples != 3) + { + FIXME("unhandled RGB sample count %u\n", samples); + return E_FAIL; + } + ret = pTIFFGetField(tiff, TIFFTAG_PLANARCONFIG, &planar); + if (!ret) planar = 1; + if (planar != 1) + { + FIXME("unhandled planar configuration %u\n", planar); + return E_FAIL; + } + decode_info->bpp = bps * samples; + decode_info->reverse_bgr = 1; + decode_info->format = &GUID_WICPixelFormat24bppBGR; + break; + case 3: /* RGB Palette */ + decode_info->indexed = 1; + decode_info->bpp = bps; + switch (bps) + { + case 4: + decode_info->format = &GUID_WICPixelFormat4bppIndexed; + break; + case 8: + decode_info->format = &GUID_WICPixelFormat8bppIndexed; + break; + default: + FIXME("unhandled indexed bit count %u\n", bps); + return E_FAIL; + } + break; + case 0: /* WhiteIsZero */ + case 4: /* Transparency mask */ + case 5: /* CMYK */ + case 6: /* YCbCr */ + case 8: /* CIELab */ + default: + FIXME("unhandled PhotometricInterpretation %u\n", photometric); + return E_FAIL; + } + + ret = pTIFFGetField(tiff, TIFFTAG_IMAGEWIDTH, &decode_info->width); + if (!ret) + { + WARN("missing image width\n"); + return E_FAIL; + } + + ret = pTIFFGetField(tiff, TIFFTAG_IMAGELENGTH, &decode_info->height); + if (!ret) + { + WARN("missing image length\n"); + return E_FAIL; + } + + ret = pTIFFGetField(tiff, TIFFTAG_ROWSPERSTRIP, &decode_info->tile_height); + if (ret) + { + decode_info->tile_width = decode_info->width; + decode_info->tile_stride = ((decode_info->bpp * decode_info->tile_width + 7)/8); + decode_info->tile_size = decode_info->tile_height * decode_info->tile_stride; + } + else + { + /* Probably a tiled image */ + FIXME("missing RowsPerStrip value\n"); + return E_FAIL; + } + + return S_OK; +} + +static HRESULT WINAPI TiffDecoder_QueryInterface(IWICBitmapDecoder *iface, REFIID iid, + void **ppv) +{ + TiffDecoder *This = (TiffDecoder*)iface; + TRACE("(%p,%s,%p)\n", iface, debugstr_guid(iid), ppv); + + if (!ppv) return E_INVALIDARG; + + if (IsEqualIID(&IID_IUnknown, iid) || IsEqualIID(&IID_IWICBitmapDecoder, iid)) + { + *ppv = This; + } + else + { + *ppv = NULL; + return E_NOINTERFACE; + } + + IUnknown_AddRef((IUnknown*)*ppv); + return S_OK; +} + +static ULONG WINAPI TiffDecoder_AddRef(IWICBitmapDecoder *iface) +{ + TiffDecoder *This = (TiffDecoder*)iface; + ULONG ref = InterlockedIncrement(&This->ref); + + TRACE("(%p) refcount=%u\n", iface, ref); + + return ref; +} + +static ULONG WINAPI TiffDecoder_Release(IWICBitmapDecoder *iface) +{ + TiffDecoder *This = (TiffDecoder*)iface; + ULONG ref = InterlockedDecrement(&This->ref); + + TRACE("(%p) refcount=%u\n", iface, ref); + + if (ref == 0) + { + if (This->tiff) pTIFFClose(This->tiff); + if (This->stream) IStream_Release(This->stream); + This->lock.DebugInfo->Spare[0] = 0; + DeleteCriticalSection(&This->lock); + HeapFree(GetProcessHeap(), 0, This); + } + + return ref; +} + +static HRESULT WINAPI TiffDecoder_QueryCapability(IWICBitmapDecoder *iface, IStream *pIStream, + DWORD *pdwCapability) +{ + FIXME("(%p,%p,%p): stub\n", iface, pIStream, pdwCapability); + return E_NOTIMPL; +} + +static HRESULT WINAPI TiffDecoder_Initialize(IWICBitmapDecoder *iface, IStream *pIStream, + WICDecodeOptions cacheOptions) +{ + TiffDecoder *This = (TiffDecoder*)iface; + TIFF *tiff; + HRESULT hr=S_OK; + + TRACE("(%p,%p,%x): stub\n", iface, pIStream, cacheOptions); + + EnterCriticalSection(&This->lock); + + if (This->initialized) + { + hr = WINCODEC_ERR_WRONGSTATE; + goto exit; + } + + tiff = tiff_open_stream(pIStream, "r"); + + if (!tiff) + { + hr = E_FAIL; + goto exit; + } + + This->tiff = tiff; + This->stream = pIStream; + IStream_AddRef(pIStream); + This->initialized = TRUE; + +exit: + LeaveCriticalSection(&This->lock); + return hr; +} + +static HRESULT WINAPI TiffDecoder_GetContainerFormat(IWICBitmapDecoder *iface, + GUID *pguidContainerFormat) +{ + memcpy(pguidContainerFormat, &GUID_ContainerFormatTiff, sizeof(GUID)); + return S_OK; +} + +static HRESULT WINAPI TiffDecoder_GetDecoderInfo(IWICBitmapDecoder *iface, + IWICBitmapDecoderInfo **ppIDecoderInfo) +{ + FIXME("(%p,%p): stub\n", iface, ppIDecoderInfo); + return E_NOTIMPL; +} + +static HRESULT WINAPI TiffDecoder_CopyPalette(IWICBitmapDecoder *iface, + IWICPalette *pIPalette) +{ + FIXME("(%p,%p): stub\n", iface, pIPalette); + return E_NOTIMPL; +} + +static HRESULT WINAPI TiffDecoder_GetMetadataQueryReader(IWICBitmapDecoder *iface, + IWICMetadataQueryReader **ppIMetadataQueryReader) +{ + FIXME("(%p,%p): stub\n", iface, ppIMetadataQueryReader); + return E_NOTIMPL; +} + +static HRESULT WINAPI TiffDecoder_GetPreview(IWICBitmapDecoder *iface, + IWICBitmapSource **ppIBitmapSource) +{ + FIXME("(%p,%p): stub\n", iface, ppIBitmapSource); + return E_NOTIMPL; +} + +static HRESULT WINAPI TiffDecoder_GetColorContexts(IWICBitmapDecoder *iface, + UINT cCount, IWICColorContext **ppIColorContexts, UINT *pcActualCount) +{ + FIXME("(%p,%u,%p,%p)\n", iface, cCount, ppIColorContexts, pcActualCount); + return E_NOTIMPL; +} + +static HRESULT WINAPI TiffDecoder_GetThumbnail(IWICBitmapDecoder *iface, + IWICBitmapSource **ppIThumbnail) +{ + TRACE("(%p,%p)\n", iface, ppIThumbnail); + return WINCODEC_ERR_CODECNOTHUMBNAIL; +} + +static HRESULT WINAPI TiffDecoder_GetFrameCount(IWICBitmapDecoder *iface, + UINT *pCount) +{ + TiffDecoder *This = (TiffDecoder*)iface; + + if (!This->tiff) + { + WARN("(%p) <-- WINCODEC_ERR_WRONGSTATE\n", iface); + return WINCODEC_ERR_WRONGSTATE; + } + + EnterCriticalSection(&This->lock); + while (pTIFFReadDirectory(This->tiff)) { } + *pCount = pTIFFCurrentDirectory(This->tiff)+1; + LeaveCriticalSection(&This->lock); + + TRACE("(%p) <-- %i\n", iface, *pCount); + + return S_OK; +} + +static HRESULT WINAPI TiffDecoder_GetFrame(IWICBitmapDecoder *iface, + UINT index, IWICBitmapFrameDecode **ppIBitmapFrame) +{ + TiffDecoder *This = (TiffDecoder*)iface; + TiffFrameDecode *result; + int res; + tiff_decode_info decode_info; + HRESULT hr; + + TRACE("(%p,%u,%p)\n", iface, index, ppIBitmapFrame); + + if (!This->tiff) + return WINCODEC_ERR_WRONGSTATE; + + EnterCriticalSection(&This->lock); + res = pTIFFSetDirectory(This->tiff, index); + if (!res) hr = E_INVALIDARG; + else hr = tiff_get_decode_info(This->tiff, &decode_info); + LeaveCriticalSection(&This->lock); + + if (SUCCEEDED(hr)) + { + result = HeapAlloc(GetProcessHeap(), 0, sizeof(TiffFrameDecode)); + + if (result) + { + result->lpVtbl = &TiffFrameDecode_Vtbl; + result->ref = 1; + result->parent = This; + result->index = index; + result->decode_info = decode_info; + result->cached_tile_x = -1; + result->cached_tile = HeapAlloc(GetProcessHeap(), 0, decode_info.tile_size); + + if (result->cached_tile) + *ppIBitmapFrame = (IWICBitmapFrameDecode*)result; + else + { + hr = E_OUTOFMEMORY; + HeapFree(GetProcessHeap(), 0, result); + } + } + else hr = E_OUTOFMEMORY; + } + + if (FAILED(hr)) *ppIBitmapFrame = NULL; + + return hr; +} + +static const IWICBitmapDecoderVtbl TiffDecoder_Vtbl = { + TiffDecoder_QueryInterface, + TiffDecoder_AddRef, + TiffDecoder_Release, + TiffDecoder_QueryCapability, + TiffDecoder_Initialize, + TiffDecoder_GetContainerFormat, + TiffDecoder_GetDecoderInfo, + TiffDecoder_CopyPalette, + TiffDecoder_GetMetadataQueryReader, + TiffDecoder_GetPreview, + TiffDecoder_GetColorContexts, + TiffDecoder_GetThumbnail, + TiffDecoder_GetFrameCount, + TiffDecoder_GetFrame +}; + +static HRESULT WINAPI TiffFrameDecode_QueryInterface(IWICBitmapFrameDecode *iface, REFIID iid, + void **ppv) +{ + TiffFrameDecode *This = (TiffFrameDecode*)iface; + TRACE("(%p,%s,%p)\n", iface, debugstr_guid(iid), ppv); + + if (!ppv) return E_INVALIDARG; + + if (IsEqualIID(&IID_IUnknown, iid) || + IsEqualIID(&IID_IWICBitmapSource, iid) || + IsEqualIID(&IID_IWICBitmapFrameDecode, iid)) + { + *ppv = This; + } + else + { + *ppv = NULL; + return E_NOINTERFACE; + } + + IUnknown_AddRef((IUnknown*)*ppv); + return S_OK; +} + +static ULONG WINAPI TiffFrameDecode_AddRef(IWICBitmapFrameDecode *iface) +{ + TiffFrameDecode *This = (TiffFrameDecode*)iface; + ULONG ref = InterlockedIncrement(&This->ref); + + TRACE("(%p) refcount=%u\n", iface, ref); + + return ref; +} + +static ULONG WINAPI TiffFrameDecode_Release(IWICBitmapFrameDecode *iface) +{ + TiffFrameDecode *This = (TiffFrameDecode*)iface; + ULONG ref = InterlockedDecrement(&This->ref); + + TRACE("(%p) refcount=%u\n", iface, ref); + + if (ref == 0) + { + HeapFree(GetProcessHeap(), 0, This->cached_tile); + HeapFree(GetProcessHeap(), 0, This); + } + + return ref; +} + +static HRESULT WINAPI TiffFrameDecode_GetSize(IWICBitmapFrameDecode *iface, + UINT *puiWidth, UINT *puiHeight) +{ + TiffFrameDecode *This = (TiffFrameDecode*)iface; + + *puiWidth = This->decode_info.width; + *puiHeight = This->decode_info.height; + + TRACE("(%p) <-- %ux%u\n", iface, *puiWidth, *puiHeight); + + return S_OK; +} + +static HRESULT WINAPI TiffFrameDecode_GetPixelFormat(IWICBitmapFrameDecode *iface, + WICPixelFormatGUID *pPixelFormat) +{ + TiffFrameDecode *This = (TiffFrameDecode*)iface; + + memcpy(pPixelFormat, This->decode_info.format, sizeof(GUID)); + + TRACE("(%p) <-- %s\n", This, debugstr_guid(This->decode_info.format)); + + return S_OK; +} + +static HRESULT WINAPI TiffFrameDecode_GetResolution(IWICBitmapFrameDecode *iface, + double *pDpiX, double *pDpiY) +{ + FIXME("(%p,%p,%p)\n", iface, pDpiX, pDpiY); + return E_NOTIMPL; +} + +static HRESULT WINAPI TiffFrameDecode_CopyPalette(IWICBitmapFrameDecode *iface, + IWICPalette *pIPalette) +{ + FIXME("(%p,%p)\n", iface, pIPalette); + return E_NOTIMPL; +} + +static HRESULT TiffFrameDecode_ReadTile(TiffFrameDecode *This, UINT tile_x, UINT tile_y) +{ + HRESULT hr=S_OK; + tsize_t ret; + + ret = pTIFFSetDirectory(This->parent->tiff, This->index); + + if (ret == -1) + hr = E_FAIL; + + if (hr == S_OK) + { + ret = pTIFFReadEncodedStrip(This->parent->tiff, tile_y, This->cached_tile, This->decode_info.tile_size); + + if (ret == -1) + hr = E_FAIL; + } + + if (hr == S_OK && This->decode_info.reverse_bgr) + { + if (This->decode_info.format == &GUID_WICPixelFormat24bppBGR) + { + UINT i, total_pixels; + BYTE *pixel, temp; + + total_pixels = This->decode_info.tile_width * This->decode_info.tile_height; + pixel = This->cached_tile; + for (i=0; icached_tile_x = tile_x; + This->cached_tile_y = tile_y; + } + + return hr; +} + +static HRESULT WINAPI TiffFrameDecode_CopyPixels(IWICBitmapFrameDecode *iface, + const WICRect *prc, UINT cbStride, UINT cbBufferSize, BYTE *pbBuffer) +{ + TiffFrameDecode *This = (TiffFrameDecode*)iface; + UINT min_tile_x, max_tile_x, min_tile_y, max_tile_y; + UINT tile_x, tile_y; + WICRect rc; + HRESULT hr=S_OK; + BYTE *dst_tilepos; + UINT bytesperrow; + + TRACE("(%p,%p,%u,%u,%p)\n", iface, prc, cbStride, cbBufferSize, pbBuffer); + + if (prc->X < 0 || prc->Y < 0 || prc->X+prc->Width > This->decode_info.width || + prc->Y+prc->Height > This->decode_info.height) + return E_INVALIDARG; + + bytesperrow = ((This->decode_info.bpp * prc->Width)+7)/8; + + if (cbStride < bytesperrow) + return E_INVALIDARG; + + if ((cbStride * prc->Height) > cbBufferSize) + return E_INVALIDARG; + + min_tile_x = prc->X / This->decode_info.tile_width; + min_tile_y = prc->Y / This->decode_info.tile_height; + max_tile_x = (prc->X+prc->Width-1) / This->decode_info.tile_width; + max_tile_y = (prc->Y+prc->Height-1) / This->decode_info.tile_height; + + EnterCriticalSection(&This->parent->lock); + + for (tile_x=min_tile_x; tile_x <= max_tile_x; tile_x++) + { + for (tile_y=min_tile_y; tile_y <= max_tile_y; tile_y++) + { + if (tile_x != This->cached_tile_x || tile_y != This->cached_tile_y) + { + hr = TiffFrameDecode_ReadTile(This, tile_x, tile_y); + } + + if (SUCCEEDED(hr)) + { + if (prc->X < tile_x * This->decode_info.tile_width) + rc.X = 0; + else + rc.X = prc->X - tile_x * This->decode_info.tile_width; + + if (prc->Y < tile_y * This->decode_info.tile_height) + rc.Y = 0; + else + rc.Y = prc->Y - tile_y * This->decode_info.tile_height; + + if (prc->X+prc->Width > (tile_x+1) * This->decode_info.tile_width) + rc.Width = This->decode_info.tile_width - rc.X; + else + rc.Width = prc->Width + rc.X - prc->X; + + if (prc->Y+prc->Height > (tile_y+1) * This->decode_info.tile_height) + rc.Height = This->decode_info.tile_height - rc.Y; + else + rc.Height = prc->Height + rc.Y - prc->Y; + + dst_tilepos = pbBuffer + (cbStride * (rc.Y - prc->Y)) + + ((This->decode_info.bpp * (rc.X - prc->X) + 7) / 8); + + hr = copy_pixels(This->decode_info.bpp, This->cached_tile, + This->decode_info.tile_width, This->decode_info.tile_height, This->decode_info.tile_stride, + &rc, cbStride, cbBufferSize, dst_tilepos); + } + + if (FAILED(hr)) + { + LeaveCriticalSection(&This->parent->lock); + TRACE("<-- 0x%x\n", hr); + return hr; + } + } + } + + LeaveCriticalSection(&This->parent->lock); + + return S_OK; +} + +static HRESULT WINAPI TiffFrameDecode_GetMetadataQueryReader(IWICBitmapFrameDecode *iface, + IWICMetadataQueryReader **ppIMetadataQueryReader) +{ + FIXME("(%p,%p): stub\n", iface, ppIMetadataQueryReader); + return E_NOTIMPL; +} + +static HRESULT WINAPI TiffFrameDecode_GetColorContexts(IWICBitmapFrameDecode *iface, + UINT cCount, IWICColorContext **ppIColorContexts, UINT *pcActualCount) +{ + FIXME("(%p,%u,%p,%p): stub\n", iface, cCount, ppIColorContexts, pcActualCount); + return E_NOTIMPL; +} + +static HRESULT WINAPI TiffFrameDecode_GetThumbnail(IWICBitmapFrameDecode *iface, + IWICBitmapSource **ppIThumbnail) +{ + FIXME("(%p,%p): stub\n", iface, ppIThumbnail); + return E_NOTIMPL; +} + +static const IWICBitmapFrameDecodeVtbl TiffFrameDecode_Vtbl = { + TiffFrameDecode_QueryInterface, + TiffFrameDecode_AddRef, + TiffFrameDecode_Release, + TiffFrameDecode_GetSize, + TiffFrameDecode_GetPixelFormat, + TiffFrameDecode_GetResolution, + TiffFrameDecode_CopyPalette, + TiffFrameDecode_CopyPixels, + TiffFrameDecode_GetMetadataQueryReader, + TiffFrameDecode_GetColorContexts, + TiffFrameDecode_GetThumbnail +}; + +HRESULT TiffDecoder_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** ppv) +{ + HRESULT ret; + TiffDecoder *This; + + TRACE("(%p,%s,%p)\n", pUnkOuter, debugstr_guid(iid), ppv); + + *ppv = NULL; + + if (pUnkOuter) return CLASS_E_NOAGGREGATION; + + if (!load_libtiff()) + { + ERR("Failed reading TIFF because unable to load %s\n",SONAME_LIBTIFF); + return E_FAIL; + } + + This = HeapAlloc(GetProcessHeap(), 0, sizeof(TiffDecoder)); + if (!This) return E_OUTOFMEMORY; + + This->lpVtbl = &TiffDecoder_Vtbl; + This->ref = 1; + This->stream = NULL; + InitializeCriticalSection(&This->lock); + This->lock.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": TiffDecoder.lock"); + This->tiff = NULL; + This->initialized = FALSE; + + ret = IUnknown_QueryInterface((IUnknown*)This, iid, ppv); + IUnknown_Release((IUnknown*)This); + + return ret; +} + +#else /* !SONAME_LIBTIFF */ + +HRESULT TiffDecoder_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** ppv) +{ + ERR("Trying to load TIFF picture, but Wine was compiled without TIFF support.\n"); + return E_FAIL; +} + +#endif diff --git a/reactos/dll/win32/windowscodecs/wincodecs_private.h b/reactos/dll/win32/windowscodecs/wincodecs_private.h index 632f82206da..0e72793dafc 100644 --- a/reactos/dll/win32/windowscodecs/wincodecs_private.h +++ b/reactos/dll/win32/windowscodecs/wincodecs_private.h @@ -28,6 +28,7 @@ extern HRESULT BmpEncoder_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** extern HRESULT GifDecoder_CreateInstance(IUnknown *pUnkOuter, REFIID riid, void** ppv); extern HRESULT IcoDecoder_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** ppv); extern HRESULT JpegDecoder_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** ppv); +extern HRESULT TiffDecoder_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** ppv); extern HRESULT PaletteImpl_Create(IWICPalette **palette); extern HRESULT StreamImpl_Create(IWICStream **stream); diff --git a/reactos/dll/win32/windowscodecs/windowscodecs.rbuild b/reactos/dll/win32/windowscodecs/windowscodecs.rbuild index 563a7a99352..da8e3e46618 100644 --- a/reactos/dll/win32/windowscodecs/windowscodecs.rbuild +++ b/reactos/dll/win32/windowscodecs/windowscodecs.rbuild @@ -28,6 +28,7 @@ propertybag.c regsvr.c stream.c + tiffformat.c ungif.c version.rc diff --git a/reactos/dll/win32/wininet/internet.c b/reactos/dll/win32/wininet/internet.c index f4b8a0a3abd..6fc8a212c89 100644 --- a/reactos/dll/win32/wininet/internet.c +++ b/reactos/dll/win32/wininet/internet.c @@ -102,8 +102,8 @@ static CRITICAL_SECTION_DEBUG WININET_cs_debug = static CRITICAL_SECTION WININET_cs = { &WININET_cs_debug, -1, 0, 0, 0, 0 }; static object_header_t **WININET_Handles; -static UINT WININET_dwNextHandle; -static UINT WININET_dwMaxHandles; +static UINT_PTR WININET_dwNextHandle; +static UINT_PTR WININET_dwMaxHandles; typedef struct { @@ -122,7 +122,7 @@ static const WCHAR szProxyEnable[] = { 'P','r','o','x','y','E','n','a','b','l',' HINTERNET WININET_AllocHandle( object_header_t *info ) { object_header_t **p; - UINT handle = 0, num; + UINT_PTR handle = 0, num; list_init( &info->children ); @@ -173,7 +173,7 @@ object_header_t *WININET_AddRef( object_header_t *info ) object_header_t *WININET_GetObject( HINTERNET hinternet ) { object_header_t *info = NULL; - UINT handle = (UINT) hinternet; + UINT_PTR handle = (UINT_PTR) hinternet; EnterCriticalSection( &WININET_cs ); @@ -183,7 +183,7 @@ object_header_t *WININET_GetObject( HINTERNET hinternet ) LeaveCriticalSection( &WININET_cs ); - TRACE("handle %d -> %p\n", handle, info); + TRACE("handle %ld -> %p\n", handle, info); return info; } @@ -218,7 +218,7 @@ BOOL WININET_Release( object_header_t *info ) BOOL WININET_FreeHandle( HINTERNET hinternet ) { BOOL ret = FALSE; - UINT handle = (UINT) hinternet; + UINT_PTR handle = (UINT_PTR) hinternet; object_header_t *info = NULL, *child, *next; EnterCriticalSection( &WININET_cs ); @@ -229,7 +229,7 @@ BOOL WININET_FreeHandle( HINTERNET hinternet ) if( WININET_Handles[handle] ) { info = WININET_Handles[handle]; - TRACE( "destroying handle %d for object %p\n", handle+1, info); + TRACE( "destroying handle %ld for object %p\n", handle+1, info); WININET_Handles[handle] = NULL; ret = TRUE; } @@ -245,8 +245,8 @@ BOOL WININET_FreeHandle( HINTERNET hinternet ) /* Free all children as native does */ LIST_FOR_EACH_ENTRY_SAFE( child, next, &info->children, object_header_t, entry ) { - TRACE( "freeing child handle %d for parent handle %d\n", - (UINT)child->hInternet, handle+1); + TRACE( "freeing child handle %ld for parent handle %ld\n", + (UINT_PTR)child->hInternet, handle+1); WININET_FreeHandle( child->hInternet ); } WININET_Release( info ); diff --git a/reactos/dll/win32/wininet/urlcache.c b/reactos/dll/win32/wininet/urlcache.c index 29d26ab0b6b..6a39c691475 100644 --- a/reactos/dll/win32/wininet/urlcache.c +++ b/reactos/dll/win32/wininet/urlcache.c @@ -986,9 +986,9 @@ static DWORD URLCache_CopyEntry( ZeroMemory((LPBYTE)lpCacheEntryInfo + dwRequiredSize, 4 - (dwRequiredSize % 4)); dwRequiredSize = DWORD_ALIGN(dwRequiredSize); if (bUnicode) - lenUrl = MultiByteToWideChar(CP_ACP, 0, (LPSTR)pUrlEntry + pUrlEntry->dwOffsetUrl, -1, NULL, 0); + lenUrl = MultiByteToWideChar(CP_ACP, 0, (LPCSTR)pUrlEntry + pUrlEntry->dwOffsetUrl, -1, NULL, 0); else - lenUrl = strlen((LPSTR)pUrlEntry + pUrlEntry->dwOffsetUrl); + lenUrl = strlen((LPCSTR)pUrlEntry + pUrlEntry->dwOffsetUrl); dwRequiredSize += (lenUrl + 1) * (bUnicode ? sizeof(WCHAR) : sizeof(CHAR)); /* FIXME: is source url optional? */ @@ -998,9 +998,9 @@ static DWORD URLCache_CopyEntry( lpCacheEntryInfo->lpszSourceUrlName = (LPSTR)lpCacheEntryInfo + dwRequiredSize - lenUrlBytes; if (bUnicode) - MultiByteToWideChar(CP_ACP, 0, (LPSTR)pUrlEntry + pUrlEntry->dwOffsetUrl, -1, (LPWSTR)lpCacheEntryInfo->lpszSourceUrlName, lenUrl + 1); + MultiByteToWideChar(CP_ACP, 0, (LPCSTR)pUrlEntry + pUrlEntry->dwOffsetUrl, -1, (LPWSTR)lpCacheEntryInfo->lpszSourceUrlName, lenUrl + 1); else - memcpy(lpCacheEntryInfo->lpszSourceUrlName, (LPSTR)pUrlEntry + pUrlEntry->dwOffsetUrl, lenUrlBytes); + memcpy(lpCacheEntryInfo->lpszSourceUrlName, (LPCSTR)pUrlEntry + pUrlEntry->dwOffsetUrl, lenUrlBytes); } if ((dwRequiredSize % 4) && (dwRequiredSize < *lpdwBufferSize)) @@ -1029,7 +1029,7 @@ static DWORD URLCache_CopyEntry( if (*lpdwBufferSize >= dwRequiredSize) { lpCacheEntryInfo->lpHeaderInfo = (LPBYTE)lpCacheEntryInfo + dwRequiredSize - pUrlEntry->dwHeaderInfoSize - 1; - memcpy(lpCacheEntryInfo->lpHeaderInfo, (LPSTR)pUrlEntry + pUrlEntry->dwOffsetHeaderInfo, pUrlEntry->dwHeaderInfoSize); + memcpy(lpCacheEntryInfo->lpHeaderInfo, (LPCSTR)pUrlEntry + pUrlEntry->dwOffsetHeaderInfo, pUrlEntry->dwHeaderInfoSize); ((LPBYTE)lpCacheEntryInfo)[dwRequiredSize - 1] = '\0'; } if ((dwRequiredSize % 4) && (dwRequiredSize < *lpdwBufferSize)) @@ -1041,18 +1041,18 @@ static DWORD URLCache_CopyEntry( int lenExtension; if (bUnicode) - lenExtension = MultiByteToWideChar(CP_ACP, 0, (LPSTR)pUrlEntry + pUrlEntry->dwOffsetFileExtension, -1, NULL, 0); + lenExtension = MultiByteToWideChar(CP_ACP, 0, (LPCSTR)pUrlEntry + pUrlEntry->dwOffsetFileExtension, -1, NULL, 0); else - lenExtension = strlen((LPSTR)pUrlEntry + pUrlEntry->dwOffsetFileExtension) + 1; + lenExtension = strlen((LPCSTR)pUrlEntry + pUrlEntry->dwOffsetFileExtension) + 1; dwRequiredSize += lenExtension * (bUnicode ? sizeof(WCHAR) : sizeof(CHAR)); if (*lpdwBufferSize >= dwRequiredSize) { lpCacheEntryInfo->lpszFileExtension = (LPSTR)lpCacheEntryInfo + dwRequiredSize - lenExtension; if (bUnicode) - MultiByteToWideChar(CP_ACP, 0, (LPSTR)pUrlEntry + pUrlEntry->dwOffsetFileExtension, -1, (LPWSTR)lpCacheEntryInfo->lpszSourceUrlName, lenExtension); + MultiByteToWideChar(CP_ACP, 0, (LPCSTR)pUrlEntry + pUrlEntry->dwOffsetFileExtension, -1, (LPWSTR)lpCacheEntryInfo->lpszSourceUrlName, lenExtension); else - memcpy(lpCacheEntryInfo->lpszFileExtension, (LPSTR)pUrlEntry + pUrlEntry->dwOffsetFileExtension, lenExtension * sizeof(CHAR)); + memcpy(lpCacheEntryInfo->lpszFileExtension, (LPCSTR)pUrlEntry + pUrlEntry->dwOffsetFileExtension, lenExtension * sizeof(CHAR)); } if ((dwRequiredSize % 4) && (dwRequiredSize < *lpdwBufferSize)) @@ -1175,8 +1175,8 @@ static inline HASH_CACHEFILE_ENTRY * URLCache_HashEntryFromOffset(LPCURLCACHE_HE static inline BOOL URLCache_IsHashEntryValid(LPCURLCACHE_HEADER pHeader, const HASH_CACHEFILE_ENTRY *pHashEntry) { /* check pHashEntry located within acceptable bounds in the URL cache mapping */ - return ((DWORD)((LPBYTE)pHashEntry - (LPBYTE)pHeader) >= ENTRY_START_OFFSET) && - ((DWORD)((LPBYTE)pHashEntry - (LPBYTE)pHeader) < pHeader->dwFileSize); + return ((DWORD)((const BYTE*)pHashEntry - (const BYTE*)pHeader) >= ENTRY_START_OFFSET) && + ((DWORD)((const BYTE*)pHashEntry - (const BYTE*)pHeader) < pHeader->dwFileSize); } static BOOL URLCache_FindHash(LPCURLCACHE_HEADER pHeader, LPCSTR lpszUrl, struct _HASH_ENTRY ** ppHashEntry) @@ -1557,15 +1557,15 @@ BOOL WINAPI GetUrlCacheEntryInfoA( if (pEntry->dwSignature != URL_SIGNATURE) { URLCacheContainer_UnlockIndex(pContainer, pHeader); - FIXME("Trying to retrieve entry of unknown format %s\n", debugstr_an((LPSTR)&pEntry->dwSignature, sizeof(DWORD))); + FIXME("Trying to retrieve entry of unknown format %s\n", debugstr_an((LPCSTR)&pEntry->dwSignature, sizeof(DWORD))); SetLastError(ERROR_FILE_NOT_FOUND); return FALSE; } pUrlEntry = (const URL_CACHEFILE_ENTRY *)pEntry; - TRACE("Found URL: %s\n", debugstr_a((LPSTR)pUrlEntry + pUrlEntry->dwOffsetUrl)); + TRACE("Found URL: %s\n", debugstr_a((LPCSTR)pUrlEntry + pUrlEntry->dwOffsetUrl)); if (pUrlEntry->dwOffsetHeaderInfo) - TRACE("Header info: %s\n", debugstr_a((LPSTR)pUrlEntry + pUrlEntry->dwOffsetHeaderInfo)); + TRACE("Header info: %s\n", debugstr_a((LPCSTR)pUrlEntry + pUrlEntry->dwOffsetHeaderInfo)); if (lpdwCacheEntryInfoBufferSize) { @@ -1639,14 +1639,14 @@ BOOL WINAPI GetUrlCacheEntryInfoW(LPCWSTR lpszUrl, if (pEntry->dwSignature != URL_SIGNATURE) { URLCacheContainer_UnlockIndex(pContainer, pHeader); - FIXME("Trying to retrieve entry of unknown format %s\n", debugstr_an((LPSTR)&pEntry->dwSignature, sizeof(DWORD))); + FIXME("Trying to retrieve entry of unknown format %s\n", debugstr_an((LPCSTR)&pEntry->dwSignature, sizeof(DWORD))); SetLastError(ERROR_FILE_NOT_FOUND); return FALSE; } pUrlEntry = (const URL_CACHEFILE_ENTRY *)pEntry; - TRACE("Found URL: %s\n", debugstr_a((LPSTR)pUrlEntry + pUrlEntry->dwOffsetUrl)); - TRACE("Header info: %s\n", debugstr_a((LPSTR)pUrlEntry + pUrlEntry->dwOffsetHeaderInfo)); + TRACE("Found URL: %s\n", debugstr_a((LPCSTR)pUrlEntry + pUrlEntry->dwOffsetUrl)); + TRACE("Header info: %s\n", debugstr_a((LPCSTR)pUrlEntry + pUrlEntry->dwOffsetHeaderInfo)); if (lpdwCacheEntryInfoBufferSize) { @@ -3265,9 +3265,9 @@ BOOL WINAPI FindNextUrlCacheEntryA( if (pEntry->dwSignature != URL_SIGNATURE) continue; - pUrlEntry = (URL_CACHEFILE_ENTRY *)pEntry; - TRACE("Found URL: %s\n", (LPSTR)pUrlEntry + pUrlEntry->dwOffsetUrl); - TRACE("Header info: %s\n", (LPBYTE)pUrlEntry + pUrlEntry->dwOffsetHeaderInfo); + pUrlEntry = (const URL_CACHEFILE_ENTRY *)pEntry; + TRACE("Found URL: %s\n", (LPCSTR)pUrlEntry + pUrlEntry->dwOffsetUrl); + TRACE("Header info: %s\n", (LPCSTR)pUrlEntry + pUrlEntry->dwOffsetHeaderInfo); error = URLCache_CopyEntry( pContainer, @@ -3563,7 +3563,7 @@ BOOL WINAPI IsUrlCacheEntryExpiredA( LPCSTR url, DWORD dwFlags, FILETIME* pftLas if (pEntry->dwSignature != URL_SIGNATURE) { URLCacheContainer_UnlockIndex(pContainer, pHeader); - FIXME("Trying to retrieve entry of unknown format %s\n", debugstr_an((LPSTR)&pEntry->dwSignature, sizeof(DWORD))); + FIXME("Trying to retrieve entry of unknown format %s\n", debugstr_an((LPCSTR)&pEntry->dwSignature, sizeof(DWORD))); SetLastError(ERROR_FILE_NOT_FOUND); return FALSE; } @@ -3625,7 +3625,7 @@ BOOL WINAPI IsUrlCacheEntryExpiredW( LPCWSTR url, DWORD dwFlags, FILETIME* pftLa if (pEntry->dwSignature != URL_SIGNATURE) { URLCacheContainer_UnlockIndex(pContainer, pHeader); - FIXME("Trying to retrieve entry of unknown format %s\n", debugstr_an((LPSTR)&pEntry->dwSignature, sizeof(DWORD))); + FIXME("Trying to retrieve entry of unknown format %s\n", debugstr_an((LPCSTR)&pEntry->dwSignature, sizeof(DWORD))); SetLastError(ERROR_FILE_NOT_FOUND); return FALSE; } diff --git a/reactos/dll/win32/wintrust/asn.c b/reactos/dll/win32/wintrust/asn.c index 69c9dd3d604..865926640a3 100644 --- a/reactos/dll/win32/wintrust/asn.c +++ b/reactos/dll/win32/wintrust/asn.c @@ -1348,7 +1348,7 @@ static BOOL CRYPT_AsnDecodeSPCLinkInternal(DWORD dwCertEncodingType, link->dwLinkChoice = SPC_FILE_LINK_CHOICE; for (i = 0; i < dataLen / sizeof(WCHAR); i++) link->u.pwszFile[i] = - hton16(*(WORD *)(ptr + i * sizeof(WCHAR))); + hton16(*(const WORD *)(ptr + i * sizeof(WCHAR))); link->u.pwszFile[realDataLen / sizeof(WCHAR)] = '\0'; TRACE("returning file %s\n", debugstr_w(link->u.pwszFile)); } diff --git a/reactos/include/psdk/ntsecpkg.h b/reactos/include/psdk/ntsecpkg.h index 4de56cc05b0..b83d364544b 100644 --- a/reactos/include/psdk/ntsecpkg.h +++ b/reactos/include/psdk/ntsecpkg.h @@ -19,6 +19,10 @@ #ifndef _NTSECPKG_H #define _NTSECPKG_H +#ifdef __cplusplus +extern "C" { +#endif + /* Flags for the MachineState field in SECPKG_PARAMETERS */ #define SECPKG_STATE_ENCRYPTION_PERMITTED 0x01 #define SECPKG_STATE_STRONG_ENCRYPTION_PERMITTED 0x02 @@ -30,6 +34,9 @@ #define SECPKG_INTERFACE_VERSION 0x10000 #define SECPKG_INTERFACE_VERSION_2 0x20000 #define SECPKG_INTERFACE_VERSION_3 0x40000 +#define SECPKG_INTERFACE_VERSION_4 0x80000 +#define SECPKG_INTERFACE_VERSION_5 0x100000 +#define SECPKG_INTERFACE_VERSION_6 0x200000 /* enum definitions for Secure Service Provider/Authentication Packages */ typedef enum _LSA_TOKEN_INFORMATION_TYPE { @@ -140,6 +147,11 @@ typedef struct _SECPKG_EXTENDED_INFORMATION { } Info; } SECPKG_EXTENDED_INFORMATION, *PSECPKG_EXTENDED_INFORMATION; +typedef struct _SECPKG_TARGETINFO { + PSID DomainSid; + PCWSTR ComputerName; +} SECPKG_TARGETINFO, *PSECPKG_TARGETINFO; + /* callbacks implemented by SSP/AP dlls and called by the LSA */ typedef VOID (NTAPI *PLSA_CALLBACK_FUNCTION)(ULONG_PTR, ULONG_PTR, PSecBuffer, PSecBuffer); @@ -341,6 +353,18 @@ typedef NTSTATUS (NTAPI SpSetContextAttributesFn)(LSA_SEC_HANDLE, ULONG, PVOID, ULONG); typedef NTSTATUS (NTAPI SpSetCredentialsAttributesFn)(LSA_SEC_HANDLE, ULONG, PVOID, ULONG); +typedef NTSTATUS (NTAPI SpChangeAccountPasswordFn)(PUNICODE_STRING, + PUNICODE_STRING, PUNICODE_STRING, PUNICODE_STRING, BOOLEAN, PSecBufferDesc); +typedef NTSTATUS (NTAPI SpQueryMetaDataFn)(LSA_SEC_HANDLE, PUNICODE_STRING, + ULONG, PULONG, PUCHAR *, PLSA_SEC_HANDLE); +typedef NTSTATUS (NTAPI SpExchangeMetaDataFn)(LSA_SEC_HANDLE, PUNICODE_STRING, + ULONG, ULONG, PUCHAR, PLSA_SEC_HANDLE); +typedef NTSTATUS (NTAPI SpGetCredUIContextFn)(LSA_SEC_HANDLE, GUID *, PULONG, + PUCHAR *); +typedef NTSTATUS (NTAPI SpUpdateCredentialsFn)(LSA_SEC_HANDLE, GUID *, ULONG, + PUCHAR); +typedef NTSTATUS (NTAPI SpValidateTargetInfoFn)(PLSA_CLIENT_REQUEST, PVOID, + PVOID, ULONG, PSECPKG_TARGETINFO); /* User-mode functions implemented by SSP/AP obtainable by a dispatch table */ typedef NTSTATUS (NTAPI SpInstanceInitFn)(ULONG, PSECPKG_DLL_FUNCTIONS, @@ -402,6 +426,15 @@ typedef struct SECPKG_FUNCTION_TABLE { /* Packages with version SECPKG_INTERFACE_VERSION_2 end here */ SpSetCredentialsAttributesFn *SetCredentialsAttributes; /* Packages with version SECPKG_INTERFACE_VERSION_3 end here */ + SpChangeAccountPasswordFn *ChangeAccountPassword; + /* Packages with version SECPKG_INTERFACE_VERSION_4 end here */ + SpQueryMetaDataFn *QueryMetaData; + SpExchangeMetaDataFn *ExchangeMetaData; + SpGetCredUIContextFn *GetCredUIContext; + SpUpdateCredentialsFn *UpdateCredentials; + /* Packages with version SECPKG_INTERFACE_VERSION_5 end here */ + SpValidateTargetInfoFn *ValidateTargetInfo; + /* Packages with version SECPKG_INTERFACE_VERSION_6 end here */ } SECPKG_FUNCTION_TABLE, *PSECPKG_FUNCTION_TABLE; @@ -432,4 +465,7 @@ typedef NTSTATUS (NTAPI *SpLsaModeInitializeFn)(ULONG, PULONG, typedef NTSTATUS (WINAPI *SpUserModeInitializeFn)(ULONG, PULONG, PSECPKG_USER_FUNCTION_TABLE *, PULONG); +#ifdef __cplusplus +} +#endif #endif /* _NTSECPKG_H */ diff --git a/reactos/include/psdk/psdk.rbuild b/reactos/include/psdk/psdk.rbuild index 02256ebc338..ebf38da2d59 100644 --- a/reactos/include/psdk/psdk.rbuild +++ b/reactos/include/psdk/psdk.rbuild @@ -47,6 +47,7 @@ richole.idl sensevts.idl servprov.idl + shdeprecated.idl shldisp.idl shobjidl.idl shtypes.idl @@ -68,6 +69,8 @@ xmldso.idl xmldom.idl xmllite.idl + wia_lh.idl + wia_xp.idl stdole2.idl diff --git a/reactos/include/psdk/shdeprecated.idl b/reactos/include/psdk/shdeprecated.idl new file mode 100644 index 00000000000..304b0875224 --- /dev/null +++ b/reactos/include/psdk/shdeprecated.idl @@ -0,0 +1,31 @@ +/* + * Deprecated shell interfaces + * + * Copyright (C) 2010 Nikolay Sivov for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +import "objidl.idl"; + +[ + object, + local, + uuid(5836fb00-8187-11cf-a12b-00aa004ae837) +] +interface IShellService : IUnknown +{ + HRESULT SetOwner( [in] IUnknown *pUnk ); +} diff --git a/reactos/include/psdk/shlwapi.h b/reactos/include/psdk/shlwapi.h index 29e70b76d8c..223bcdd3c05 100644 --- a/reactos/include/psdk/shlwapi.h +++ b/reactos/include/psdk/shlwapi.h @@ -1028,24 +1028,6 @@ typedef struct _DLLVERSIONINFO2 { HRESULT WINAPI DllInstall(BOOL,LPCWSTR) DECLSPEC_HIDDEN; -#if (_WIN32_IE >= 0x0600) -#define SHGVSPB_PERUSER 0x00000001 -#define SHGVSPB_ALLUSERS 0x00000002 -#define SHGVSPB_PERFOLDER 0x00000004 -#define SHGVSPB_ALLFOLDERS 0x00000008 -#define SHGVSPB_INHERIT 0x00000010 -#define SHGVSPB_ROAM 0x00000020 -#define SHGVSPB_NOAUTODEFAULTS 0x80000000 - -#define SHGVSPB_FOLDER (SHGVSPB_PERUSER | SHGVSPB_PERFOLDER) -#define SHGVSPB_FOLDERNODEFAULTS (SHGVSPB_PERUSER | SHGVSPB_PERFOLDER | SHGVSPB_NOAUTODEFAULTS) -#define SHGVSPB_USERDEFAULTS (SHGVSPB_PERUSER | SHGVSPB_ALLFOLDERS) -#define SHGVSPB_GLOBALDEAFAULTS (SHGVSPB_ALLUSERS | SHGVSPB_ALLFOLDERS) - -HRESULT WINAPI SHGetViewStatePropertyBag(LPCITEMIDLIST pidl, LPWSTR bag_name, DWORD flags, REFIID riid, void **ppv); -#endif /* (_WIN32_IE >= 0x0600) */ - - /* IsOS definitions */ #define OS_WIN32SORGREATER 0x00 @@ -1103,6 +1085,15 @@ BOOL WINAPI IsOS(DWORD); #define FDTF_RTLDATE 0x00000200 #define FDTF_NOAUTOREADINGORDER 0x00000400 + +typedef struct +{ + const IID *piid; + int dwOffset; +} QITAB, *LPQITAB; + +HRESULT WINAPI QISearch(void* base, const QITAB *pqit, REFIID riid, void **ppv); + #include #ifdef __cplusplus diff --git a/reactos/include/psdk/sti.h b/reactos/include/psdk/sti.h index 56650f5a011..204492d9a2f 100644 --- a/reactos/include/psdk/sti.h +++ b/reactos/include/psdk/sti.h @@ -31,6 +31,147 @@ extern "C" { DEFINE_GUID(CLSID_Sti, 0xB323F8E0L, 0x2E68, 0x11D0, 0x90, 0xEA, 0x00, 0xAA, 0x00, 0x60, 0xF8, 0x6C); +DEFINE_GUID(IID_IStillImageW, 0x641BD880, 0x2DC8, 0x11D0, 0x90, 0xEA, 0x00, 0xAA, 0x00, 0x60, 0xF8, 0x6C); + +DEFINE_GUID(IID_IStillImageA, 0xA7B1F740, 0x1D7F, 0x11D1, 0xAC, 0xA9, 0x00, 0xA0, 0x24, 0x38, 0xAD, 0x48); + +#define STI_VERSION_REAL 0x00000002 +#define STI_VERSION_FLAG_UNICODE 0x01000000 + +#ifndef WINE_NO_UNICODE_MACROS +# ifdef UNICODE +# define STI_VERSION (STI_VERSION_REAL | STI_VERSION_FLAG_UNICODE) +# else +# define STI_VERSION (STI_VERSION_REAL) +# endif +#endif + +typedef struct IStillImageA *PSTIA; +typedef struct IStillImageW *PSTIW; +DECL_WINELIB_TYPE_AW(PSTI) +typedef struct IStillImageA *LPSTILLIMAGEA; +typedef struct IStillImageW *LPSTILLIMAGEW; +DECL_WINELIB_TYPE_AW(LPSTILLIMAGE) +typedef struct IStiDeviceA *PSTIDEVICEA; +typedef struct IStiDeviceW *PSTIDEVICEW; +DECL_WINELIB_TYPE_AW(PSTIDEVICE) + +HRESULT WINAPI StiCreateInstanceA(HINSTANCE hinst, DWORD dwVer, PSTIA *ppSti, LPUNKNOWN pUnkOuter); +HRESULT WINAPI StiCreateInstanceW(HINSTANCE hinst, DWORD dwVer, PSTIW *ppSti, LPUNKNOWN pUnkOuter); +#define StiCreateInstance WINELIB_NAME_AW(StiCreateInstance) + +typedef DWORD STI_DEVICE_TYPE; +typedef enum _STI_DEVICE_MJ_TYPE +{ + StiDeviceTypeDefault = 0, + StiDeviceTypeScanner = 1, + StiDeviceTypeDigitalCamera = 2, + StiDeviceTypeStreamingVideo = 3 +} STI_DEVICE_MJ_TYPE; + +#define GET_STIDEVICE_TYPE(dwDevType) HIWORD(dwDevType) +#define GET_STIDEVICE_SUBTYPE(dwDevType) LOWORD(dwDevType) + +typedef struct _STI_DEV_CAPS { + DWORD dwGeneric; +} STI_DEV_CAPS, *PSTI_DEV_CAPS; + +#define STI_MAX_INTERNAL_NAME_LENGTH 128 + +typedef struct _STI_DEVICE_INFORMATIONW { + DWORD dwSize; + STI_DEVICE_TYPE DeviceType; + WCHAR szDeviceInternalName[STI_MAX_INTERNAL_NAME_LENGTH]; + STI_DEV_CAPS DeviceCapabilities; + DWORD dwHardwareConfiguration; + LPWSTR pszVendorDescription; + LPWSTR pszDeviceDescription; + LPWSTR pszPortName; + LPWSTR pszPropProvider; + LPWSTR pszLocalName; +} STI_DEVICE_INFORMATIONW, *PSTI_DEVICE_INFORMATIONW; + +typedef STI_DEVICE_INFORMATIONW STI_DEVICE_INFORMATION; +typedef PSTI_DEVICE_INFORMATIONW PSTI_DEVICE_INFORMATION; + +#define MAX_NOTIFICATION_DATA 64 + +typedef struct _STINOTIFY { + DWORD dwSize; + GUID guidNotificationCode; + BYTE abNotificationData[MAX_NOTIFICATION_DATA]; +} STINOTIFY,*LPSTINOTIFY; + +#define INTERFACE IStillImageW +DECLARE_INTERFACE_(IStillImageW, IUnknown) +{ + /*** IUnknown methods ***/ + STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + /*** IStillImageW methods ***/ + STDMETHOD(Initialize)(THIS_ HINSTANCE hinst, DWORD dwVersion) PURE; + STDMETHOD(GetDeviceList)(THIS_ DWORD dwType, DWORD dwFlags, DWORD *pdwItemsReturned, LPVOID *ppBuffer) PURE; + STDMETHOD(GetDeviceInfo)(THIS_ LPWSTR pwszDeviceName, LPVOID *ppBuffer) PURE; + STDMETHOD(CreateDevice)(THIS_ LPWSTR pwszDeviceName, DWORD dwMode, PSTIDEVICEW *pDevice, LPUNKNOWN pUnkOuter) PURE; + STDMETHOD(GetDeviceValue)(THIS_ LPWSTR pwszDeviceName, LPWSTR pValueName, LPDWORD pType, LPBYTE pData, LPDWORD cbData) PURE; + STDMETHOD(SetDeviceValue)(THIS_ LPWSTR pwszDeviceName, LPWSTR pValueName, DWORD type, LPBYTE pData, DWORD cbData) PURE; + STDMETHOD(GetSTILaunchInformation)(THIS_ LPWSTR pwszDeviceName, DWORD *pdwEventCode, LPWSTR pwszEventName) PURE; + STDMETHOD(RegisterLaunchApplication)(THIS_ LPWSTR pwszAppName, LPWSTR pwszCommandLine) PURE; + STDMETHOD(UnregisterLaunchApplication)(THIS_ LPWSTR pwszAppName) PURE; + STDMETHOD(EnableHwNotifications)(THIS_ LPCWSTR pwszDeviceName, BOOL bNewState) PURE; + STDMETHOD(GetHwNotificationState)(THIS_ LPCWSTR pwszDeviceName, BOOL *pbCurrentState) PURE; + STDMETHOD(RefreshDeviceBus)(THIS_ LPCWSTR pwszDeviceName) PURE; + STDMETHOD(LaunchApplicationForDevice)(THIS_ LPWSTR pwszDeviceName, LPWSTR pwszAppName, LPSTINOTIFY pStiNotify); + STDMETHOD(SetupDeviceParameters)(THIS_ PSTI_DEVICE_INFORMATIONW pDevInfo); + STDMETHOD(WriteToErrorLog)(THIS_ DWORD dwMessageType, LPCWSTR pszMessage) PURE; +}; +#undef INTERFACE + +#if !defined(__cplusplus) || defined(CINTERFACE) +/*** IUnknown methods ***/ +#define IStillImage_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) +#define IStillImage_AddRef(p) (p)->lpVtbl->AddRef(p) +#define IStillImage_Release(p) (p)->lpVtbl->Release(p) +/*** IStillImage methods ***/ +#define IStillImage_Initialize(p,a,b) (p)->lpVtbl->Initialize(p,a,b) +#define IStillImage_GetDeviceList(p,a,b,c,d) (p)->lpVtbl->GetDeviceList(p,a,b,c,d) +#define IStillImage_GetDeviceInfo(p,a,b) (p)->lpVtbl->GetDeviceInfo(p,a,b) +#define IStillImage_CreateDevice(p,a,b,c,d) (p)->lpVtbl->CreateDevice(p,a,b,c,d) +#define IStillImage_GetDeviceValue(p,a,b,c,d,e) (p)->lpVtbl->GetDeviceValue(p,a,b,c,d,e) +#define IStillImage_SetDeviceValue(p,a,b,c,d,e) (p)->lpVtbl->SetDeviceValue(p,a,b,c,d,e) +#define IStillImage_GetSTILaunchInformation(p,a,b,c) (p)->lpVtbl->GetSTILaunchInformation(p,a,b,c) +#define IStillImage_RegisterLaunchApplication(p,a,b) (p)->lpVtbl->RegisterLaunchApplication(p,a,b) +#define IStillImage_UnregisterLaunchApplication(p,a) (p)->lpVtbl->UnregisterLaunchApplication(p,a) +#define IStillImage_EnableHwNotifications(p,a,b) (p)->lpVtbl->EnableHwNotifications(p,a,b) +#define IStillImage_GetHwNotificationState(p,a,b) (p)->lpVtbl->GetHwNotificationState(p,a,b) +#define IStillImage_RefreshDeviceBus(p,a) (p)->lpVtbl->RefreshDeviceBus(p,a) +#define IStillImage_LaunchApplicationForDevice(p,a,b,c) (p)->lpVtbl->LaunchApplicationForDevice(p,a,b,c) +#define IStillImage_SetupDeviceParameters(p,a) (p)->lpVtbl->SetupDeviceParameters(p,a) +#define IStillImage_WriteToErrorLog(p,a,b) (p)->lpVtbl->WriteToErrorLog(p,a,b) +#else +/*** IUnknown methods ***/ +#define IStillImage_QueryInterface(p,a,b) (p)->QueryInterface(a,b) +#define IStillImage_AddRef(p) (p)->AddRef() +#define IStillImage_Release(p) (p)->Release() +/*** IStillImage methods ***/ +#define IStillImage_Initialize(p,a,b) (p)->Initialize(a,b) +#define IStillImage_GetDeviceList(p,a,b,c,d) (p)->GetDeviceList(a,b,c,d) +#define IStillImage_GetDeviceInfo(p,a,b) (p)->GetDeviceInfo(a,b) +#define IStillImage_CreateDevice(p,a,b,c,d) (p)->CreateDevice(a,b,c,d) +#define IStillImage_GetDeviceValue(p,a,b,c,d,e) (p)->GetDeviceValue(a,b,c,d,e) +#define IStillImage_SetDeviceValue(p,a,b,c,d,e) (p)->SetDeviceValue(a,b,c,d,e) +#define IStillImage_GetSTILaunchInformation(p,a,b,c) (p)->GetSTILaunchInformation(a,b,c) +#define IStillImage_RegisterLaunchApplication(p,a,b) (p)->RegisterLaunchApplication(a,b) +#define IStillImage_UnregisterLaunchApplication(p,a) (p)->UnregisterLaunchApplication(a) +#define IStillImage_EnableHwNotifications(p,a,b) (p)->EnableHwNotifications(a,b) +#define IStillImage_GetHwNotificationState(p,a,b) (p)->GetHwNotificationState(a,b) +#define IStillImage_RefreshDeviceBus(p,a) (p)->RefreshDeviceBus(a) +#define IStillImage_LaunchApplicationForDevice(p,a,b,c) (p)->LaunchApplicationForDevice(a,b,c) +#define IStillImage_SetupDeviceParameters(p,a) (p)->SetupDeviceParameters(a) +#define IStillImage_WriteToErrorLog(p,a,b) (p)->WriteToErrorLog(a,b) +#endif + #ifdef __cplusplus }; #endif diff --git a/reactos/include/psdk/wia.h b/reactos/include/psdk/wia.h new file mode 100644 index 00000000000..3a0497e6d83 --- /dev/null +++ b/reactos/include/psdk/wia.h @@ -0,0 +1,28 @@ +/* + * Copyright (C) 2009 Damjan Jovanovic + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + + +#ifdef __WINESRC__ +#error Specify wia_lh.h or wia_xp.h explicitly in Wine +#endif + +#if (_WIN32_WINNT >= 0x0600) +#include +#elif (_WIN32_WINNT >= 0x0501) +#include +#endif diff --git a/reactos/include/psdk/wia_lh.idl b/reactos/include/psdk/wia_lh.idl new file mode 100644 index 00000000000..5024787a6fc --- /dev/null +++ b/reactos/include/psdk/wia_lh.idl @@ -0,0 +1,127 @@ +/* + * Copyright 2009 Damjan Jovanovic + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +import "wtypes.idl"; +import "objidl.idl"; + +interface IEnumWIA_DEV_INFO; +interface IWiaItem; +interface IWiaEventCallback; + +cpp_quote("DEFINE_GUID(CLSID_WiaDevMgr, 0xa1f4e726,0x8cf1,0x11d1,0xbf,0x92,0x00,0x60,0x08,0x1e,0xd8,0x11);") + +[ + object, + uuid(5eb2502a-8cf1-11d1-bf92-0060081ed811) +] +interface IWiaDevMgr : IUnknown +{ + HRESULT EnumDeviceInfo( + [in] LONG lFlag, + [retval, out] IEnumWIA_DEV_INFO **ppIEnum); + + HRESULT CreateDevice( + [in] BSTR bstrDeviceID, + [out] IWiaItem **ppWiaItemRoot); + + HRESULT SelectDeviceDlg( + [in] HWND hwndParent, + [in] LONG lDeviceType, + [in] LONG lFlags, + [in, out] BSTR *pbstrDeviceID, + [retval, out] IWiaItem **ppItemRoot); + + HRESULT SelectDeviceDlgID( + [in] HWND hwndParent, + [in] LONG lDeviceType, + [in] LONG lFlags, + [retval, out] BSTR *pbstrDeviceID); + + HRESULT GetImageDlg( + [in] HWND hwndParent, + [in] LONG lDeviceType, + [in] LONG lFlags, + [in] LONG lIntent, + [in] IWiaItem *pItemRoot, + [in] BSTR bstrFilename, + [in, out] GUID *pguidFormat); + + HRESULT RegisterEventCallbackProgram( + [in] LONG lFlags, + [in] BSTR bstrDeviceID, + [in] const GUID *pEventGUID, + [in] BSTR bstrCommandline, + [in] BSTR bstrName, + [in] BSTR bstrDescription, + [in] BSTR bstrIcon); + + HRESULT RegisterEventCallbackInterface( + [in] LONG lFlags, + [in] BSTR bstrDeviceID, + [in] const GUID *pEventGUID, + [unique, in] IWiaEventCallback *pIWiaEventCallback, + [out] IUnknown **pEventObject); + + HRESULT RegisterEventCallbackCLSID( + [in] LONG lFlags, + [in] BSTR bstrDeviceID, + [in] const GUID *pEventGUID, + [unique, in] const GUID *pClsID, + [in] BSTR bstrName, + [in] BSTR bstrDescription, + [in] BSTR bstrIcon); + + HRESULT AddDeviceDlg( + [in] HWND hwndParent, + [in] LONG lFlags); +} + +[ + object, + uuid(5e38b83c-8cf1-11d1-bf92-0060081ed811) +] +interface IEnumWIA_DEV_INFO : IUnknown +{ + /* fill in */ +} + +[ + object, + uuid(4db1ad10-3391-11d2-9a33-00c04fa36145) +] +interface IWiaItem : IUnknown +{ + /* FIXME: fill in */ +} + +[ + object, + uuid(ae6287b0-0084-11d2-973b-00a0c9068f2e) +] +interface IWiaEventCallback : IUnknown +{ + HRESULT ImageEventCallback( + [in] const GUID *pEventGUID, + [in] BSTR bstrEventDescription, + [in] BSTR bstrDeviceID, + [in] BSTR bstrDeviceDescription, + [in] DWORD dwDeviceType, + [in] BSTR bstrFullItemName, + [in,out] ULONG *pulEventType, + [in] ULONG ulReserved); +} diff --git a/reactos/include/psdk/wia_xp.idl b/reactos/include/psdk/wia_xp.idl new file mode 100644 index 00000000000..5024787a6fc --- /dev/null +++ b/reactos/include/psdk/wia_xp.idl @@ -0,0 +1,127 @@ +/* + * Copyright 2009 Damjan Jovanovic + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +import "wtypes.idl"; +import "objidl.idl"; + +interface IEnumWIA_DEV_INFO; +interface IWiaItem; +interface IWiaEventCallback; + +cpp_quote("DEFINE_GUID(CLSID_WiaDevMgr, 0xa1f4e726,0x8cf1,0x11d1,0xbf,0x92,0x00,0x60,0x08,0x1e,0xd8,0x11);") + +[ + object, + uuid(5eb2502a-8cf1-11d1-bf92-0060081ed811) +] +interface IWiaDevMgr : IUnknown +{ + HRESULT EnumDeviceInfo( + [in] LONG lFlag, + [retval, out] IEnumWIA_DEV_INFO **ppIEnum); + + HRESULT CreateDevice( + [in] BSTR bstrDeviceID, + [out] IWiaItem **ppWiaItemRoot); + + HRESULT SelectDeviceDlg( + [in] HWND hwndParent, + [in] LONG lDeviceType, + [in] LONG lFlags, + [in, out] BSTR *pbstrDeviceID, + [retval, out] IWiaItem **ppItemRoot); + + HRESULT SelectDeviceDlgID( + [in] HWND hwndParent, + [in] LONG lDeviceType, + [in] LONG lFlags, + [retval, out] BSTR *pbstrDeviceID); + + HRESULT GetImageDlg( + [in] HWND hwndParent, + [in] LONG lDeviceType, + [in] LONG lFlags, + [in] LONG lIntent, + [in] IWiaItem *pItemRoot, + [in] BSTR bstrFilename, + [in, out] GUID *pguidFormat); + + HRESULT RegisterEventCallbackProgram( + [in] LONG lFlags, + [in] BSTR bstrDeviceID, + [in] const GUID *pEventGUID, + [in] BSTR bstrCommandline, + [in] BSTR bstrName, + [in] BSTR bstrDescription, + [in] BSTR bstrIcon); + + HRESULT RegisterEventCallbackInterface( + [in] LONG lFlags, + [in] BSTR bstrDeviceID, + [in] const GUID *pEventGUID, + [unique, in] IWiaEventCallback *pIWiaEventCallback, + [out] IUnknown **pEventObject); + + HRESULT RegisterEventCallbackCLSID( + [in] LONG lFlags, + [in] BSTR bstrDeviceID, + [in] const GUID *pEventGUID, + [unique, in] const GUID *pClsID, + [in] BSTR bstrName, + [in] BSTR bstrDescription, + [in] BSTR bstrIcon); + + HRESULT AddDeviceDlg( + [in] HWND hwndParent, + [in] LONG lFlags); +} + +[ + object, + uuid(5e38b83c-8cf1-11d1-bf92-0060081ed811) +] +interface IEnumWIA_DEV_INFO : IUnknown +{ + /* fill in */ +} + +[ + object, + uuid(4db1ad10-3391-11d2-9a33-00c04fa36145) +] +interface IWiaItem : IUnknown +{ + /* FIXME: fill in */ +} + +[ + object, + uuid(ae6287b0-0084-11d2-973b-00a0c9068f2e) +] +interface IWiaEventCallback : IUnknown +{ + HRESULT ImageEventCallback( + [in] const GUID *pEventGUID, + [in] BSTR bstrEventDescription, + [in] BSTR bstrDeviceID, + [in] BSTR bstrDeviceDescription, + [in] DWORD dwDeviceType, + [in] BSTR bstrFullItemName, + [in,out] ULONG *pulEventType, + [in] ULONG ulReserved); +} diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index 828e413dbc1..a1fbc15d694 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -52,13 +52,13 @@ reactos/dll/win32/comctl32 # Autosync ?? reactos/dll/win32/comdlg32 # Autosync reactos/dll/win32/compstui # Autosync reactos/dll/win32/credui # Autosync -reactos/dll/win32/crypt32 # Synced to Wine-1_1_40 +reactos/dll/win32/crypt32 # Synced to Wine-1_1_43 reactos/dll/win32/cryptdlg # Autosync reactos/dll/win32/cryptdll # Autosync reactos/dll/win32/cryptnet # Autosync reactos/dll/win32/cryptui # Autosync reactos/dll/win32/dbghelp # Synced to Wine-20080802 -reactos/dll/win32/dciman32 # Synced to Wine-1_0-rc2 +reactos/dll/win32/dciman32 # Synced to Wine-1_1_43 reactos/dll/win32/dwmapi # Autosync reactos/dll/win32/fusion # Autosync reactos/dll/win32/gdiplus # Autosync @@ -113,7 +113,7 @@ reactos/dll/win32/mstask # Autosync reactos/dll/win32/msvcrt20 # Autosync reactos/dll/win32/msvfw32 # Autosync reactos/dll/win32/msvidc32 # Autosync -reactos/dll/win32/msxml3 # Synced to Wine-1_1_40 +reactos/dll/win32/msxml3 # Synced to Wine-1_1_43 reactos/dll/win32/nddeapi # Autosync reactos/dll/win32/netapi32 # Autosync reactos/dll/win32/ntdsapi # Autosync @@ -144,6 +144,8 @@ reactos/dll/win32/rsabase # Autosync reactos/dll/win32/rsaenh # Autosync reactos/dll/win32/sccbase # Autosync reactos/dll/win32/schannel # Autosync ?? +reactos/dll/win32/secur32 # Forked +reactos/dll/win32/security # Forked (different .spec) reactos/dll/win32/sensapi # Autosync reactos/dll/win32/setupapi # Forked at Wine-20050524 reactos/dll/win32/shell32 # Forked at Wine-20071011 @@ -154,7 +156,7 @@ reactos/dll/win32/slbcsp # Autosync reactos/dll/win32/softpub # Autosync reactos/dll/win32/spoolss # Autosync reactos/dll/win32/stdole2.tlb # Autosync -reactos/dll/win32/sti # Autosync ?? +reactos/dll/win32/sti # Autosync reactos/dll/win32/sxs # Autosync reactos/dll/win32/tapi32 # Autosync reactos/dll/win32/traffic # Autosync @@ -203,7 +205,7 @@ In addition the following libs, dlls and source files are mostly based on code p from Winehq CVS. If you are looking to update something in these files check Wine current souces first as it may already be fixed. -reactos/lib/uuid # Synced to Wine-20080114 +reactos/lib/sdk/uuid # Synced to Wine-1.1.42 advapi32 - reactos/dll/win32/advapi32/crypt/*.c # ekohl says we're not sharing this From f90e9cc90348ef708d8cacdcf34c14c6ddec399d Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Tue, 20 Apr 2010 22:47:51 +0000 Subject: [PATCH 021/131] [NTOS]: Read almost all the Memory Management variables into the system configuration vector. These includes pool limits, percentages, debugging flags, behavioral changes, and others. [NTOS]: Minimal stubbed support for some large page functionality in case it gets implemented later and these things would've been ignored. One critical change is that now the MmProcessList is initialized, and the system process is added to it. Other processes should be added later. [NTOS]: Add stubbed support for parsing the registry list of drivers that should have large pages enabled. [NTOS]: Initialize the loaded module list before working set work. [NTOS]: Reload the boot drivers much earlier, as part of ARM3 initialization. [NTOS]: Start doing some minor MmResidentAvailablePages accounting during bootup. [NTOS]: Start doing the math required for computing the appropriate MmSystemCacheWsMinimum on the booting system (based on RAM). [NTOS]: Now that we use the HAL heap, add the code to scan it for I/O mappings. These are dangerous because we need to sync up caching attributes (not yet used in ReactOS, so not a problem for now). [NTOS]: Add more header definitions, and helper definitions such as PDE_MAPPED_VA instead of doing the math by hand. [NTOS]: Move MmPageEntireDriver and MmResetDriverPaging to sysldr.c since drvmgmt.c is more for Driver Verifier-style functionality. svn path=/trunk/; revision=46971 --- reactos/ntoskrnl/config/cmdata.c | 53 ++++----- reactos/ntoskrnl/mm/ARM3/drvmgmt.c | 117 ++------------------ reactos/ntoskrnl/mm/ARM3/largepag.c | 102 ++++++++++++++++++ reactos/ntoskrnl/mm/ARM3/mdlsup.c | 3 + reactos/ntoskrnl/mm/ARM3/miarm.h | 110 ++++++++++++++++++- reactos/ntoskrnl/mm/ARM3/mminit.c | 132 +++++++++++++++++++++-- reactos/ntoskrnl/mm/ARM3/pfnlist.c | 3 + reactos/ntoskrnl/mm/ARM3/pool.c | 2 + reactos/ntoskrnl/mm/freelist.c | 5 +- reactos/ntoskrnl/mm/mminit.c | 9 +- reactos/ntoskrnl/mm/pagefile.c | 2 + reactos/ntoskrnl/mm/section.c | 2 + reactos/ntoskrnl/mm/sysldr.c | 84 +++++++++++++++ reactos/ntoskrnl/ntoskrnl-generic.rbuild | 1 + 14 files changed, 465 insertions(+), 160 deletions(-) create mode 100644 reactos/ntoskrnl/mm/ARM3/largepag.c diff --git a/reactos/ntoskrnl/config/cmdata.c b/reactos/ntoskrnl/config/cmdata.c index b3df10ce438..6dbf2a0380d 100644 --- a/reactos/ntoskrnl/config/cmdata.c +++ b/reactos/ntoskrnl/config/cmdata.c @@ -11,7 +11,8 @@ #include "ntoskrnl.h" #define NDEBUG #include "debug.h" - +#include "./../mm/ARM3/miarm.h" + /* GLOBALS *******************************************************************/ ULONG DummyData; @@ -252,7 +253,7 @@ CM_SYSTEM_CONTROL_VECTOR CmControlVector[] = { L"Session Manager\\Memory Management", L"DynamicMemory", - &DummyData, + &MmDynamicPfn, NULL, NULL }, @@ -260,7 +261,7 @@ CM_SYSTEM_CONTROL_VECTOR CmControlVector[] = { L"Session Manager\\Memory Management", L"Mirroring", - &DummyData, + &MmMirroring, NULL, NULL }, @@ -273,14 +274,6 @@ CM_SYSTEM_CONTROL_VECTOR CmControlVector[] = NULL }, - { - L"Session Manager\\Memory Management", - L"SessionViewSize", - &DummyData, - NULL, - NULL - }, - { L"Session Manager\\Memory Management", L"SessionImageSize", @@ -300,7 +293,7 @@ CM_SYSTEM_CONTROL_VECTOR CmControlVector[] = { L"Session Manager\\Memory Management", L"PoolUsageMaximum", - &DummyData, + &MmConsumedPoolPercentage, NULL, NULL }, @@ -308,7 +301,7 @@ CM_SYSTEM_CONTROL_VECTOR CmControlVector[] = { L"Session Manager\\Memory Management", L"MapAllocationFragment", - &DummyData, + &MmAllocationFragment, NULL, NULL }, @@ -316,7 +309,7 @@ CM_SYSTEM_CONTROL_VECTOR CmControlVector[] = { L"Session Manager\\Memory Management", L"PagedPoolSize", - &DummyData, + &MmSizeOfPagedPoolInBytes, NULL, NULL }, @@ -324,7 +317,7 @@ CM_SYSTEM_CONTROL_VECTOR CmControlVector[] = { L"Session Manager\\Memory Management", L"NonPagedPoolSize", - &DummyData, + &MmSizeOfNonPagedPoolInBytes, NULL, NULL }, @@ -340,7 +333,7 @@ CM_SYSTEM_CONTROL_VECTOR CmControlVector[] = { L"Session Manager\\Memory Management", L"LargeSystemCache", - &DummyData, + &MmLargeSystemCache, NULL, NULL }, @@ -356,7 +349,7 @@ CM_SYSTEM_CONTROL_VECTOR CmControlVector[] = { L"Session Manager\\Memory Management", L"SystemPages", - &DummyData, + &MmNumberOfSystemPtes, NULL, NULL }, @@ -364,7 +357,7 @@ CM_SYSTEM_CONTROL_VECTOR CmControlVector[] = { L"Session Manager\\Memory Management", L"LowMemoryThreshold", - &DummyData, + &MmLowMemoryThreshold, NULL, NULL }, @@ -372,7 +365,7 @@ CM_SYSTEM_CONTROL_VECTOR CmControlVector[] = { L"Session Manager\\Memory Management", L"HighMemoryThreshold", - &DummyData, + &MmHighMemoryThreshold, NULL, NULL }, @@ -396,7 +389,7 @@ CM_SYSTEM_CONTROL_VECTOR CmControlVector[] = { L"Session Manager\\Memory Management", L"SecondLevelDataCache", - &DummyData, + &MmSecondaryColors, NULL, NULL }, @@ -404,7 +397,7 @@ CM_SYSTEM_CONTROL_VECTOR CmControlVector[] = { L"Session Manager\\Memory Management", L"ClearPageFileAtShutdown", - &DummyData, + &MmZeroPageFile, NULL, NULL }, @@ -452,7 +445,7 @@ CM_SYSTEM_CONTROL_VECTOR CmControlVector[] = { L"Session Manager\\Memory Management", L"ProtectNonPagedPool", - &DummyData, + &MmProtectFreedNonPagedPool, NULL, NULL }, @@ -460,7 +453,7 @@ CM_SYSTEM_CONTROL_VECTOR CmControlVector[] = { L"Session Manager\\Memory Management", L"TrackLockedPages", - &DummyData, + &MmTrackLockedPages, NULL, NULL }, @@ -468,7 +461,7 @@ CM_SYSTEM_CONTROL_VECTOR CmControlVector[] = { L"Session Manager\\Memory Management", L"TrackPtes", - &DummyData, + &MmTrackPtes, NULL, NULL }, @@ -476,15 +469,15 @@ CM_SYSTEM_CONTROL_VECTOR CmControlVector[] = { L"Session Manager\\Memory Management", L"VerifyDrivers", - &DummyData, - &DummyData, - &DummyData + MmVerifyDriverBuffer, + &MmVerifyDriverBufferLength, + &MmVerifyDriverBufferType }, { L"Session Manager\\Memory Management", L"VerifyDriverLevel", - &DummyData, + &MmVerifyDriverLevel, NULL, NULL }, @@ -508,7 +501,7 @@ CM_SYSTEM_CONTROL_VECTOR CmControlVector[] = { L"Session Manager\\Memory Management", L"EnforceWriteProtection", - &DummyData, + &MmEnforceWriteProtection, NULL, NULL }, @@ -516,7 +509,7 @@ CM_SYSTEM_CONTROL_VECTOR CmControlVector[] = { L"Session Manager\\Memory Management", L"MakeLowMemory", - &DummyData, + &MmMakeLowMemory, NULL, NULL }, diff --git a/reactos/ntoskrnl/mm/ARM3/drvmgmt.c b/reactos/ntoskrnl/mm/ARM3/drvmgmt.c index 4811a441dd4..ad85c479ca5 100644 --- a/reactos/ntoskrnl/mm/ARM3/drvmgmt.c +++ b/reactos/ntoskrnl/mm/ARM3/drvmgmt.c @@ -21,55 +21,12 @@ MM_DRIVER_VERIFIER_DATA MmVerifierData; LIST_ENTRY MiVerifierDriverAddedThunkListHead; ULONG MiActiveVerifierThunks; - -/* PRIVATE FUNCTIONS *********************************************************/ - -PLDR_DATA_TABLE_ENTRY -NTAPI -MiLookupDataTableEntry(IN PVOID Address) -{ - PLDR_DATA_TABLE_ENTRY LdrEntry, FoundEntry = NULL; - PLIST_ENTRY NextEntry; - PAGED_CODE(); - - // - // Loop entries - // - NextEntry = PsLoadedModuleList.Flink; - do - { - // - // Get the loader entry - // - LdrEntry = CONTAINING_RECORD(NextEntry, - LDR_DATA_TABLE_ENTRY, - InLoadOrderLinks); - - // - // Check if the address matches - // - if ((Address >= LdrEntry->DllBase) && - (Address < (PVOID)((ULONG_PTR)LdrEntry->DllBase + - LdrEntry->SizeOfImage))) - { - // - // Found a match - // - FoundEntry = LdrEntry; - break; - } - - // - // Move on - // - NextEntry = NextEntry->Flink; - } while(NextEntry != &PsLoadedModuleList); - - // - // Return the entry - // - return FoundEntry; -} +WCHAR MmVerifyDriverBuffer[512] = {0}; +ULONG MmVerifyDriverBufferLength = sizeof(MmVerifyDriverBuffer); +ULONG MmVerifyDriverBufferType = REG_NONE; +ULONG MmVerifyDriverLevel = -1; +PVOID MmTriageActionTaken; +PVOID KernelVerifier; /* PUBLIC FUNCTIONS ***********************************************************/ @@ -107,68 +64,6 @@ MmLockPageableDataSection(IN PVOID AddressWithinSection) return AddressWithinSection; } -/* - * @unimplemented - */ -PVOID -NTAPI -MmPageEntireDriver(IN PVOID AddressWithinSection) -{ - //PMMPTE StartPte, EndPte; - PLDR_DATA_TABLE_ENTRY LdrEntry; - PAGED_CODE(); - - // - // Get the loader entry - // - LdrEntry = MiLookupDataTableEntry(AddressWithinSection); - if (!LdrEntry) return NULL; - - // - // Check if paging of kernel mode is disabled or if the driver is mapped as - // an image - // - if ((MmDisablePagingExecutive & 0x1) || (LdrEntry->SectionPointer)) - { - // - // Don't do anything, just return the base address - // - return LdrEntry->DllBase; - } - - // - // Wait for active DPCs to finish before we page out the driver - // - KeFlushQueuedDpcs(); - - // - // Get the PTE range for the whole driver image - // - //StartPte = MiGetPteAddress(LdrEntry->DllBase); - //EndPte = MiGetPteAddress(LdrEntry->DllBase + - // LdrEntry->SizeOfImage); - - // - // Enable paging for the PTE range - // - //MiSetPagingOfDriver(StartPte, EndPte); - - // - // Return the base address - // - return LdrEntry->DllBase; -} - -/* - * @unimplemented - */ -VOID -NTAPI -MmResetDriverPaging(IN PVOID AddressWithinSection) -{ - UNIMPLEMENTED; -} - /* * @unimplemented */ diff --git a/reactos/ntoskrnl/mm/ARM3/largepag.c b/reactos/ntoskrnl/mm/ARM3/largepag.c new file mode 100644 index 00000000000..0cd1e502f2e --- /dev/null +++ b/reactos/ntoskrnl/mm/ARM3/largepag.c @@ -0,0 +1,102 @@ +/* + * PROJECT: ReactOS Kernel + * LICENSE: BSD - See COPYING.ARM in the top level directory + * FILE: ntoskrnl/mm/ARM3/largepag.c + * PURPOSE: ARM Memory Manager Large Page Support + * PROGRAMMERS: ReactOS Portable Systems Group + */ + +/* INCLUDES *******************************************************************/ + +#include +#define NDEBUG +#include + +#line 15 "ARM³::LARGEPAGE" +#define MODULE_INVOLVED_IN_ARM3 +#include "../ARM3/miarm.h" + +/* GLOBALS ********************************************************************/ + +LIST_ENTRY MmProcessList; +PMMPTE MiLargePageHyperPte; +ULONG MiLargePageRangeIndex; +MI_LARGE_PAGE_RANGES MiLargePageRanges[64]; +WCHAR MmLargePageDriverBuffer[512] = {0}; +ULONG MmLargePageDriverBufferLength = -1; +LIST_ENTRY MiLargePageDriverList; +BOOLEAN MiLargePageAllDrivers; + +/* FUNCTIONS ******************************************************************/ + +VOID +NTAPI +MiInitializeLargePageSupport(VOID) +{ +#if _MI_PAGING_LEVELS > 2 +#error "PAE/x64 Not Implemented" +#else + /* Initialize the large-page hyperspace PTE used for initial mapping */ + MiLargePageHyperPte = MiReserveSystemPtes(1, SystemPteSpace); + ASSERT(MiLargePageHyperPte); + MiLargePageHyperPte->u.Long = 0; + + /* Initialize the process tracking list, and insert the system process */ + InitializeListHead(&MmProcessList); + InsertTailList(&MmProcessList, &PsGetCurrentProcess()->MmProcessLinks); +#endif +} + +VOID +NTAPI +MiSyncCachedRanges(VOID) +{ + ULONG i; + + /* Scan every range */ + for (i = 0; i < MiLargePageRangeIndex; i++) + { + DPRINT1("No support for large pages\n"); + while (TRUE); + } +} + +VOID +NTAPI +MiInitializeDriverLargePageList(VOID) +{ + PWCHAR p, pp; + + /* Initialize the list */ + InitializeListHead(&MiLargePageDriverList); + + /* Bail out if there's nothing */ + if (MmLargePageDriverBufferLength == 0xFFFFFFFF) return; + + /* Loop from start to finish */ + p = MmLargePageDriverBuffer; + pp = MmLargePageDriverBuffer + (MmLargePageDriverBufferLength / sizeof(WCHAR)); + while (p < pp) + { + /* Skip whitespaces */ + if ((*p == L' ') || (*p == L'\n') || (*p == L'\r') || (*p == L'\t')) + { + /* Skip the character */ + p++; + continue; + } + + /* A star means everything */ + if (*p == L'*') + { + /* No need to keep going */ + MiLargePageAllDrivers = TRUE; + break; + } + + DPRINT1("Large page drivers not supported\n"); + ASSERT(FALSE); + } +} + +/* EOF */ diff --git a/reactos/ntoskrnl/mm/ARM3/mdlsup.c b/reactos/ntoskrnl/mm/ARM3/mdlsup.c index 0100040f1c7..1b95448fc43 100644 --- a/reactos/ntoskrnl/mm/ARM3/mdlsup.c +++ b/reactos/ntoskrnl/mm/ARM3/mdlsup.c @@ -16,6 +16,9 @@ #define MODULE_INVOLVED_IN_ARM3 #include "../ARM3/miarm.h" +BOOLEAN MmTrackPtes; +BOOLEAN MmTrackLockedPages; + /* PUBLIC FUNCTIONS ***********************************************************/ /* diff --git a/reactos/ntoskrnl/mm/ARM3/miarm.h b/reactos/ntoskrnl/mm/ARM3/miarm.h index 1ced65de25d..11d4189a958 100644 --- a/reactos/ntoskrnl/mm/ARM3/miarm.h +++ b/reactos/ntoskrnl/mm/ARM3/miarm.h @@ -42,6 +42,9 @@ #define _1KB (1024) #define _1MB (1024 * _1KB) +/* Are mapped by a PDE */ +#define PDE_MAPPED_VA (PTE_COUNT * PAGE_SIZE) + /* Size of a PDE directory, and size of a page table */ #define PDE_SIZE (PDE_COUNT * sizeof(MMPDE)) #define PT_SIZE (PTE_COUNT * sizeof(MMPTE)) @@ -59,6 +62,40 @@ #error Define these please! #endif +#ifdef _M_IX86 +#define IMAGE_FILE_MACHINE_NATIVE IMAGE_FILE_MACHINE_I386 +#elif _M_ARM +#define IMAGE_FILE_MACHINE_NATIVE IMAGE_FILE_MACHINE_ARM +#elif _M_AMD64 +#define IMAGE_FILE_MACHINE_NATIVE IMAGE_FILE_MACHINE_AMD64 +#else +#error Define these please! +#endif + +// +// Protection Bits part of the internal memory manager Protection Mask +// Taken from http://www.reactos.org/wiki/Techwiki:Memory_management_in_the_Windows_XP_kernel +// and public assertions. +// +#define MM_ZERO_ACCESS 0 +#define MM_READONLY 1 +#define MM_EXECUTE 2 +#define MM_EXECUTE_READ 3 +#define MM_READWRITE 4 +#define MM_WRITECOPY 5 +#define MM_EXECUTE_READWRITE 6 +#define MM_EXECUTE_WRITECOPY 7 +#define MM_NOCACHE 8 +#define MM_DECOMMIT 0x10 +#define MM_NOACCESS (MM_DECOMMIT | MM_NOCACHE) + +// +// Special values for LoadedImports +// +#define MM_SYSLDR_NO_IMPORTS (PVOID)0xFFFFFFFE +#define MM_SYSLDR_BOOT_LOADED (PVOID)0xFFFFFFFF +#define MM_SYSLDR_SINGLE_ENTRY 0x1 + // // PFN List Sentinel // @@ -168,10 +205,34 @@ typedef struct _MMCOLOR_TABLES PFN_NUMBER Count; } MMCOLOR_TABLES, *PMMCOLOR_TABLES; +typedef struct _MI_LARGE_PAGE_RANGES +{ + PFN_NUMBER StartFrame; + PFN_NUMBER LastFrame; +} MI_LARGE_PAGE_RANGES, *PMI_LARGE_PAGE_RANGES; + extern MMPTE HyperTemplatePte; extern MMPTE ValidKernelPde; extern MMPTE ValidKernelPte; - +extern BOOLEAN MmLargeSystemCache; +extern BOOLEAN MmZeroPageFile; +extern BOOLEAN MmProtectFreedNonPagedPool; +extern BOOLEAN MmTrackLockedPages; +extern BOOLEAN MmTrackPtes; +extern BOOLEAN MmDynamicPfn; +extern BOOLEAN MmMirroring; +extern BOOLEAN MmMakeLowMemory; +extern BOOLEAN MmEnforceWriteProtection; +extern ULONG MmAllocationFragment; +extern ULONG MmConsumedPoolPercentage; +extern ULONG MmVerifyDriverBufferType; +extern ULONG MmVerifyDriverLevel; +extern WCHAR MmVerifyDriverBuffer[512]; +extern WCHAR MmLargePageDriverBuffer[512]; +extern LIST_ENTRY MiLargePageDriverList; +extern BOOLEAN MiLargePageAllDrivers; +extern ULONG MmVerifyDriverBufferLength; +extern ULONG MmLargePageDriverBufferLength; extern ULONG MmSizeOfNonPagedPoolInBytes; extern ULONG MmMaximumNonPagedPoolInBytes; extern PFN_NUMBER MmMaximumNonPagedPoolInPages; @@ -243,11 +304,32 @@ extern PFN_NUMBER MmMinimumFreePages; extern PFN_NUMBER MmPlentyFreePages; extern PFN_NUMBER MiExpansionPoolPagesInitialCharge; extern PFN_NUMBER MmResidentAvailablePages; -extern PFN_NUMBER MmResidentAvailablePagesAtInit; +extern PFN_NUMBER MmResidentAvailableAtInit; +extern ULONG MmTotalFreeSystemPtes[MaximumPtePoolTypes]; +extern PFN_NUMBER MmTotalSystemDriverPages; +extern PVOID MiSessionImageStart; +extern PVOID MiSessionImageEnd; #define MI_PFN_TO_PFNENTRY(x) (&MmPfnDatabase[1][x]) #define MI_PFNENTRY_TO_PFN(x) (x - MmPfnDatabase[1]) +#define MI_IS_SESSION_IMAGE_ADDRESS(Address) \ + (((Address) >= MiSessionImageStart) && ((Address) < MiSessionImageEnd)) + +#define MI_IS_SESSION_ADDRESS(Address) \ + (((Address) >= MmSessionBase) && ((Address) < MiSessionSpaceEnd)) + +FORCEINLINE +BOOLEAN +MI_IS_PHYSICAL_ADDRESS(IN PVOID Address) +{ + PMMPDE PointerPde; + + /* Large pages are never paged out, always physically resident */ + PointerPde = MiAddressToPde(Address); + return ((PointerPde->u.Hard.LargePage) && (PointerPde->u.Hard.Valid)); +} + NTSTATUS NTAPI MmArmInitSystem( @@ -457,4 +539,28 @@ MiInsertPageInFreeList( IN PFN_NUMBER PageFrameIndex ); +PLDR_DATA_TABLE_ENTRY +NTAPI +MiLookupDataTableEntry( + IN PVOID Address +); + +VOID +NTAPI +MiInitializeDriverLargePageList( + VOID +); + +VOID +NTAPI +MiInitializeLargePageSupport( + VOID +); + +VOID +NTAPI +MiSyncCachedRanges( + VOID +); + /* EOF */ diff --git a/reactos/ntoskrnl/mm/ARM3/mminit.c b/reactos/ntoskrnl/mm/ARM3/mminit.c index 89d082e4f95..d21adc08758 100644 --- a/reactos/ntoskrnl/mm/ARM3/mminit.c +++ b/reactos/ntoskrnl/mm/ARM3/mminit.c @@ -301,6 +301,20 @@ PFN_NUMBER MmPlentyFreePages = 400; ULONG MmProductType; MM_SYSTEMSIZE MmSystemSize; +/* + * These values store the cache working set minimums and maximums, in pages + * + * The minimum value is boosted on systems with more than 24MB of RAM, and cut + * down to only 32 pages on embedded (<24MB RAM) systems. + * + * An extra boost of 2MB is given on systems with more than 33MB of RAM. + */ +PFN_NUMBER MmSystemCacheWsMinimum = 288; +PFN_NUMBER MmSystemCacheWsMaximum = 350; + +/* FIXME: Move to cache/working set code later */ +BOOLEAN MmLargeSystemCache; + /* PRIVATE FUNCTIONS **********************************************************/ // @@ -742,7 +756,7 @@ MiBuildPfnDatabaseFromPages(IN PLOADER_PARAMETER_BLOCK LoaderBlock) else { /* Next PDE mapped address */ - BaseAddress += PTE_COUNT * PAGE_SIZE; + BaseAddress += PDE_MAPPED_VA; } /* Next PTE */ @@ -1159,6 +1173,61 @@ MiInitializeMemoryEvents(VOID) return TRUE; } +VOID +NTAPI +MiAddHalIoMappings(VOID) +{ + PVOID BaseAddress; + PMMPTE PointerPde; + PMMPTE PointerPte; + ULONG i, j, PdeCount; + PFN_NUMBER PageFrameIndex; + + /* HAL Heap address -- should be on a PDE boundary */ + BaseAddress = (PVOID)0xFFC00000; + ASSERT(MiAddressToPteOffset(BaseAddress) == 0); + + /* Check how many PDEs the heap has */ + PointerPde = MiAddressToPde(BaseAddress); + PdeCount = PDE_COUNT - ADDR_TO_PDE_OFFSET(BaseAddress); + for (i = 0; i < PdeCount; i++) + { + /* Does the HAL own this mapping? */ + if ((PointerPde->u.Hard.Valid == 1) && + (PointerPde->u.Hard.LargePage == 0)) + { + /* Get the PTE for it and scan each page */ + PointerPte = MiAddressToPte(BaseAddress); + for (j = 0 ; j < PTE_COUNT; j++) + { + /* Does the HAL own this page? */ + if (PointerPte->u.Hard.Valid == 1) + { + /* Is the HAL using it for device or I/O mapped memory? */ + PageFrameIndex = PFN_FROM_PTE(PointerPte); + if (!MiGetPfnEntry(PageFrameIndex)) + { + /* FIXME: For PAT, we need to track I/O cache attributes for coherency */ + DPRINT1("HAL I/O Mapping at %p is unsafe\n", BaseAddress); + } + } + + /* Move to the next page */ + BaseAddress = (PVOID)((ULONG_PTR)BaseAddress + PAGE_SIZE); + PointerPte++; + } + } + else + { + /* Move to the next address */ + BaseAddress = (PVOID)((ULONG_PTR)BaseAddress + PDE_MAPPED_VA); + } + + /* Move to the next PDE */ + PointerPde++; + } +} + VOID NTAPI MmDumpArmPfnDatabase(VOID) @@ -1813,11 +1882,26 @@ MmArmInitSystem(IN ULONG Phase, } } - // - // Size up paged pool and build the shadow system page directory - // - MiBuildPagedPool(); - + /* Look for large page cache entries that need caching */ + MiSyncCachedRanges(); + + /* Loop for HAL Heap I/O device mappings that need coherency tracking */ + MiAddHalIoMappings(); + + /* Set the initial resident page count */ + MmResidentAvailablePages = MmAvailablePages - 32; + + /* Initialize large page structures on PAE/x64, and MmProcessList on x86 */ + MiInitializeLargePageSupport(); + + /* Check if the registry says any drivers should be loaded with large pages */ + MiInitializeDriverLargePageList(); + + /* Relocate the boot drivers into system PTE space and fixup their PFNs */ + MiReloadBootLoadedDrivers(LoaderBlock); + + /* FIXME: Call out into Driver Verifier for initialization */ + /* Check how many pages the system has */ if (MmNumberOfPhysicalPages <= (13 * _1MB)) { @@ -1826,13 +1910,22 @@ MmArmInitSystem(IN ULONG Phase, } else if (MmNumberOfPhysicalPages <= (19 * _1MB)) { - /* Set small system */ + /* Set small system and add 100 pages for the cache */ MmSystemSize = MmSmallSystem; + MmSystemCacheWsMinimum += 100; } else { - /* Set medium system */ + /* Set medium system and add 400 pages for the cache */ MmSystemSize = MmMediumSystem; + MmSystemCacheWsMinimum += 400; + } + + /* Check for less than 24MB */ + if (MmNumberOfPhysicalPages < ((24 * _1MB) / PAGE_SIZE)) + { + /* No more than 32 pages */ + MmSystemCacheWsMinimum = 32; } /* Check for more than 32MB */ @@ -1854,7 +1947,14 @@ MmArmInitSystem(IN ULONG Phase, } } } - + + /* Check for more than 33 MB */ + if (MmNumberOfPhysicalPages > ((33 * _1MB) / PAGE_SIZE)) + { + /* Add another 500 pages to the cache */ + MmSystemCacheWsMinimum += 500; + } + /* Now setup the shared user data fields */ ASSERT(SharedUserData->NumberOfPhysicalPages == 0); SharedUserData->NumberOfPhysicalPages = MmNumberOfPhysicalPages; @@ -1888,6 +1988,20 @@ MmArmInitSystem(IN ULONG Phase, /* Update working set tuning parameters */ MiAdjustWorkingSetManagerParameters(!MmProductType); + + /* Finetune the page count by removing working set and NP expansion */ + MmResidentAvailablePages -= MiExpansionPoolPagesInitialCharge; + MmResidentAvailablePages -= MmSystemCacheWsMinimum; + MmResidentAvailableAtInit = MmResidentAvailablePages; + if (MmResidentAvailablePages <= 0) + { + /* This should not happen */ + DPRINT1("System cache working set too big\n"); + return FALSE; + } + + /* Size up paged pool and build the shadow system page directory */ + MiBuildPagedPool(); } // diff --git a/reactos/ntoskrnl/mm/ARM3/pfnlist.c b/reactos/ntoskrnl/mm/ARM3/pfnlist.c index 58043400af6..f42abdc82c9 100644 --- a/reactos/ntoskrnl/mm/ARM3/pfnlist.c +++ b/reactos/ntoskrnl/mm/ARM3/pfnlist.c @@ -18,6 +18,9 @@ /* GLOBALS ********************************************************************/ +BOOLEAN MmDynamicPfn; +BOOLEAN MmMirroring; + MMPFNLIST MmZeroedPageListHead = {0, ZeroedPageList, LIST_HEAD, LIST_HEAD}; MMPFNLIST MmFreePageListHead = {0, FreePageList, LIST_HEAD, LIST_HEAD}; MMPFNLIST MmStandbyPageListHead = {0, StandbyPageList, LIST_HEAD, LIST_HEAD}; diff --git a/reactos/ntoskrnl/mm/ARM3/pool.c b/reactos/ntoskrnl/mm/ARM3/pool.c index bd2f826c6d2..10a585e8912 100644 --- a/reactos/ntoskrnl/mm/ARM3/pool.c +++ b/reactos/ntoskrnl/mm/ARM3/pool.c @@ -26,6 +26,8 @@ KGUARDED_MUTEX MmPagedPoolMutex; MM_PAGED_POOL_INFO MmPagedPoolInfo; SIZE_T MmAllocatedNonPagedPool; ULONG MmSpecialPoolTag; +ULONG MmConsumedPoolPercentage; +BOOLEAN MmProtectFreedNonPagedPool; /* PRIVATE FUNCTIONS **********************************************************/ diff --git a/reactos/ntoskrnl/mm/freelist.c b/reactos/ntoskrnl/mm/freelist.c index 7f2646f7452..6f5df91a1cc 100644 --- a/reactos/ntoskrnl/mm/freelist.c +++ b/reactos/ntoskrnl/mm/freelist.c @@ -36,8 +36,9 @@ /* The first array contains ReactOS PFNs, the second contains ARM3 PFNs */ PPHYSICAL_PAGE MmPfnDatabase[2]; -ULONG MmAvailablePages; -ULONG MmResidentAvailablePages; +PFN_NUMBER MmAvailablePages; +PFN_NUMBER MmResidentAvailablePages; +PFN_NUMBER MmResidentAvailableAtInit; SIZE_T MmTotalCommitLimit; SIZE_T MmTotalCommittedPages; diff --git a/reactos/ntoskrnl/mm/mminit.c b/reactos/ntoskrnl/mm/mminit.c index 8a9fd4297c3..a03ce8ed3de 100644 --- a/reactos/ntoskrnl/mm/mminit.c +++ b/reactos/ntoskrnl/mm/mminit.c @@ -398,15 +398,12 @@ MmInitSystem(IN ULONG Phase, /* Initialize paged pool */ MmInitializePagedPool(); + /* Initialize the loaded module list */ + MiInitializeLoadedModuleList(LoaderBlock); + /* Initialize working sets */ MiInitializeUserPfnBitmap(); MmInitializeMemoryConsumer(MC_USER, MmTrimUserMemory); - - /* Reload boot drivers */ - MiReloadBootLoadedDrivers(LoaderBlock); - - /* Initialize the loaded module list */ - MiInitializeLoadedModuleList(LoaderBlock); } else if (Phase == 1) { diff --git a/reactos/ntoskrnl/mm/pagefile.c b/reactos/ntoskrnl/mm/pagefile.c index 1af2faccaa5..1ea2c41c29f 100644 --- a/reactos/ntoskrnl/mm/pagefile.c +++ b/reactos/ntoskrnl/mm/pagefile.c @@ -86,6 +86,8 @@ ULONG MiFreeSwapPages; /* Number of pages that have been allocated for swapping */ ULONG MiUsedSwapPages; +BOOLEAN MmZeroPageFile; + /* * Number of pages that have been reserved for swapping but not yet allocated */ diff --git a/reactos/ntoskrnl/mm/section.c b/reactos/ntoskrnl/mm/section.c index 582af62037d..fc708953a00 100644 --- a/reactos/ntoskrnl/mm/section.c +++ b/reactos/ntoskrnl/mm/section.c @@ -71,6 +71,8 @@ MM_SECTION_PAGEOUT_CONTEXT; POBJECT_TYPE MmSectionObjectType = NULL; +BOOLEAN MmAllocationFragment; + ULONG_PTR MmSubsectionBase; static GENERIC_MAPPING MmpSectionMapping = { diff --git a/reactos/ntoskrnl/mm/sysldr.c b/reactos/ntoskrnl/mm/sysldr.c index 281a3966bb2..36b3ce5a8fc 100644 --- a/reactos/ntoskrnl/mm/sysldr.c +++ b/reactos/ntoskrnl/mm/sysldr.c @@ -44,6 +44,9 @@ PVOID MmLastUnloadedDrivers; PVOID MmTriageActionTaken; PVOID KernelVerifier; +BOOLEAN MmMakeLowMemory; +BOOLEAN MmEnforceWriteProtection = TRUE; + /* FUNCTIONS ******************************************************************/ PVOID @@ -2040,6 +2043,87 @@ Quickie: return Status; } +PLDR_DATA_TABLE_ENTRY +NTAPI +MiLookupDataTableEntry(IN PVOID Address) +{ + PLDR_DATA_TABLE_ENTRY LdrEntry, FoundEntry = NULL; + PLIST_ENTRY NextEntry; + PAGED_CODE(); + + /* Loop entries */ + NextEntry = PsLoadedModuleList.Flink; + do + { + /* Get the loader entry */ + LdrEntry = CONTAINING_RECORD(NextEntry, + LDR_DATA_TABLE_ENTRY, + InLoadOrderLinks); + + /* Check if the address matches */ + if ((Address >= LdrEntry->DllBase) && + (Address < (PVOID)((ULONG_PTR)LdrEntry->DllBase + + LdrEntry->SizeOfImage))) + { + /* Found a match */ + FoundEntry = LdrEntry; + break; + } + + /* Move on */ + NextEntry = NextEntry->Flink; + } while(NextEntry != &PsLoadedModuleList); + + /* Return the entry */ + return FoundEntry; +} + +/* + * @implemented + */ +PVOID +NTAPI +MmPageEntireDriver(IN PVOID AddressWithinSection) +{ + PMMPTE StartPte, EndPte; + PLDR_DATA_TABLE_ENTRY LdrEntry; + PAGED_CODE(); + + /* Get the loader entry */ + LdrEntry = MiLookupDataTableEntry(AddressWithinSection); + if (!LdrEntry) return NULL; + + /* Check if paging of kernel mode is disabled or if the driver is mapped as an image */ + if ((MmDisablePagingExecutive) || (LdrEntry->SectionPointer)) + { + /* Don't do anything, just return the base address */ + return LdrEntry->DllBase; + } + + /* Wait for active DPCs to finish before we page out the driver */ + KeFlushQueuedDpcs(); + + /* Get the PTE range for the whole driver image */ + StartPte = MiAddressToPte((ULONG_PTR)LdrEntry->DllBase); + EndPte = MiAddressToPte((ULONG_PTR)LdrEntry->DllBase + LdrEntry->SizeOfImage); +#if 0 + /* Enable paging for the PTE range */ + ASSERT(MI_IS_SESSION_IMAGE_ADDRESS(AddressWithinSection) == FALSE); + MiSetPagingOfDriver(StartPte, EndPte); +#endif + /* Return the base address */ + return LdrEntry->DllBase; +} + +/* + * @unimplemented + */ +VOID +NTAPI +MmResetDriverPaging(IN PVOID AddressWithinSection) +{ + UNIMPLEMENTED; +} /* * @implemented */ diff --git a/reactos/ntoskrnl/ntoskrnl-generic.rbuild b/reactos/ntoskrnl/ntoskrnl-generic.rbuild index a349f887312..da129c385a4 100644 --- a/reactos/ntoskrnl/ntoskrnl-generic.rbuild +++ b/reactos/ntoskrnl/ntoskrnl-generic.rbuild @@ -394,6 +394,7 @@ expool.c hypermap.c iosup.c + largepag.c mdlsup.c mminit.c mmsup.c From 90b9c29f62498af6e8c63e5b9cd91818e82a9cb0 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Wed, 21 Apr 2010 01:12:04 +0000 Subject: [PATCH 022/131] Recommit rest of ntifs.h and wdm.h from header merge revert svn path=/trunk/; revision=46972 --- reactos/include/ddk/ntddk.h | 153 + reactos/include/ddk/ntifs.h | 139 - reactos/include/ddk/wdm.h | 5348 ++++++++++++++++++++++++++++------- 3 files changed, 4516 insertions(+), 1124 deletions(-) diff --git a/reactos/include/ddk/ntddk.h b/reactos/include/ddk/ntddk.h index 6d8bacd4ce8..55569692a96 100644 --- a/reactos/include/ddk/ntddk.h +++ b/reactos/include/ddk/ntddk.h @@ -2957,6 +2957,159 @@ ZwSetTimer( #endif +typedef struct _QUOTA_LIMITS { + SIZE_T PagedPoolLimit; + SIZE_T NonPagedPoolLimit; + SIZE_T MinimumWorkingSetSize; + SIZE_T MaximumWorkingSetSize; + SIZE_T PagefileLimit; + LARGE_INTEGER TimeLimit; +} QUOTA_LIMITS, *PQUOTA_LIMITS; + +struct _RTL_GENERIC_COMPARE_ROUTINE; +struct _RTL_GENERIC_ALLOCATE_ROUTINE; +struct _RTL_GENERIC_FREE_ROUTINE; + +typedef struct _RTL_GENERIC_TABLE { + PRTL_SPLAY_LINKS TableRoot; + LIST_ENTRY InsertOrderList; + PLIST_ENTRY OrderedPointer; + ULONG WhichOrderedElement; + ULONG NumberGenericTableElements; + struct _RTL_GENERIC_COMPARE_ROUTINE *CompareRoutine; + struct _RTL_GENERIC_ALLOCATE_ROUTINE *AllocateRoutine; + struct _RTL_GENERIC_FREE_ROUTINE *FreeRoutine; + PVOID TableContext; +} RTL_GENERIC_TABLE, *PRTL_GENERIC_TABLE; + +typedef enum _TABLE_SEARCH_RESULT { + TableEmptyTree, + TableFoundNode, + TableInsertAsLeft, + TableInsertAsRight +} TABLE_SEARCH_RESULT; + +typedef struct _FILE_FS_SIZE_INFORMATION { + LARGE_INTEGER TotalAllocationUnits; + LARGE_INTEGER AvailableAllocationUnits; + ULONG SectorsPerAllocationUnit; + ULONG BytesPerSector; +} FILE_FS_SIZE_INFORMATION, *PFILE_FS_SIZE_INFORMATION; + +#define IO_CHECK_CREATE_PARAMETERS 0x0200 +#define IO_ATTACH_DEVICE 0x0400 +#define IO_IGNORE_SHARE_ACCESS_CHECK 0x0800 + +typedef struct _FILE_FS_VOLUME_INFORMATION { + LARGE_INTEGER VolumeCreationTime; + ULONG VolumeSerialNumber; + ULONG VolumeLabelLength; + BOOLEAN SupportsObjects; + WCHAR VolumeLabel[1]; +} FILE_FS_VOLUME_INFORMATION, *PFILE_FS_VOLUME_INFORMATION; + +typedef struct _FILE_FS_FULL_SIZE_INFORMATION { + LARGE_INTEGER TotalAllocationUnits; + LARGE_INTEGER CallerAvailableAllocationUnits; + LARGE_INTEGER ActualAvailableAllocationUnits; + ULONG SectorsPerAllocationUnit; + ULONG BytesPerSector; +} FILE_FS_FULL_SIZE_INFORMATION, *PFILE_FS_FULL_SIZE_INFORMATION; + +typedef struct _FILE_FS_OBJECTID_INFORMATION { + UCHAR ObjectId[16]; + UCHAR ExtendedInfo[48]; +} FILE_FS_OBJECTID_INFORMATION, *PFILE_FS_OBJECTID_INFORMATION; + +typedef struct _FILE_FS_LABEL_INFORMATION { + ULONG VolumeLabelLength; + WCHAR VolumeLabel[1]; +} FILE_FS_LABEL_INFORMATION, *PFILE_FS_LABEL_INFORMATION; + +typedef enum _RTL_GENERIC_COMPARE_RESULTS { + GenericLessThan, + GenericGreaterThan, + GenericEqual +} RTL_GENERIC_COMPARE_RESULTS; + +// Forwarder +struct _RTL_AVL_TABLE; + +typedef RTL_GENERIC_COMPARE_RESULTS +(NTAPI *PRTL_AVL_COMPARE_ROUTINE) ( + IN struct _RTL_AVL_TABLE *Table, + IN PVOID FirstStruct, + IN PVOID SecondStruct); + +typedef PVOID +(NTAPI *PRTL_AVL_ALLOCATE_ROUTINE) ( + IN struct _RTL_AVL_TABLE *Table, + IN CLONG ByteSize); + +typedef VOID +(NTAPI *PRTL_AVL_FREE_ROUTINE) ( + IN struct _RTL_AVL_TABLE *Table, + IN PVOID Buffer); + +typedef NTSTATUS +(NTAPI *PRTL_AVL_MATCH_FUNCTION) ( + IN struct _RTL_AVL_TABLE *Table, + IN PVOID UserData, + IN PVOID MatchData); + +typedef struct _RTL_BALANCED_LINKS { + struct _RTL_BALANCED_LINKS *Parent; + struct _RTL_BALANCED_LINKS *LeftChild; + struct _RTL_BALANCED_LINKS *RightChild; + CHAR Balance; + UCHAR Reserved[3]; +} RTL_BALANCED_LINKS, *PRTL_BALANCED_LINKS; + +typedef struct _RTL_AVL_TABLE { + RTL_BALANCED_LINKS BalancedRoot; + PVOID OrderedPointer; + ULONG WhichOrderedElement; + ULONG NumberGenericTableElements; + ULONG DepthOfTree; + PRTL_BALANCED_LINKS RestartKey; + ULONG DeleteCount; + PRTL_AVL_COMPARE_ROUTINE CompareRoutine; + PRTL_AVL_ALLOCATE_ROUTINE AllocateRoutine; + PRTL_AVL_FREE_ROUTINE FreeRoutine; + PVOID TableContext; +} RTL_AVL_TABLE, *PRTL_AVL_TABLE; + +#ifndef RTL_USE_AVL_TABLES + +struct _RTL_GENERIC_TABLE; + +typedef RTL_GENERIC_COMPARE_RESULTS +(NTAPI *PRTL_GENERIC_COMPARE_ROUTINE) ( + IN struct _RTL_GENERIC_TABLE *Table, + IN PVOID FirstStruct, + IN PVOID SecondStruct); + +typedef PVOID +(NTAPI *PRTL_GENERIC_ALLOCATE_ROUTINE) ( + IN struct _RTL_GENERIC_TABLE *Table, + IN CLONG ByteSize); + +typedef VOID +(NTAPI *PRTL_GENERIC_FREE_ROUTINE) ( + IN struct _RTL_GENERIC_TABLE *Table, + IN PVOID Buffer); + +#endif /* !RTL_USE_AVL_TABLES */ + +NTSYSAPI +VOID +NTAPI +RtlInitializeGenericTableAvl( + OUT PRTL_AVL_TABLE Table, + IN PRTL_AVL_COMPARE_ROUTINE CompareRoutine, + IN PRTL_AVL_ALLOCATE_ROUTINE AllocateRoutine, + IN PRTL_AVL_FREE_ROUTINE FreeRoutine, + IN PVOID TableContext OPTIONAL); #ifdef __cplusplus } diff --git a/reactos/include/ddk/ntifs.h b/reactos/include/ddk/ntifs.h index 8af993ffd15..15bace86764 100644 --- a/reactos/include/ddk/ntifs.h +++ b/reactos/include/ddk/ntifs.h @@ -6750,145 +6750,6 @@ FsRtlDeleteTunnelCache( IN PTUNNEL Cache); NTKERNELAPI -#define IO_ATTACH_DEVICE 0x0400 -struct _RTL_AVL_TABLE; -struct _RTL_GENERIC_TABLE; - -typedef struct _FILE_FS_FULL_SIZE_INFORMATION { - LARGE_INTEGER TotalAllocationUnits; - LARGE_INTEGER CallerAvailableAllocationUnits; - LARGE_INTEGER ActualAvailableAllocationUnits; - ULONG SectorsPerAllocationUnit; - ULONG BytesPerSector; -} FILE_FS_FULL_SIZE_INFORMATION, *PFILE_FS_FULL_SIZE_INFORMATION; - -typedef struct _FILE_FS_LABEL_INFORMATION { - ULONG VolumeLabelLength; - WCHAR VolumeLabel[1]; -} FILE_FS_LABEL_INFORMATION, *PFILE_FS_LABEL_INFORMATION; - -typedef struct _FILE_FS_SIZE_INFORMATION { - LARGE_INTEGER TotalAllocationUnits; - LARGE_INTEGER AvailableAllocationUnits; - ULONG SectorsPerAllocationUnit; - ULONG BytesPerSector; -} FILE_FS_SIZE_INFORMATION, *PFILE_FS_SIZE_INFORMATION; - -typedef struct _FILE_FS_VOLUME_INFORMATION { - LARGE_INTEGER VolumeCreationTime; - ULONG VolumeSerialNumber; - ULONG VolumeLabelLength; - BOOLEAN SupportsObjects; - WCHAR VolumeLabel[1]; -} FILE_FS_VOLUME_INFORMATION, *PFILE_FS_VOLUME_INFORMATION; - -typedef struct _FILE_FS_OBJECTID_INFORMATION -{ - UCHAR ObjectId[16]; - UCHAR ExtendedInfo[48]; -} FILE_FS_OBJECTID_INFORMATION, *PFILE_FS_OBJECTID_INFORMATION; - -typedef enum _RTL_GENERIC_COMPARE_RESULTS -{ - GenericLessThan, - GenericGreaterThan, - GenericEqual -} RTL_GENERIC_COMPARE_RESULTS; - -typedef enum _TABLE_SEARCH_RESULT -{ - TableEmptyTree, - TableFoundNode, - TableInsertAsLeft, - TableInsertAsRight -} TABLE_SEARCH_RESULT; - -typedef RTL_GENERIC_COMPARE_RESULTS -(NTAPI *PRTL_AVL_COMPARE_ROUTINE) ( - struct _RTL_AVL_TABLE *Table, - PVOID FirstStruct, - PVOID SecondStruct -); - -typedef RTL_GENERIC_COMPARE_RESULTS -(NTAPI *PRTL_GENERIC_COMPARE_ROUTINE) ( - struct _RTL_GENERIC_TABLE *Table, - PVOID FirstStruct, - PVOID SecondStruct -); - -typedef PVOID -(NTAPI *PRTL_GENERIC_ALLOCATE_ROUTINE) ( - struct _RTL_GENERIC_TABLE *Table, - CLONG ByteSize -); - -typedef VOID -(NTAPI *PRTL_GENERIC_FREE_ROUTINE) ( - struct _RTL_GENERIC_TABLE *Table, - PVOID Buffer -); - -typedef PVOID -(NTAPI *PRTL_AVL_ALLOCATE_ROUTINE) ( - struct _RTL_AVL_TABLE *Table, - CLONG ByteSize -); - -typedef VOID -(NTAPI *PRTL_AVL_FREE_ROUTINE) ( - struct _RTL_AVL_TABLE *Table, - PVOID Buffer -); - -typedef struct _RTL_BALANCED_LINKS -{ - struct _RTL_BALANCED_LINKS *Parent; - struct _RTL_BALANCED_LINKS *LeftChild; - struct _RTL_BALANCED_LINKS *RightChild; - CHAR Balance; - UCHAR Reserved[3]; -} RTL_BALANCED_LINKS, *PRTL_BALANCED_LINKS; - -typedef struct _RTL_GENERIC_TABLE -{ - PRTL_SPLAY_LINKS TableRoot; - LIST_ENTRY InsertOrderList; - PLIST_ENTRY OrderedPointer; - ULONG WhichOrderedElement; - ULONG NumberGenericTableElements; - PRTL_GENERIC_COMPARE_ROUTINE CompareRoutine; - PRTL_GENERIC_ALLOCATE_ROUTINE AllocateRoutine; - PRTL_GENERIC_FREE_ROUTINE FreeRoutine; - PVOID TableContext; -} RTL_GENERIC_TABLE, *PRTL_GENERIC_TABLE; - -typedef struct _RTL_AVL_TABLE -{ - RTL_BALANCED_LINKS BalancedRoot; - PVOID OrderedPointer; - ULONG WhichOrderedElement; - ULONG NumberGenericTableElements; - ULONG DepthOfTree; - PRTL_BALANCED_LINKS RestartKey; - ULONG DeleteCount; - PRTL_AVL_COMPARE_ROUTINE CompareRoutine; - PRTL_AVL_ALLOCATE_ROUTINE AllocateRoutine; - PRTL_AVL_FREE_ROUTINE FreeRoutine; - PVOID TableContext; -} RTL_AVL_TABLE, *PRTL_AVL_TABLE; - -NTSYSAPI -VOID -NTAPI -RtlInitializeGenericTableAvl( - PRTL_AVL_TABLE Table, - PRTL_AVL_COMPARE_ROUTINE CompareRoutine, - PRTL_AVL_ALLOCATE_ROUTINE AllocateRoutine, - PRTL_AVL_FREE_ROUTINE FreeRoutine, - PVOID TableContext -); - VOID NTAPI FsRtlDissectDbcs( diff --git a/reactos/include/ddk/wdm.h b/reactos/include/ddk/wdm.h index 285d2165008..3a523235742 100644 --- a/reactos/include/ddk/wdm.h +++ b/reactos/include/ddk/wdm.h @@ -38,15 +38,26 @@ #include #include #include +#include #ifndef GUID_DEFINED #include #endif +#ifdef _MAC +#ifndef _INC_STRING +#include +#endif /* _INC_STRING */ +#else +#include +#endif /* _MAC */ + #ifndef _KTMTYPES_ typedef GUID UOW, *PUOW; #endif +typedef GUID *PGUID; + #if (NTDDI_VERSION >= NTDDI_WINXP) #include #endif @@ -133,8 +144,6 @@ struct _IO_RESOURCE_DESCRIPTOR; typedef struct _OBJECT_TYPE *POBJECT_TYPE; typedef struct _HAL_DISPATCH_TABLE *PHAL_DISPATCH_TABLE; typedef struct _HAL_PRIVATE_DISPATCH_TABLE *PHAL_PRIVATE_DISPATCH_TABLE; -typedef struct _DEVICE_HANDLER_OBJECT *PDEVICE_HANDLER_OBJECT; -typedef struct _ADAPTER_OBJECT *PADAPTER_OBJECT; typedef struct _CALLBACK_OBJECT *PCALLBACK_OBJECT; typedef struct _EPROCESS *PEPROCESS; typedef struct _ETHREAD *PETHREAD; @@ -144,6 +153,42 @@ typedef struct _KPROCESS *PKPROCESS; typedef struct _KTHREAD *PKTHREAD, *PRKTHREAD; typedef struct _CONTEXT *PCONTEXT; +#if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && ( defined(_NTDDK_) || defined(_NTDRIVER_) || defined(_NTOSP_)) +typedef struct _DMA_ADAPTER *PADAPTER_OBJECT; +#elif defined(_WDM_INCLUDED_) +typedef struct _DMA_ADAPTER *PADAPTER_OBJECT; +#else +typedef struct _ADAPTER_OBJECT *PADAPTER_OBJECT; +#endif + +#ifndef DEFINE_GUIDEX +#ifdef _MSC_VER +#define DEFINE_GUIDEX(name) EXTERN_C const CDECL GUID name +#else +#define DEFINE_GUIDEX(name) EXTERN_C const GUID name +#endif +#endif /* DEFINE_GUIDEX */ + +#ifndef STATICGUIDOF +#define STATICGUIDOF(guid) STATIC_##guid +#endif + +/* GUID Comparison */ +#ifndef __IID_ALIGNED__ +#define __IID_ALIGNED__ +#ifdef __cplusplus +inline int IsEqualGUIDAligned(REFGUID guid1, REFGUID guid2) +{ + return ( (*(PLONGLONG)(&guid1) == *(PLONGLONG)(&guid2)) && + (*((PLONGLONG)(&guid1) + 1) == *((PLONGLONG)(&guid2) + 1)) ); +} +#else +#define IsEqualGUIDAligned(guid1, guid2) \ + ( (*(PLONGLONG)(guid1) == *(PLONGLONG)(guid2)) && \ + (*((PLONGLONG)(guid1) + 1) == *((PLONGLONG)(guid2) + 1)) ) +#endif /* __cplusplus */ +#endif /* !__IID_ALIGNED__ */ + /****************************************************************************** * INTERLOCKED Functions * @@ -482,17 +527,29 @@ typedef SLIST_HEADER SLIST_HEADER32, *PSLIST_HEADER32; #endif /* _SLIST_HEADER_ */ - -/* HACK HACK HACK - GCC (or perhaps LD) is messing this up */ -#if defined(_NTSYSTEM_) || defined(__GNUC__) +/* MS definition is broken! */ +extern BOOLEAN NTSYSAPI NlsMbCodePageTag; +extern BOOLEAN NTSYSAPI NlsMbOemCodePageTag; #define NLS_MB_CODE_PAGE_TAG NlsMbCodePageTag #define NLS_MB_OEM_CODE_PAGE_TAG NlsMbOemCodePageTag -#else -#define NLS_MB_CODE_PAGE_TAG (*NlsMbCodePageTag) -#define NLS_MB_OEM_CODE_PAGE_TAG (*NlsMbOemCodePageTag) -#endif /* _NT_SYSTEM */ -extern BOOLEAN NTSYSAPI NLS_MB_CODE_PAGE_TAG; -extern BOOLEAN NTSYSAPI NLS_MB_OEM_CODE_PAGE_TAG; + +#define SHORT_LEAST_SIGNIFICANT_BIT 0 +#define SHORT_MOST_SIGNIFICANT_BIT 1 + +#define LONG_LEAST_SIGNIFICANT_BIT 0 +#define LONG_3RD_MOST_SIGNIFICANT_BIT 1 +#define LONG_2ND_MOST_SIGNIFICANT_BIT 2 +#define LONG_MOST_SIGNIFICANT_BIT 3 + +#define RTLVERLIB_DDI(x) Wdmlib##x + +typedef BOOLEAN +(*PFN_RTL_IS_NTDDI_VERSION_AVAILABLE)( + IN ULONG Version); + +typedef BOOLEAN +(*PFN_RTL_IS_SERVICE_PACK_VERSION_INSTALLED)( + IN ULONG Version); /****************************************************************************** @@ -503,14 +560,21 @@ typedef UCHAR KIRQL, *PKIRQL; typedef CCHAR KPROCESSOR_MODE; typedef LONG KPRIORITY; -typedef ULONG EXECUTION_STATE; - typedef enum _MODE { KernelMode, UserMode, MaximumMode } MODE; +#define CACHE_FULLY_ASSOCIATIVE 0xFF +#define MAXIMUM_SUSPEND_COUNT MAXCHAR + +#define EVENT_QUERY_STATE (0x0001) +#define EVENT_MODIFY_STATE (0x0002) +#define EVENT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3) + +#define LTP_PC_SMT 0x1 + #if (NTDDI_VERSION < NTDDI_WIN7) || defined(_X86_) || !defined(NT_PROCESSOR_GROUPS) #define SINGLE_GROUP_LEGACY_API 1 #endif @@ -543,6 +607,69 @@ typedef struct _CACHE_DESCRIPTOR { PROCESSOR_CACHE_TYPE Type; } CACHE_DESCRIPTOR, *PCACHE_DESCRIPTOR; +typedef struct _SYSTEM_LOGICAL_PROCESSOR_INFORMATION { + ULONG_PTR ProcessorMask; + LOGICAL_PROCESSOR_RELATIONSHIP Relationship; + union { + struct { + UCHAR Flags; + } ProcessorCore; + struct { + ULONG NodeNumber; + } NumaNode; + CACHE_DESCRIPTOR Cache; + ULONGLONG Reserved[2]; + } DUMMYUNIONNAME; +} SYSTEM_LOGICAL_PROCESSOR_INFORMATION, *PSYSTEM_LOGICAL_PROCESSOR_INFORMATION; + +typedef struct _PROCESSOR_RELATIONSHIP { + UCHAR Flags; + UCHAR Reserved[21]; + USHORT GroupCount; + GROUP_AFFINITY GroupMask[ANYSIZE_ARRAY]; +} PROCESSOR_RELATIONSHIP, *PPROCESSOR_RELATIONSHIP; + +typedef struct _NUMA_NODE_RELATIONSHIP { + ULONG NodeNumber; + UCHAR Reserved[20]; + GROUP_AFFINITY GroupMask; +} NUMA_NODE_RELATIONSHIP, *PNUMA_NODE_RELATIONSHIP; + +typedef struct _CACHE_RELATIONSHIP { + UCHAR Level; + UCHAR Associativity; + USHORT LineSize; + ULONG CacheSize; + PROCESSOR_CACHE_TYPE Type; + UCHAR Reserved[20]; + GROUP_AFFINITY GroupMask; +} CACHE_RELATIONSHIP, *PCACHE_RELATIONSHIP; + +typedef struct _PROCESSOR_GROUP_INFO { + UCHAR MaximumProcessorCount; + UCHAR ActiveProcessorCount; + UCHAR Reserved[38]; + KAFFINITY ActiveProcessorMask; +} PROCESSOR_GROUP_INFO, *PPROCESSOR_GROUP_INFO; + +typedef struct _GROUP_RELATIONSHIP { + USHORT MaximumGroupCount; + USHORT ActiveGroupCount; + UCHAR Reserved[20]; + PROCESSOR_GROUP_INFO GroupInfo[ANYSIZE_ARRAY]; +} GROUP_RELATIONSHIP, *PGROUP_RELATIONSHIP; + +typedef struct _SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX { + LOGICAL_PROCESSOR_RELATIONSHIP Relationship; + ULONG Size; + union { + PROCESSOR_RELATIONSHIP Processor; + NUMA_NODE_RELATIONSHIP NumaNode; + CACHE_RELATIONSHIP Cache; + GROUP_RELATIONSHIP Group; + } DUMMYUNIONNAME; +} SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX, *PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX;; + /* Processor features */ #define PF_FLOATING_POINT_PRECISION_ERRATA 0 #define PF_FLOATING_POINT_EMULATED 1 @@ -563,7 +690,6 @@ typedef struct _CACHE_DESCRIPTOR { #define PF_CHANNELS_ENABLED 16 #define PF_XSAVE_ENABLED 17 -#define MAXIMUM_SUPPORTED_EXTENSION 512 #define MAXIMUM_WAIT_OBJECTS 64 #define ASSERT_APC(Object) NT_ASSERT((Object)->Type == ApcObject) @@ -631,6 +757,23 @@ typedef struct _CACHE_DESCRIPTOR { #define EXCEPTION_NONCONTINUABLE 1 #define EXCEPTION_MAXIMUM_PARAMETERS 15 +#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 + typedef struct _EXCEPTION_RECORD { NTSTATUS ExceptionCode; ULONG ExceptionFlags; @@ -682,6 +825,42 @@ typedef VOID IN ULONG ReasonSpecificDataLength); typedef KBUGCHECK_REASON_CALLBACK_ROUTINE *PKBUGCHECK_REASON_CALLBACK_ROUTINE; +typedef struct _KBUGCHECK_ADD_PAGES { + IN OUT PVOID Context; + IN OUT ULONG Flags; + IN ULONG BugCheckCode; + OUT ULONG_PTR Address; + OUT ULONG_PTR Count; +} KBUGCHECK_ADD_PAGES, *PKBUGCHECK_ADD_PAGES; + +typedef struct _KBUGCHECK_SECONDARY_DUMP_DATA { + IN PVOID InBuffer; + IN ULONG InBufferLength; + IN ULONG MaximumAllowed; + OUT GUID Guid; + OUT PVOID OutBuffer; + OUT ULONG OutBufferLength; +} KBUGCHECK_SECONDARY_DUMP_DATA, *PKBUGCHECK_SECONDARY_DUMP_DATA; + +typedef enum _KBUGCHECK_DUMP_IO_TYPE { + KbDumpIoInvalid, + KbDumpIoHeader, + KbDumpIoBody, + KbDumpIoSecondaryData, + KbDumpIoComplete +} KBUGCHECK_DUMP_IO_TYPE; + +typedef struct _KBUGCHECK_DUMP_IO { + IN ULONG64 Offset; + IN PVOID Buffer; + IN ULONG BufferLength; + IN KBUGCHECK_DUMP_IO_TYPE Type; +} KBUGCHECK_DUMP_IO, *PKBUGCHECK_DUMP_IO; + +#define KB_ADD_PAGES_FLAG_VIRTUAL_ADDRESS 0x00000001UL +#define KB_ADD_PAGES_FLAG_PHYSICAL_ADDRESS 0x00000002UL +#define KB_ADD_PAGES_FLAG_ADDITIONAL_RANGES_EXIST 0x80000000UL + typedef struct _KBUGCHECK_REASON_CALLBACK_RECORD { LIST_ENTRY Entry; PKBUGCHECK_REASON_CALLBACK_ROUTINE CallbackRoutine; @@ -721,20 +900,31 @@ typedef BOOLEAN IN BOOLEAN Handled); typedef NMI_CALLBACK *PNMI_CALLBACK; -typedef enum _TRACE_INFORMATION_CLASS { - TraceIdClass, - TraceHandleClass, - TraceEnableFlagsClass, - TraceEnableLevelClass, - GlobalLoggerHandleClass, - EventLoggerHandleClass, - AllLoggerHandlesClass, - TraceHandleByNameClass, - LoggerEventsLostClass, - TraceSessionSettingsClass, - LoggerEventsLoggedClass, - MaxTraceInformationClass -} TRACE_INFORMATION_CLASS; +typedef enum _KE_PROCESSOR_CHANGE_NOTIFY_STATE { + KeProcessorAddStartNotify = 0, + KeProcessorAddCompleteNotify, + KeProcessorAddFailureNotify +} KE_PROCESSOR_CHANGE_NOTIFY_STATE; + +typedef struct _KE_PROCESSOR_CHANGE_NOTIFY_CONTEXT { + KE_PROCESSOR_CHANGE_NOTIFY_STATE State; + ULONG NtNumber; + NTSTATUS Status; +#if (NTDDI_VERSION >= NTDDI_WIN7) + PROCESSOR_NUMBER ProcNumber; +#endif +} KE_PROCESSOR_CHANGE_NOTIFY_CONTEXT, *PKE_PROCESSOR_CHANGE_NOTIFY_CONTEXT; + +typedef VOID +(NTAPI PROCESSOR_CALLBACK_FUNCTION)( + IN PVOID CallbackContext, + IN PKE_PROCESSOR_CHANGE_NOTIFY_CONTEXT ChangeContext, + IN OUT PNTSTATUS OperationStatus); +typedef PROCESSOR_CALLBACK_FUNCTION *PPROCESSOR_CALLBACK_FUNCTION; + +#define KE_PROCESSOR_CHANGE_ADD_EXISTING 1 + +#define INVALID_PROCESSOR_INDEX 0xffffffff typedef enum _KINTERRUPT_POLARITY { InterruptPolarityUnknown, @@ -831,36 +1021,32 @@ typedef enum _KINTERRUPT_MODE { #define THREAD_WAIT_OBJECTS 3 +typedef VOID +(NTAPI KSTART_ROUTINE)( + IN PVOID StartContext); +typedef KSTART_ROUTINE *PKSTART_ROUTINE; + typedef VOID (NTAPI *PKINTERRUPT_ROUTINE)( VOID); +typedef BOOLEAN +(NTAPI KSERVICE_ROUTINE)( + IN struct _KINTERRUPT *Interrupt, + IN PVOID ServiceContext); +typedef KSERVICE_ROUTINE *PKSERVICE_ROUTINE; + +typedef BOOLEAN +(NTAPI KMESSAGE_SERVICE_ROUTINE)( + IN struct _KINTERRUPT *Interrupt, + IN PVOID ServiceContext, + IN ULONG MessageID); +typedef KMESSAGE_SERVICE_ROUTINE *PKMESSAGE_SERVICE_ROUTINE; + typedef enum _KD_OPTION { KD_OPTION_SET_BLOCK_ENABLE, } KD_OPTION; -typedef enum _INTERFACE_TYPE { - InterfaceTypeUndefined = -1, - Internal, - Isa, - Eisa, - MicroChannel, - TurboChannel, - PCIBus, - VMEBus, - NuBus, - PCMCIABus, - CBus, - MPIBus, - MPSABus, - ProcessorInternal, - InternalPowerBus, - PNPISABus, - PNPBus, - Vmcs, - MaximumInterfaceType -} INTERFACE_TYPE, *PINTERFACE_TYPE; - typedef VOID (NTAPI *PKNORMAL_ROUTINE)( IN PVOID NormalContext OPTIONAL, @@ -898,6 +1084,14 @@ typedef struct _KAPC { BOOLEAN Inserted; } KAPC, *PKAPC, *RESTRICTED_POINTER PRKAPC; +#define KAPC_OFFSET_TO_SPARE_BYTE0 FIELD_OFFSET(KAPC, SpareByte0) +#define KAPC_OFFSET_TO_SPARE_BYTE1 FIELD_OFFSET(KAPC, SpareByte1) +#define KAPC_OFFSET_TO_SPARE_LONG FIELD_OFFSET(KAPC, SpareLong0) +#define KAPC_OFFSET_TO_SYSTEMARGUMENT1 FIELD_OFFSET(KAPC, SystemArgument1) +#define KAPC_OFFSET_TO_SYSTEMARGUMENT2 FIELD_OFFSET(KAPC, SystemArgument2) +#define KAPC_OFFSET_TO_APCSTATEINDEX FIELD_OFFSET(KAPC, ApcStateIndex) +#define KAPC_ACTUAL_LENGTH (FIELD_OFFSET(KAPC, Inserted) + sizeof(BOOLEAN)) + typedef struct _KDEVICE_QUEUE_ENTRY { LIST_ENTRY DeviceListEntry; ULONG SortKey; @@ -914,10 +1108,27 @@ typedef VOID IN PVOID Parameter2 OPTIONAL, IN PVOID Parameter3 OPTIONAL); -typedef -ULONG_PTR -(NTAPI *PKIPI_BROADCAST_WORKER)( +typedef struct _KIPI_COUNTS { + ULONG Freeze; + ULONG Packet; + ULONG DPC; + ULONG APC; + ULONG FlushSingleTb; + ULONG FlushMultipleTb; + ULONG FlushEntireTb; + ULONG GenericCall; + ULONG ChangeColor; + ULONG SweepDcache; + ULONG SweepIcache; + ULONG SweepIcacheRange; + ULONG FlushIoBuffers; + ULONG GratuitousDPC; +} KIPI_COUNTS, *PKIPI_COUNTS; + +typedef ULONG_PTR +(NTAPI KIPI_BROADCAST_WORKER)( IN ULONG_PTR Argument); +typedef KIPI_BROADCAST_WORKER *PKIPI_BROADCAST_WORKER; typedef ULONG_PTR KSPIN_LOCK, *PKSPIN_LOCK; @@ -1116,6 +1327,8 @@ typedef struct _KSEMAPHORE { LONG Limit; } KSEMAPHORE, *PKSEMAPHORE, *RESTRICTED_POINTER PRKSEMAPHORE; +#define KSEMAPHORE_ACTUAL_LENGTH (FIELD_OFFSET(KSEMAPHORE, Limit) + sizeof(LONG)) + typedef struct _KGATE { DISPATCHER_HEADER Header; } KGATE, *PKGATE, *RESTRICTED_POINTER PRKGATE; @@ -1156,6 +1369,14 @@ typedef struct _KTIMER { ULONG Period; } KTIMER, *PKTIMER, *RESTRICTED_POINTER PRKTIMER; +typedef enum _LOCK_OPERATION { + IoReadAccess, + IoWriteAccess, + IoModifyAccess +} LOCK_OPERATION; + +#define KTIMER_ACTUAL_LENGTH (FIELD_OFFSET(KTIMER, Period) + sizeof(LONG)) + typedef BOOLEAN (NTAPI *PKSYNCHRONIZE_ROUTINE)( IN PVOID SynchronizeContext); @@ -1184,19 +1405,32 @@ typedef enum _ALTERNATIVE_ARCHITECTURE_TYPE { EndAlternatives } ALTERNATIVE_ARCHITECTURE_TYPE; -typedef struct _KSYSTEM_TIME -{ +#ifndef _X86_ + +#ifndef IsNEC_98 +#define IsNEC_98 (FALSE) +#endif + +#ifndef IsNotNEC_98 +#define IsNotNEC_98 (TRUE) +#endif + +#ifndef SetNEC_98 +#define SetNEC_98 +#endif + +#ifndef SetNotNEC_98 +#define SetNotNEC_98 +#endif + +#endif + +typedef struct _KSYSTEM_TIME { ULONG LowPart; LONG High1Time; LONG High2Time; } KSYSTEM_TIME, *PKSYSTEM_TIME; -typedef struct _PNP_BUS_INFORMATION { - GUID BusTypeGuid; - INTERFACE_TYPE LegacyBusType; - ULONG BusNumber; -} PNP_BUS_INFORMATION, *PPNP_BUS_INFORMATION; - typedef struct DECLSPEC_ALIGN(16) _M128A { ULONGLONG Low; LONGLONG High; @@ -1228,12 +1462,104 @@ typedef struct DECLSPEC_ALIGN(16) _XSAVE_FORMAT { #endif } XSAVE_FORMAT, *PXSAVE_FORMAT; +typedef struct DECLSPEC_ALIGN(8) _XSAVE_AREA_HEADER { + ULONG64 Mask; + ULONG64 Reserved[7]; +} XSAVE_AREA_HEADER, *PXSAVE_AREA_HEADER; + +typedef struct DECLSPEC_ALIGN(16) _XSAVE_AREA { + XSAVE_FORMAT LegacyState; + XSAVE_AREA_HEADER Header; +} XSAVE_AREA, *PXSAVE_AREA; + +typedef struct _XSTATE_CONTEXT { + ULONG64 Mask; + ULONG Length; + ULONG Reserved1; + PXSAVE_AREA Area; +#if defined(_X86_) + ULONG Reserved2; +#endif + PVOID Buffer; +#if defined(_X86_) + ULONG Reserved3; +#endif +} XSTATE_CONTEXT, *PXSTATE_CONTEXT; + +typedef struct _XSTATE_SAVE { +#if defined(_AMD64_) + struct _XSTATE_SAVE* Prev; + struct _KTHREAD* Thread; + UCHAR Level; + XSTATE_CONTEXT XStateContext; +#elif defined(_IA64_) + ULONG Dummy; +#elif defined(_X86_) + union { + struct { + LONG64 Reserved1; + ULONG Reserved2; + struct _XSTATE_SAVE* Prev; + PXSAVE_AREA Reserved3; + struct _KTHREAD* Thread; + PVOID Reserved4; + UCHAR Level; + }; + XSTATE_CONTEXT XStateContext; + }; +#endif +} XSTATE_SAVE, *PXSTATE_SAVE; + +#ifdef _X86_ + +#define MAXIMUM_SUPPORTED_EXTENSION 512 + +#if !defined(__midl) && !defined(MIDL_PASS) +C_ASSERT(sizeof(XSAVE_FORMAT) == MAXIMUM_SUPPORTED_EXTENSION); +#endif + +#endif /* _X86_ */ + +#define XSAVE_ALIGN 64 +#define MINIMAL_XSTATE_AREA_LENGTH sizeof(XSAVE_AREA) + +#if !defined(__midl) && !defined(MIDL_PASS) +C_ASSERT((sizeof(XSAVE_FORMAT) & (XSAVE_ALIGN - 1)) == 0); +C_ASSERT((FIELD_OFFSET(XSAVE_AREA, Header) & (XSAVE_ALIGN - 1)) == 0); +C_ASSERT(MINIMAL_XSTATE_AREA_LENGTH == 512 + 64); +#endif + +typedef struct _CONTEXT_CHUNK { + LONG Offset; + ULONG Length; +} CONTEXT_CHUNK, *PCONTEXT_CHUNK; + +typedef struct _CONTEXT_EX { + CONTEXT_CHUNK All; + CONTEXT_CHUNK Legacy; + CONTEXT_CHUNK XState; +} CONTEXT_EX, *PCONTEXT_EX; + +#define CONTEXT_EX_LENGTH ALIGN_UP_BY(sizeof(CONTEXT_EX), STACK_ALIGN) + +#if (NTDDI_VERSION >= NTDDI_VISTA) +extern NTSYSAPI volatile CCHAR KeNumberProcessors; +#elif (NTDDI_VERSION >= NTDDI_WINXP) +extern NTSYSAPI CCHAR KeNumberProcessors; +#else +extern PCCHAR KeNumberProcessors; +#endif /****************************************************************************** * Memory manager Types * ******************************************************************************/ +#if (NTDDI_VERSION >= NTDDI_WIN2K) +typedef ULONG NODE_REQUIREMENT; +#define MM_ANY_NODE_OK 0x80000000 +#endif + #define MM_DONT_ZERO_ALLOCATION 0x00000001 #define MM_ALLOCATE_FROM_LOCAL_NODE_ONLY 0x00000002 #define MM_ALLOCATE_FULLY_REQUIRED 0x00000004 @@ -1362,12 +1688,6 @@ typedef enum _MM_PAGE_PRIORITY { HighPagePriority = 32 } MM_PAGE_PRIORITY; -typedef enum _LOCK_OPERATION { - IoReadAccess, - IoWriteAccess, - IoModifyAccess -} LOCK_OPERATION; - typedef enum _MM_SYSTEM_SIZE { MmSmallSystem, MmMediumSystem, @@ -1386,12 +1706,6 @@ extern PVOID MmBadPointer; #define EX_RUNDOWN_COUNT_SHIFT 0x1 #define EX_RUNDOWN_COUNT_INC (1 << EX_RUNDOWN_COUNT_SHIFT) -#ifdef _WIN64 -#define PORT_MAXIMUM_MESSAGE_LENGTH 512 -#else -#define PORT_MAXIMUM_MESSAGE_LENGTH 256 -#endif - typedef struct _FAST_MUTEX { volatile LONG Count; PKTHREAD Owner; @@ -1563,6 +1877,13 @@ typedef struct _EX_RUNDOWN_REF { typedef struct _EX_RUNDOWN_REF_CACHE_AWARE *PEX_RUNDOWN_REF_CACHE_AWARE; +typedef enum _WORK_QUEUE_TYPE { + CriticalWorkQueue, + DelayedWorkQueue, + HyperCriticalWorkQueue, + MaximumWorkQueue +} WORK_QUEUE_TYPE; + typedef VOID (NTAPI WORKER_THREAD_ROUTINE)( IN PVOID Parameter); @@ -1574,6 +1895,78 @@ typedef struct _WORK_QUEUE_ITEM { volatile PVOID Parameter; } WORK_QUEUE_ITEM, *PWORK_QUEUE_ITEM; +typedef ULONG_PTR ERESOURCE_THREAD, *PERESOURCE_THREAD; + +typedef struct _OWNER_ENTRY { + ERESOURCE_THREAD OwnerThread; + union { + struct { + ULONG IoPriorityBoosted:1; + ULONG OwnerReferenced:1; + ULONG OwnerCount:30; + }; + ULONG TableSize; + }; +} OWNER_ENTRY, *POWNER_ENTRY; + +typedef struct _ERESOURCE { + LIST_ENTRY SystemResourcesList; + POWNER_ENTRY OwnerTable; + SHORT ActiveCount; + USHORT Flag; + volatile PKSEMAPHORE SharedWaiters; + volatile PKEVENT ExclusiveWaiters; + OWNER_ENTRY OwnerEntry; + ULONG ActiveEntries; + ULONG ContentionCount; + ULONG NumberOfSharedWaiters; + ULONG NumberOfExclusiveWaiters; +#if defined(_WIN64) + PVOID Reserved2; +#endif + __GNU_EXTENSION union { + PVOID Address; + ULONG_PTR CreatorBackTraceIndex; + }; + KSPIN_LOCK SpinLock; +} ERESOURCE, *PERESOURCE; + +/* ERESOURCE.Flag */ +#define ResourceNeverExclusive 0x0010 +#define ResourceReleaseByOtherThread 0x0020 +#define ResourceOwnedExclusive 0x0080 + +#define RESOURCE_HASH_TABLE_SIZE 64 + +typedef struct _RESOURCE_HASH_ENTRY { + LIST_ENTRY ListEntry; + PVOID Address; + ULONG ContentionCount; + ULONG Number; +} RESOURCE_HASH_ENTRY, *PRESOURCE_HASH_ENTRY; + +typedef struct _RESOURCE_PERFORMANCE_DATA { + ULONG ActiveResourceCount; + ULONG TotalResourceCount; + ULONG ExclusiveAcquire; + ULONG SharedFirstLevel; + ULONG SharedSecondLevel; + ULONG StarveFirstLevel; + ULONG StarveSecondLevel; + ULONG WaitForExclusive; + ULONG OwnerTableExpands; + ULONG MaximumTableExpand; + LIST_ENTRY HashTable[RESOURCE_HASH_TABLE_SIZE]; +} RESOURCE_PERFORMANCE_DATA, *PRESOURCE_PERFORMANCE_DATA; + +/* Global debug flag */ +#if DEVL +extern ULONG NtGlobalFlag; +#define IF_NTOS_DEBUG(FlagName) if (NtGlobalFlag & (FLG_##FlagName)) +#else +#define IF_NTOS_DEBUG(FlagName) if(FALSE) +#endif + /****************************************************************************** * Security Manager Types * @@ -2000,6 +2393,144 @@ typedef enum _POWER_STATE_TYPE { DevicePowerState } POWER_STATE_TYPE, *PPOWER_STATE_TYPE; +#if (NTDDI_VERSION >= NTDDI_VISTA) +typedef struct _SYSTEM_POWER_STATE_CONTEXT { + union { + struct { + ULONG Reserved1:8; + ULONG TargetSystemState:4; + ULONG EffectiveSystemState:4; + ULONG CurrentSystemState:4; + ULONG IgnoreHibernationPath:1; + ULONG PseudoTransition:1; + ULONG Reserved2:10; + } DUMMYSTRUCTNAME; + ULONG ContextAsUlong; + } DUMMYUNIONNAME; +} SYSTEM_POWER_STATE_CONTEXT, *PSYSTEM_POWER_STATE_CONTEXT; +#endif + +#if (NTDDI_VERSION >= NTDDI_WIN7) +typedef struct _COUNTED_REASON_CONTEXT { + ULONG Version; + ULONG Flags; + union { + struct { + UNICODE_STRING ResourceFileName; + USHORT ResourceReasonId; + ULONG StringCount; + PUNICODE_STRING ReasonStrings; + } DUMMYSTRUCTNAME; + UNICODE_STRING SimpleString; + } DUMMYUNIONNAME; +} COUNTED_REASON_CONTEXT, *PCOUNTED_REASON_CONTEXT; +#endif + +#define IOCTL_QUERY_DEVICE_POWER_STATE \ + CTL_CODE(FILE_DEVICE_BATTERY, 0x0, METHOD_BUFFERED, FILE_READ_ACCESS) + +#define IOCTL_SET_DEVICE_WAKE \ + CTL_CODE(FILE_DEVICE_BATTERY, 0x1, METHOD_BUFFERED, FILE_WRITE_ACCESS) + +#define IOCTL_CANCEL_DEVICE_WAKE \ + CTL_CODE(FILE_DEVICE_BATTERY, 0x2, METHOD_BUFFERED, FILE_WRITE_ACCESS) + +#define ES_SYSTEM_REQUIRED 0x00000001 +#define ES_DISPLAY_REQUIRED 0x00000002 +#define ES_USER_PRESENT 0x00000004 +#define ES_CONTINUOUS 0x80000000 + +typedef ULONG EXECUTION_STATE, *PEXECUTION_STATE; + +typedef enum { + LT_DONT_CARE, + LT_LOWEST_LATENCY +} LATENCY_TIME; + +#if (_WIN32_WINNT >= _WIN32_WINNT_WIN7) +#define DIAGNOSTIC_REASON_VERSION 0 +#define DIAGNOSTIC_REASON_SIMPLE_STRING 0x00000001 +#define DIAGNOSTIC_REASON_DETAILED_STRING 0x00000002 +#define DIAGNOSTIC_REASON_NOT_SPECIFIED 0x80000000 +#define DIAGNOSTIC_REASON_INVALID_FLAGS (~0x80000003) +#endif + +#define POWER_REQUEST_CONTEXT_VERSION 0 +#define POWER_REQUEST_CONTEXT_SIMPLE_STRING 0x00000001 +#define POWER_REQUEST_CONTEXT_DETAILED_STRING 0x00000002 + +#define PowerRequestMaximum 3 + +typedef enum _POWER_REQUEST_TYPE { + PowerRequestDisplayRequired, + PowerRequestSystemRequired, + PowerRequestAwayModeRequired +} POWER_REQUEST_TYPE, *PPOWER_REQUEST_TYPE; + +#if (NTDDI_VERSION >= NTDDI_WINXP) + +#define PDCAP_D0_SUPPORTED 0x00000001 +#define PDCAP_D1_SUPPORTED 0x00000002 +#define PDCAP_D2_SUPPORTED 0x00000004 +#define PDCAP_D3_SUPPORTED 0x00000008 +#define PDCAP_WAKE_FROM_D0_SUPPORTED 0x00000010 +#define PDCAP_WAKE_FROM_D1_SUPPORTED 0x00000020 +#define PDCAP_WAKE_FROM_D2_SUPPORTED 0x00000040 +#define PDCAP_WAKE_FROM_D3_SUPPORTED 0x00000080 +#define PDCAP_WARM_EJECT_SUPPORTED 0x00000100 + +typedef struct CM_Power_Data_s { + ULONG PD_Size; + DEVICE_POWER_STATE PD_MostRecentPowerState; + ULONG PD_Capabilities; + ULONG PD_D1Latency; + ULONG PD_D2Latency; + ULONG PD_D3Latency; + DEVICE_POWER_STATE PD_PowerStateMapping[PowerSystemMaximum]; + SYSTEM_POWER_STATE PD_DeepestSystemWake; +} CM_POWER_DATA, *PCM_POWER_DATA; + +#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ + +typedef enum _SYSTEM_POWER_CONDITION { + PoAc, + PoDc, + PoHot, + PoConditionMaximum +} SYSTEM_POWER_CONDITION; + +typedef struct _SET_POWER_SETTING_VALUE { + ULONG Version; + GUID Guid; + SYSTEM_POWER_CONDITION PowerCondition; + ULONG DataLength; + UCHAR Data[ANYSIZE_ARRAY]; +} SET_POWER_SETTING_VALUE, *PSET_POWER_SETTING_VALUE; + +#define POWER_SETTING_VALUE_VERSION (0x1) + +typedef struct _NOTIFY_USER_POWER_SETTING { + GUID Guid; +} NOTIFY_USER_POWER_SETTING, *PNOTIFY_USER_POWER_SETTING; + +typedef struct _APPLICATIONLAUNCH_SETTING_VALUE { + LARGE_INTEGER ActivationTime; + ULONG Flags; + ULONG ButtonInstanceID; +} APPLICATIONLAUNCH_SETTING_VALUE, *PAPPLICATIONLAUNCH_SETTING_VALUE; + +typedef enum _POWER_PLATFORM_ROLE { + PlatformRoleUnspecified = 0, + PlatformRoleDesktop, + PlatformRoleMobile, + PlatformRoleWorkstation, + PlatformRoleEnterpriseServer, + PlatformRoleSOHOServer, + PlatformRoleAppliancePC, + PlatformRolePerformanceServer, + PlatformRoleMaximum +} POWER_PLATFORM_ROLE; + #if (NTDDI_VERSION >= NTDDI_WINXP) || !defined(_BATCLASS_) typedef struct { ULONG Granularity; @@ -2153,12 +2684,6 @@ NTSTATUS IN OUT PVOID Context OPTIONAL); typedef POWER_SETTING_CALLBACK *PPOWER_SETTING_CALLBACK; -#define PO_CB_SYSTEM_POWER_POLICY 0 -#define PO_CB_AC_STATUS 1 -#define PO_CB_BUTTON_COLLISION 2 -#define PO_CB_SYSTEM_STATE_LOCK 3 -#define PO_CB_LID_SWITCH_STATE 4 -#define PO_CB_PROCESSOR_POWER_POLICY 5 /****************************************************************************** * Configuration Manager Types * @@ -2250,6 +2775,15 @@ typedef int CM_RESOURCE_TYPE; REG_OPTION_BACKUP_RESTORE |\ REG_OPTION_OPEN_LINK) +#define REG_OPEN_LEGAL_OPTION \ + (REG_OPTION_RESERVED |\ + REG_OPTION_BACKUP_RESTORE |\ + REG_OPTION_OPEN_LINK) + +#define REG_STANDARD_FORMAT 1 +#define REG_LATEST_FORMAT 2 +#define REG_NO_COMPRESSION 4 + /* Key creation/open disposition */ #define REG_CREATED_NEW_KEY (0x00000001L) #define REG_OPENED_EXISTING_KEY (0x00000002L) @@ -2282,27 +2816,6 @@ typedef int CM_RESOURCE_TYPE; REG_NOTIFY_CHANGE_LAST_SET |\ REG_NOTIFY_CHANGE_SECURITY) -typedef struct _CM_FLOPPY_DEVICE_DATA { - USHORT Version; - USHORT Revision; - CHAR Size[8]; - ULONG MaxDensity; - ULONG MountDensity; - UCHAR StepRateHeadUnloadTime; - UCHAR HeadLoadTime; - UCHAR MotorOffTime; - UCHAR SectorLengthCode; - UCHAR SectorPerTrack; - UCHAR ReadWriteGapLength; - UCHAR DataTransferLength; - UCHAR FormatGapLength; - UCHAR FormatFillCharacter; - UCHAR HeadSettleTime; - UCHAR MotorSettleTime; - UCHAR MaximumTrackValue; - UCHAR DataTransferRate; -} CM_FLOPPY_DEVICE_DATA, *PCM_FLOPPY_DEVICE_DATA; - #include typedef struct _CM_PARTIAL_RESOURCE_DESCRIPTOR { UCHAR Type; @@ -2469,6 +2982,50 @@ typedef enum _CM_SHARE_DISPOSITION { #define CM_RESOURCE_DMA_TYPE_B 0x0020 #define CM_RESOURCE_DMA_TYPE_F 0x0040 +typedef struct _DEVICE_FLAGS { + ULONG Failed:1; + ULONG ReadOnly:1; + ULONG Removable:1; + ULONG ConsoleIn:1; + ULONG ConsoleOut:1; + ULONG Input:1; + ULONG Output:1; +} DEVICE_FLAGS, *PDEVICE_FLAGS; + +typedef enum _INTERFACE_TYPE { + InterfaceTypeUndefined = -1, + Internal, + Isa, + Eisa, + MicroChannel, + TurboChannel, + PCIBus, + VMEBus, + NuBus, + PCMCIABus, + CBus, + MPIBus, + MPSABus, + ProcessorInternal, + InternalPowerBus, + PNPISABus, + PNPBus, + Vmcs, + MaximumInterfaceType +} INTERFACE_TYPE, *PINTERFACE_TYPE; + +typedef struct _CM_COMPONENT_INFORMATION { + DEVICE_FLAGS Flags; + ULONG Version; + ULONG Key; + KAFFINITY AffinityMask; +} CM_COMPONENT_INFORMATION, *PCM_COMPONENT_INFORMATION; + +typedef struct _CM_ROM_BLOCK { + ULONG Address; + ULONG Size; +} CM_ROM_BLOCK, *PCM_ROM_BLOCK; + typedef struct _CM_PARTIAL_RESOURCE_LIST { USHORT Version; USHORT Revision; @@ -2487,6 +3044,12 @@ typedef struct _CM_RESOURCE_LIST { CM_FULL_RESOURCE_DESCRIPTOR List[1]; } CM_RESOURCE_LIST, *PCM_RESOURCE_LIST; +typedef struct _PNP_BUS_INFORMATION { + GUID BusTypeGuid; + INTERFACE_TYPE LegacyBusType; + ULONG BusNumber; +} PNP_BUS_INFORMATION, *PPNP_BUS_INFORMATION; + #include typedef struct _CM_INT13_DRIVE_PARAMETER { @@ -2497,6 +3060,14 @@ typedef struct _CM_INT13_DRIVE_PARAMETER { USHORT NumberDrives; } CM_INT13_DRIVE_PARAMETER, *PCM_INT13_DRIVE_PARAMETER; +typedef struct _CM_MCA_POS_DATA { + USHORT AdapterId; + UCHAR PosData1; + UCHAR PosData2; + UCHAR PosData3; + UCHAR PosData4; +} CM_MCA_POS_DATA, *PCM_MCA_POS_DATA; + typedef struct _CM_PNP_BIOS_DEVICE_NODE { USHORT Size; UCHAR Node; @@ -2538,50 +3109,82 @@ typedef struct _CM_KEYBOARD_DEVICE_DATA { USHORT KeyboardFlags; } CM_KEYBOARD_DEVICE_DATA, *PCM_KEYBOARD_DEVICE_DATA; -typedef struct _CM_MCA_POS_DATA { - USHORT AdapterId; - UCHAR PosData1; - UCHAR PosData2; - UCHAR PosData3; - UCHAR PosData4; -} CM_MCA_POS_DATA, *PCM_MCA_POS_DATA; - -#if (NTDDI_VERSION >= NTDDI_WINXP) -typedef struct CM_Power_Data_s { - ULONG PD_Size; - DEVICE_POWER_STATE PD_MostRecentPowerState; - ULONG PD_Capabilities; - ULONG PD_D1Latency; - ULONG PD_D2Latency; - ULONG PD_D3Latency; - DEVICE_POWER_STATE PD_PowerStateMapping[PowerSystemMaximum]; - SYSTEM_POWER_STATE PD_DeepestSystemWake; -} CM_POWER_DATA, *PCM_POWER_DATA; - -#define PDCAP_D0_SUPPORTED 0x00000001 -#define PDCAP_D1_SUPPORTED 0x00000002 -#define PDCAP_D2_SUPPORTED 0x00000004 -#define PDCAP_D3_SUPPORTED 0x00000008 -#define PDCAP_WAKE_FROM_D0_SUPPORTED 0x00000010 -#define PDCAP_WAKE_FROM_D1_SUPPORTED 0x00000020 -#define PDCAP_WAKE_FROM_D2_SUPPORTED 0x00000040 -#define PDCAP_WAKE_FROM_D3_SUPPORTED 0x00000080 -#define PDCAP_WARM_EJECT_SUPPORTED 0x00000100 - -#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ - typedef struct _CM_SCSI_DEVICE_DATA { USHORT Version; USHORT Revision; UCHAR HostIdentifier; } CM_SCSI_DEVICE_DATA, *PCM_SCSI_DEVICE_DATA; +typedef struct _CM_VIDEO_DEVICE_DATA { + USHORT Version; + USHORT Revision; + ULONG VideoClock; +} CM_VIDEO_DEVICE_DATA, *PCM_VIDEO_DEVICE_DATA; + +typedef struct _CM_SONIC_DEVICE_DATA { + USHORT Version; + USHORT Revision; + USHORT DataConfigurationRegister; + UCHAR EthernetAddress[8]; +} CM_SONIC_DEVICE_DATA, *PCM_SONIC_DEVICE_DATA; + typedef struct _CM_SERIAL_DEVICE_DATA { USHORT Version; USHORT Revision; ULONG BaudClock; } CM_SERIAL_DEVICE_DATA, *PCM_SERIAL_DEVICE_DATA; +typedef struct _CM_MONITOR_DEVICE_DATA { + USHORT Version; + USHORT Revision; + USHORT HorizontalScreenSize; + USHORT VerticalScreenSize; + USHORT HorizontalResolution; + USHORT VerticalResolution; + USHORT HorizontalDisplayTimeLow; + USHORT HorizontalDisplayTime; + USHORT HorizontalDisplayTimeHigh; + USHORT HorizontalBackPorchLow; + USHORT HorizontalBackPorch; + USHORT HorizontalBackPorchHigh; + USHORT HorizontalFrontPorchLow; + USHORT HorizontalFrontPorch; + USHORT HorizontalFrontPorchHigh; + USHORT HorizontalSyncLow; + USHORT HorizontalSync; + USHORT HorizontalSyncHigh; + USHORT VerticalBackPorchLow; + USHORT VerticalBackPorch; + USHORT VerticalBackPorchHigh; + USHORT VerticalFrontPorchLow; + USHORT VerticalFrontPorch; + USHORT VerticalFrontPorchHigh; + USHORT VerticalSyncLow; + USHORT VerticalSync; + USHORT VerticalSyncHigh; +} CM_MONITOR_DEVICE_DATA, *PCM_MONITOR_DEVICE_DATA; + +typedef struct _CM_FLOPPY_DEVICE_DATA { + USHORT Version; + USHORT Revision; + CHAR Size[8]; + ULONG MaxDensity; + ULONG MountDensity; + UCHAR StepRateHeadUnloadTime; + UCHAR HeadLoadTime; + UCHAR MotorOffTime; + UCHAR SectorLengthCode; + UCHAR SectorPerTrack; + UCHAR ReadWriteGapLength; + UCHAR DataTransferLength; + UCHAR FormatGapLength; + UCHAR FormatFillCharacter; + UCHAR HeadSettleTime; + UCHAR MotorSettleTime; + UCHAR MaximumTrackValue; + UCHAR DataTransferRate; +} CM_FLOPPY_DEVICE_DATA, *PCM_FLOPPY_DEVICE_DATA; + typedef enum _KEY_INFORMATION_CLASS { KeyBasicInformation, KeyNodeInformation, @@ -2601,6 +3204,10 @@ typedef struct _KEY_BASIC_INFORMATION { WCHAR Name[1]; } KEY_BASIC_INFORMATION, *PKEY_BASIC_INFORMATION; +typedef struct _KEY_CONTROL_FLAGS_INFORMATION { + ULONG ControlFlags; +} KEY_CONTROL_FLAGS_INFORMATION, *PKEY_CONTROL_FLAGS_INFORMATION; + typedef struct _KEY_FULL_INFORMATION { LARGE_INTEGER LastWriteTime; ULONG TitleIndex; @@ -2615,6 +3222,10 @@ typedef struct _KEY_FULL_INFORMATION { WCHAR Class[1]; } KEY_FULL_INFORMATION, *PKEY_FULL_INFORMATION; +typedef struct _KEY_HANDLE_TAGS_INFORMATION { + ULONG HandleTags; +} KEY_HANDLE_TAGS_INFORMATION, *PKEY_HANDLE_TAGS_INFORMATION; + typedef struct _KEY_NODE_INFORMATION { LARGE_INTEGER LastWriteTime; ULONG TitleIndex; @@ -2624,6 +3235,23 @@ typedef struct _KEY_NODE_INFORMATION { WCHAR Name[1]; } KEY_NODE_INFORMATION, *PKEY_NODE_INFORMATION; +typedef enum _KEY_SET_INFORMATION_CLASS { + KeyWriteTimeInformation, + KeyWow64FlagsInformation, + KeyControlFlagsInformation, + KeySetVirtualizationInformation, + KeySetDebugInformation, + KeySetHandleTagsInformation, + MaxKeySetInfoClass +} KEY_SET_INFORMATION_CLASS; + +typedef struct _KEY_SET_VIRTUALIZATION_INFORMATION { + ULONG VirtualTarget:1; + ULONG VirtualStore:1; + ULONG VirtualSource:1; + ULONG Reserved:29; +} KEY_SET_VIRTUALIZATION_INFORMATION, *PKEY_SET_VIRTUALIZATION_INFORMATION; + typedef struct _KEY_VALUE_BASIC_INFORMATION { ULONG TitleIndex; ULONG Type; @@ -2668,20 +3296,14 @@ typedef enum _KEY_VALUE_INFORMATION_CLASS { KeyValuePartialInformationAlign64 } KEY_VALUE_INFORMATION_CLASS; +typedef struct _KEY_WOW64_FLAGS_INFORMATION { + ULONG UserFlags; +} KEY_WOW64_FLAGS_INFORMATION, *PKEY_WOW64_FLAGS_INFORMATION; + typedef struct _KEY_WRITE_TIME_INFORMATION { LARGE_INTEGER LastWriteTime; } KEY_WRITE_TIME_INFORMATION, *PKEY_WRITE_TIME_INFORMATION; -typedef enum _KEY_SET_INFORMATION_CLASS { - KeyWriteTimeInformation, - KeyWow64FlagsInformation, - KeyControlFlagsInformation, - KeySetVirtualizationInformation, - KeySetDebugInformation, - KeySetHandleTagsInformation, - MaxKeySetInfoClass -} KEY_SET_INFORMATION_CLASS; - typedef enum _REG_NOTIFY_CLASS { RegNtDeleteKey, RegNtPreDeleteKey = RegNtDeleteKey, @@ -2851,6 +3473,54 @@ typedef struct _REG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION { PVOID Reserved; } REG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION, *PREG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION; +typedef struct _REG_RENAME_KEY_INFORMATION { + PVOID Object; + PUNICODE_STRING NewName; + PVOID CallContext; + PVOID ObjectContext; + PVOID Reserved; +} REG_RENAME_KEY_INFORMATION, *PREG_RENAME_KEY_INFORMATION; + +typedef struct _REG_CREATE_KEY_INFORMATION { + PUNICODE_STRING CompleteName; + PVOID RootObject; + PVOID ObjectType; + ULONG CreateOptions; + PUNICODE_STRING Class; + PVOID SecurityDescriptor; + PVOID SecurityQualityOfService; + ACCESS_MASK DesiredAccess; + ACCESS_MASK GrantedAccess; + PULONG Disposition; + PVOID *ResultObject; + PVOID CallContext; + PVOID RootObjectContext; + PVOID Transaction; + PVOID Reserved; +} REG_CREATE_KEY_INFORMATION, REG_OPEN_KEY_INFORMATION,*PREG_CREATE_KEY_INFORMATION, *PREG_OPEN_KEY_INFORMATION; + +typedef struct _REG_CREATE_KEY_INFORMATION_V1 { + PUNICODE_STRING CompleteName; + PVOID RootObject; + PVOID ObjectType; + ULONG Options; + PUNICODE_STRING Class; + PVOID SecurityDescriptor; + PVOID SecurityQualityOfService; + ACCESS_MASK DesiredAccess; + ACCESS_MASK GrantedAccess; + PULONG Disposition; + PVOID *ResultObject; + PVOID CallContext; + PVOID RootObjectContext; + PVOID Transaction; + ULONG_PTR Version; + PUNICODE_STRING RemainingName; + ULONG Wow64Flags; + ULONG Attributes; + KPROCESSOR_MODE CheckAccessMode; +} REG_CREATE_KEY_INFORMATION_V1, REG_OPEN_KEY_INFORMATION_V1,*PREG_CREATE_KEY_INFORMATION_V1, *PREG_OPEN_KEY_INFORMATION_V1; + typedef struct _REG_PRE_CREATE_KEY_INFORMATION { PUNICODE_STRING CompleteName; } REG_PRE_CREATE_KEY_INFORMATION, REG_PRE_OPEN_KEY_INFORMATION,*PREG_PRE_CREATE_KEY_INFORMATION, *PREG_PRE_OPEN_KEY_INFORMATION;; @@ -2878,142 +3548,83 @@ typedef struct _REG_KEY_HANDLE_CLOSE_INFORMATION { PVOID Reserved; } REG_KEY_HANDLE_CLOSE_INFORMATION, *PREG_KEY_HANDLE_CLOSE_INFORMATION; -/****************************************************************************** - * I/O Manager Types * - ******************************************************************************/ +#if (NTDDI_VERSION >= NTDDI_VISTA) - /* PCI_COMMON_CONFIG.Command */ -#define PCI_ENABLE_IO_SPACE 0x0001 -#define PCI_ENABLE_MEMORY_SPACE 0x0002 -#define PCI_ENABLE_BUS_MASTER 0x0004 -#define PCI_ENABLE_SPECIAL_CYCLES 0x0008 -#define PCI_ENABLE_WRITE_AND_INVALIDATE 0x0010 -#define PCI_ENABLE_VGA_COMPATIBLE_PALETTE 0x0020 -#define PCI_ENABLE_PARITY 0x0040 -#define PCI_ENABLE_WAIT_CYCLE 0x0080 -#define PCI_ENABLE_SERR 0x0100 -#define PCI_ENABLE_FAST_BACK_TO_BACK 0x0200 -#define PCI_DISABLE_LEVEL_INTERRUPT 0x0400 +typedef struct _REG_LOAD_KEY_INFORMATION { + PVOID Object; + PUNICODE_STRING KeyName; + PUNICODE_STRING SourceFile; + ULONG Flags; + PVOID TrustClassObject; + PVOID UserEvent; + ACCESS_MASK DesiredAccess; + PHANDLE RootHandle; + PVOID CallContext; + PVOID ObjectContext; + PVOID Reserved; +} REG_LOAD_KEY_INFORMATION, *PREG_LOAD_KEY_INFORMATION; -/* PCI_COMMON_CONFIG.Status */ -#define PCI_STATUS_INTERRUPT_PENDING 0x0008 -#define PCI_STATUS_CAPABILITIES_LIST 0x0010 -#define PCI_STATUS_66MHZ_CAPABLE 0x0020 -#define PCI_STATUS_UDF_SUPPORTED 0x0040 -#define PCI_STATUS_FAST_BACK_TO_BACK 0x0080 -#define PCI_STATUS_DATA_PARITY_DETECTED 0x0100 -#define PCI_STATUS_DEVSEL 0x0600 -#define PCI_STATUS_SIGNALED_TARGET_ABORT 0x0800 -#define PCI_STATUS_RECEIVED_TARGET_ABORT 0x1000 -#define PCI_STATUS_RECEIVED_MASTER_ABORT 0x2000 -#define PCI_STATUS_SIGNALED_SYSTEM_ERROR 0x4000 -#define PCI_STATUS_DETECTED_PARITY_ERROR 0x8000 +typedef struct _REG_UNLOAD_KEY_INFORMATION { + PVOID Object; + PVOID UserEvent; + PVOID CallContext; + PVOID ObjectContext; + PVOID Reserved; +} REG_UNLOAD_KEY_INFORMATION, *PREG_UNLOAD_KEY_INFORMATION; -/* PCI_COMMON_CONFIG.HeaderType */ -#define PCI_MULTIFUNCTION 0x80 -#define PCI_DEVICE_TYPE 0x00 -#define PCI_BRIDGE_TYPE 0x01 -#define PCI_CARDBUS_BRIDGE_TYPE 0x02 +typedef struct _REG_CALLBACK_CONTEXT_CLEANUP_INFORMATION { + PVOID Object; + PVOID ObjectContext; + PVOID Reserved; +} REG_CALLBACK_CONTEXT_CLEANUP_INFORMATION, *PREG_CALLBACK_CONTEXT_CLEANUP_INFORMATION; -#define PCI_CONFIGURATION_TYPE(PciData) \ - (((PPCI_COMMON_CONFIG) (PciData))->HeaderType & ~PCI_MULTIFUNCTION) +typedef struct _REG_QUERY_KEY_SECURITY_INFORMATION { + PVOID Object; + PSECURITY_INFORMATION SecurityInformation; + PSECURITY_DESCRIPTOR SecurityDescriptor; + PULONG Length; + PVOID CallContext; + PVOID ObjectContext; + PVOID Reserved; +} REG_QUERY_KEY_SECURITY_INFORMATION, *PREG_QUERY_KEY_SECURITY_INFORMATION; -#define PCI_MULTIFUNCTION_DEVICE(PciData) \ - ((((PPCI_COMMON_CONFIG) (PciData))->HeaderType & PCI_MULTIFUNCTION) != 0) +typedef struct _REG_SET_KEY_SECURITY_INFORMATION { + PVOID Object; + PSECURITY_INFORMATION SecurityInformation; + PSECURITY_DESCRIPTOR SecurityDescriptor; + PVOID CallContext; + PVOID ObjectContext; + PVOID Reserved; +} REG_SET_KEY_SECURITY_INFORMATION, *PREG_SET_KEY_SECURITY_INFORMATION; -/* PCI device classes */ -#define PCI_CLASS_PRE_20 0x00 -#define PCI_CLASS_MASS_STORAGE_CTLR 0x01 -#define PCI_CLASS_NETWORK_CTLR 0x02 -#define PCI_CLASS_DISPLAY_CTLR 0x03 -#define PCI_CLASS_MULTIMEDIA_DEV 0x04 -#define PCI_CLASS_MEMORY_CTLR 0x05 -#define PCI_CLASS_BRIDGE_DEV 0x06 -#define PCI_CLASS_SIMPLE_COMMS_CTLR 0x07 -#define PCI_CLASS_BASE_SYSTEM_DEV 0x08 -#define PCI_CLASS_INPUT_DEV 0x09 -#define PCI_CLASS_DOCKING_STATION 0x0a -#define PCI_CLASS_PROCESSOR 0x0b -#define PCI_CLASS_SERIAL_BUS_CTLR 0x0c -#define PCI_CLASS_WIRELESS_CTLR 0x0d -#define PCI_CLASS_INTELLIGENT_IO_CTLR 0x0e -#define PCI_CLASS_SATELLITE_COMMS_CTLR 0x0f -#define PCI_CLASS_ENCRYPTION_DECRYPTION 0x10 -#define PCI_CLASS_DATA_ACQ_SIGNAL_PROC 0x11 +typedef struct _REG_RESTORE_KEY_INFORMATION { + PVOID Object; + HANDLE FileHandle; + ULONG Flags; + PVOID CallContext; + PVOID ObjectContext; + PVOID Reserved; +} REG_RESTORE_KEY_INFORMATION, *PREG_RESTORE_KEY_INFORMATION; -/* PCI device subclasses for class 0 */ -#define PCI_SUBCLASS_PRE_20_NON_VGA 0x00 -#define PCI_SUBCLASS_PRE_20_VGA 0x01 +typedef struct _REG_SAVE_KEY_INFORMATION { + PVOID Object; + HANDLE FileHandle; + ULONG Format; + PVOID CallContext; + PVOID ObjectContext; + PVOID Reserved; +} REG_SAVE_KEY_INFORMATION, *PREG_SAVE_KEY_INFORMATION; -/* PCI device subclasses for class 1 (mass storage controllers)*/ -#define PCI_SUBCLASS_MSC_SCSI_BUS_CTLR 0x00 -#define PCI_SUBCLASS_MSC_IDE_CTLR 0x01 -#define PCI_SUBCLASS_MSC_FLOPPY_CTLR 0x02 -#define PCI_SUBCLASS_MSC_IPI_CTLR 0x03 -#define PCI_SUBCLASS_MSC_RAID_CTLR 0x04 -#define PCI_SUBCLASS_MSC_OTHER 0x80 +typedef struct _REG_REPLACE_KEY_INFORMATION { + PVOID Object; + PUNICODE_STRING OldFileName; + PUNICODE_STRING NewFileName; + PVOID CallContext; + PVOID ObjectContext; + PVOID Reserved; +} REG_REPLACE_KEY_INFORMATION, *PREG_REPLACE_KEY_INFORMATION; -/* PCI device subclasses for class 2 (network controllers)*/ -#define PCI_SUBCLASS_NET_ETHERNET_CTLR 0x00 -#define PCI_SUBCLASS_NET_TOKEN_RING_CTLR 0x01 -#define PCI_SUBCLASS_NET_FDDI_CTLR 0x02 -#define PCI_SUBCLASS_NET_ATM_CTLR 0x03 -#define PCI_SUBCLASS_NET_ISDN_CTLR 0x04 -#define PCI_SUBCLASS_NET_OTHER 0x80 - -/* PCI device subclasses for class 3 (display controllers)*/ -#define PCI_SUBCLASS_VID_VGA_CTLR 0x00 -#define PCI_SUBCLASS_VID_XGA_CTLR 0x01 -#define PCI_SUBCLASS_VID_3D_CTLR 0x02 -#define PCI_SUBCLASS_VID_OTHER 0x80 - -/* PCI device subclasses for class 4 (multimedia device)*/ -#define PCI_SUBCLASS_MM_VIDEO_DEV 0x00 -#define PCI_SUBCLASS_MM_AUDIO_DEV 0x01 -#define PCI_SUBCLASS_MM_TELEPHONY_DEV 0x02 -#define PCI_SUBCLASS_MM_OTHER 0x80 - -/* PCI device subclasses for class 5 (memory controller)*/ -#define PCI_SUBCLASS_MEM_RAM 0x00 -#define PCI_SUBCLASS_MEM_FLASH 0x01 -#define PCI_SUBCLASS_MEM_OTHER 0x80 - -/* PCI device subclasses for class 6 (bridge device)*/ -#define PCI_SUBCLASS_BR_HOST 0x00 -#define PCI_SUBCLASS_BR_ISA 0x01 -#define PCI_SUBCLASS_BR_EISA 0x02 -#define PCI_SUBCLASS_BR_MCA 0x03 -#define PCI_SUBCLASS_BR_PCI_TO_PCI 0x04 -#define PCI_SUBCLASS_BR_PCMCIA 0x05 -#define PCI_SUBCLASS_BR_NUBUS 0x06 -#define PCI_SUBCLASS_BR_CARDBUS 0x07 -#define PCI_SUBCLASS_BR_RACEWAY 0x08 -#define PCI_SUBCLASS_BR_OTHER 0x80 - -/* PCI device subclasses for class C (serial bus controller)*/ -#define PCI_SUBCLASS_SB_IEEE1394 0x00 -#define PCI_SUBCLASS_SB_ACCESS 0x01 -#define PCI_SUBCLASS_SB_SSA 0x02 -#define PCI_SUBCLASS_SB_USB 0x03 -#define PCI_SUBCLASS_SB_FIBRE_CHANNEL 0x04 -#define PCI_SUBCLASS_SB_SMBUS 0x05 - -#define PCI_MAX_DEVICES 32 -#define PCI_MAX_FUNCTION 8 -#define PCI_MAX_BRIDGE_NUMBER 0xFF -#define PCI_INVALID_VENDORID 0xFFFF -#define PCI_COMMON_HDR_LENGTH (FIELD_OFFSET(PCI_COMMON_CONFIG, DeviceSpecific)) - -#define PCI_ADDRESS_IO_SPACE 0x00000001 -#define PCI_ADDRESS_MEMORY_TYPE_MASK 0x00000006 -#define PCI_ADDRESS_MEMORY_PREFETCHABLE 0x00000008 -#define PCI_ADDRESS_IO_ADDRESS_MASK 0xfffffffc -#define PCI_ADDRESS_MEMORY_ADDRESS_MASK 0xfffffff0 -#define PCI_ADDRESS_ROM_ADDRESS_MASK 0xfffff800 - -#define PCI_TYPE_32BIT 0 -#define PCI_TYPE_20BIT 2 -#define PCI_TYPE_64BIT 4 +#endif /* NTDDI_VERSION >= NTDDI_VISTA */ #define SERVICE_KERNEL_DRIVER 0x00000001 #define SERVICE_FILE_SYSTEM_DRIVER 0x00000002 @@ -3080,14 +3691,37 @@ typedef enum _CM_ERROR_CONTROL_TYPE { CM_SERVICE_VIRTUAL_DISK_BOOT_LOAD | \ CM_SERVICE_USB_DISK_BOOT_LOAD) +/****************************************************************************** + * I/O Manager Types * + ******************************************************************************/ + +#define WDM_MAJORVERSION 0x06 +#define WDM_MINORVERSION 0x00 + +#if defined(_WIN64) + +#ifndef USE_DMA_MACROS +#define USE_DMA_MACROS +#endif + +#ifndef NO_LEGACY_DRIVERS +#define NO_LEGACY_DRIVERS +#endif + +#endif /* defined(_WIN64) */ + +#define STATUS_CONTINUE_COMPLETION STATUS_SUCCESS + +#define CONNECT_FULLY_SPECIFIED 0x1 +#define CONNECT_LINE_BASED 0x2 +#define CONNECT_MESSAGE_BASED 0x3 +#define CONNECT_FULLY_SPECIFIED_GROUP 0x4 +#define CONNECT_CURRENT_VERSION 0x4 + #define POOL_COLD_ALLOCATION 256 #define POOL_QUOTA_FAIL_INSTEAD_OF_RAISE 8 #define POOL_RAISE_IF_ALLOCATION_FAILURE 16 -#define PCI_TYPE0_ADDRESSES 6 -#define PCI_TYPE1_ADDRESSES 2 -#define PCI_TYPE2_ADDRESSES 5 - #define IO_TYPE_ADAPTER 1 #define IO_TYPE_CONTROLLER 2 #define IO_TYPE_DEVICE 3 @@ -3111,47 +3745,6 @@ typedef enum _CM_ERROR_CONTROL_TYPE { #define IO_RESOURCE_DEFAULT 0x02 #define IO_RESOURCE_ALTERNATIVE 0x08 -/* DEVICE_OBJECT.Flags */ -#define DO_VERIFY_VOLUME 0x00000002 -#define DO_BUFFERED_IO 0x00000004 -#define DO_EXCLUSIVE 0x00000008 -#define DO_DIRECT_IO 0x00000010 -#define DO_MAP_IO_BUFFER 0x00000020 -#define DO_DEVICE_INITIALIZING 0x00000080 -#define DO_SHUTDOWN_REGISTERED 0x00000800 -#define DO_BUS_ENUMERATED_DEVICE 0x00001000 -#define DO_POWER_PAGABLE 0x00002000 -#define DO_POWER_INRUSH 0x00004000 - -/* DEVICE_OBJECT.Characteristics */ -#define FILE_REMOVABLE_MEDIA 0x00000001 -#define FILE_READ_ONLY_DEVICE 0x00000002 -#define FILE_FLOPPY_DISKETTE 0x00000004 -#define FILE_WRITE_ONCE_MEDIA 0x00000008 -#define FILE_REMOTE_DEVICE 0x00000010 -#define FILE_DEVICE_IS_MOUNTED 0x00000020 -#define FILE_VIRTUAL_VOLUME 0x00000040 -#define FILE_AUTOGENERATED_DEVICE_NAME 0x00000080 -#define FILE_DEVICE_SECURE_OPEN 0x00000100 -#define FILE_CHARACTERISTIC_PNP_DEVICE 0x00000800 -#define FILE_CHARACTERISTIC_TS_DEVICE 0x00001000 -#define FILE_CHARACTERISTIC_WEBDAV_DEVICE 0x00002000 - -/* DEVICE_OBJECT.AlignmentRequirement */ -#define FILE_BYTE_ALIGNMENT 0x00000000 -#define FILE_WORD_ALIGNMENT 0x00000001 -#define FILE_LONG_ALIGNMENT 0x00000003 -#define FILE_QUAD_ALIGNMENT 0x00000007 -#define FILE_OCTA_ALIGNMENT 0x0000000f -#define FILE_32_BYTE_ALIGNMENT 0x0000001f -#define FILE_64_BYTE_ALIGNMENT 0x0000003f -#define FILE_128_BYTE_ALIGNMENT 0x0000007f -#define FILE_256_BYTE_ALIGNMENT 0x000000ff -#define FILE_512_BYTE_ALIGNMENT 0x000001ff - -/* DEVICE_OBJECT.DeviceType */ -#define DEVICE_TYPE ULONG - #define FILE_DEVICE_BEEP 0x00000001 #define FILE_DEVICE_CD_ROM 0x00000002 #define FILE_DEVICE_CD_ROM_FILE_SYSTEM 0x00000003 @@ -3220,6 +3813,44 @@ typedef enum _CM_ERROR_CONTROL_TYPE { #define FILE_DEVICE_BIOMETRIC 0x00000044 #define FILE_DEVICE_PMI 0x00000045 +#if defined(NT_PROCESSOR_GROUPS) + +typedef USHORT IRQ_DEVICE_POLICY, *PIRQ_DEVICE_POLICY; + +typedef enum _IRQ_DEVICE_POLICY_USHORT { + IrqPolicyMachineDefault = 0, + IrqPolicyAllCloseProcessors = 1, + IrqPolicyOneCloseProcessor = 2, + IrqPolicyAllProcessorsInMachine = 3, + IrqPolicyAllProcessorsInGroup = 3, + IrqPolicySpecifiedProcessors = 4, + IrqPolicySpreadMessagesAcrossAllProcessors = 5}; + +#else /* defined(NT_PROCESSOR_GROUPS) */ + +typedef enum _IRQ_DEVICE_POLICY { + IrqPolicyMachineDefault = 0, + IrqPolicyAllCloseProcessors, + IrqPolicyOneCloseProcessor, + IrqPolicyAllProcessorsInMachine, + IrqPolicySpecifiedProcessors, + IrqPolicySpreadMessagesAcrossAllProcessors +} IRQ_DEVICE_POLICY, *PIRQ_DEVICE_POLICY; + +#endif + +typedef enum _IRQ_PRIORITY { + IrqPriorityUndefined = 0, + IrqPriorityLow, + IrqPriorityNormal, + IrqPriorityHigh +} IRQ_PRIORITY, *PIRQ_PRIORITY; + +typedef enum _IRQ_GROUP_POLICY { + GroupAffinityAllGroupZero = 0, + GroupAffinityDontCare +} IRQ_GROUP_POLICY, *PIRQ_GROUP_POLICY; + #define MAXIMUM_VOLUME_LABEL_LENGTH (32 * sizeof(WCHAR)) typedef struct _OBJECT_HANDLE_INFORMATION { @@ -3232,10 +3863,6 @@ typedef struct _CLIENT_ID { HANDLE UniqueThread; } CLIENT_ID, *PCLIENT_ID; -typedef VOID -(NTAPI *PKSTART_ROUTINE)( - IN PVOID StartContext); - typedef struct _VPB { CSHORT Type; CSHORT Size; @@ -3272,6 +3899,47 @@ typedef struct _WAIT_CONTEXT_BLOCK { PKDPC BufferChainingDpc; } WAIT_CONTEXT_BLOCK, *PWAIT_CONTEXT_BLOCK; +/* DEVICE_OBJECT.Flags */ +#define DO_VERIFY_VOLUME 0x00000002 +#define DO_BUFFERED_IO 0x00000004 +#define DO_EXCLUSIVE 0x00000008 +#define DO_DIRECT_IO 0x00000010 +#define DO_MAP_IO_BUFFER 0x00000020 +#define DO_DEVICE_INITIALIZING 0x00000080 +#define DO_SHUTDOWN_REGISTERED 0x00000800 +#define DO_BUS_ENUMERATED_DEVICE 0x00001000 +#define DO_POWER_PAGABLE 0x00002000 +#define DO_POWER_INRUSH 0x00004000 + +/* DEVICE_OBJECT.Characteristics */ +#define FILE_REMOVABLE_MEDIA 0x00000001 +#define FILE_READ_ONLY_DEVICE 0x00000002 +#define FILE_FLOPPY_DISKETTE 0x00000004 +#define FILE_WRITE_ONCE_MEDIA 0x00000008 +#define FILE_REMOTE_DEVICE 0x00000010 +#define FILE_DEVICE_IS_MOUNTED 0x00000020 +#define FILE_VIRTUAL_VOLUME 0x00000040 +#define FILE_AUTOGENERATED_DEVICE_NAME 0x00000080 +#define FILE_DEVICE_SECURE_OPEN 0x00000100 +#define FILE_CHARACTERISTIC_PNP_DEVICE 0x00000800 +#define FILE_CHARACTERISTIC_TS_DEVICE 0x00001000 +#define FILE_CHARACTERISTIC_WEBDAV_DEVICE 0x00002000 + +/* DEVICE_OBJECT.AlignmentRequirement */ +#define FILE_BYTE_ALIGNMENT 0x00000000 +#define FILE_WORD_ALIGNMENT 0x00000001 +#define FILE_LONG_ALIGNMENT 0x00000003 +#define FILE_QUAD_ALIGNMENT 0x00000007 +#define FILE_OCTA_ALIGNMENT 0x0000000f +#define FILE_32_BYTE_ALIGNMENT 0x0000001f +#define FILE_64_BYTE_ALIGNMENT 0x0000003f +#define FILE_128_BYTE_ALIGNMENT 0x0000007f +#define FILE_256_BYTE_ALIGNMENT 0x000000ff +#define FILE_512_BYTE_ALIGNMENT 0x000001ff + +/* DEVICE_OBJECT.DeviceType */ +#define DEVICE_TYPE ULONG + typedef struct _DEVICE_OBJECT { CSHORT Type; USHORT Size; @@ -3303,6 +3971,153 @@ typedef struct _DEVICE_OBJECT { PVOID Reserved; } DEVICE_OBJECT, *PDEVICE_OBJECT; +typedef enum _IO_SESSION_STATE { + IoSessionStateCreated = 1, + IoSessionStateInitialized, + IoSessionStateConnected, + IoSessionStateDisconnected, + IoSessionStateDisconnectedLoggedOn, + IoSessionStateLoggedOn, + IoSessionStateLoggedOff, + IoSessionStateTerminated, + IoSessionStateMax +} IO_SESSION_STATE, *PIO_SESSION_STATE; + +typedef enum _IO_COMPLETION_ROUTINE_RESULT { + ContinueCompletion = STATUS_CONTINUE_COMPLETION, + StopCompletion = STATUS_MORE_PROCESSING_REQUIRED +} IO_COMPLETION_ROUTINE_RESULT, *PIO_COMPLETION_ROUTINE_RESULT; + +typedef struct _IO_INTERRUPT_MESSAGE_INFO_ENTRY { + PHYSICAL_ADDRESS MessageAddress; + KAFFINITY TargetProcessorSet; + PKINTERRUPT InterruptObject; + ULONG MessageData; + ULONG Vector; + KIRQL Irql; + KINTERRUPT_MODE Mode; + KINTERRUPT_POLARITY Polarity; +} IO_INTERRUPT_MESSAGE_INFO_ENTRY, *PIO_INTERRUPT_MESSAGE_INFO_ENTRY; + +typedef struct _IO_INTERRUPT_MESSAGE_INFO { + KIRQL UnifiedIrql; + ULONG MessageCount; + IO_INTERRUPT_MESSAGE_INFO_ENTRY MessageInfo[1]; +} IO_INTERRUPT_MESSAGE_INFO, *PIO_INTERRUPT_MESSAGE_INFO; + +typedef struct _IO_CONNECT_INTERRUPT_FULLY_SPECIFIED_PARAMETERS { + IN PDEVICE_OBJECT PhysicalDeviceObject; + OUT PKINTERRUPT *InterruptObject; + IN PKSERVICE_ROUTINE ServiceRoutine; + IN PVOID ServiceContext; + IN PKSPIN_LOCK SpinLock OPTIONAL; + IN KIRQL SynchronizeIrql; + IN BOOLEAN FloatingSave; + IN BOOLEAN ShareVector; + IN ULONG Vector; + IN KIRQL Irql; + IN KINTERRUPT_MODE InterruptMode; + IN KAFFINITY ProcessorEnableMask; + IN USHORT Group; +} IO_CONNECT_INTERRUPT_FULLY_SPECIFIED_PARAMETERS, *PIO_CONNECT_INTERRUPT_FULLY_SPECIFIED_PARAMETERS; + +typedef struct _IO_CONNECT_INTERRUPT_LINE_BASED_PARAMETERS { + IN PDEVICE_OBJECT PhysicalDeviceObject; + OUT PKINTERRUPT *InterruptObject; + IN PKSERVICE_ROUTINE ServiceRoutine; + IN PVOID ServiceContext; + IN PKSPIN_LOCK SpinLock OPTIONAL; + IN KIRQL SynchronizeIrql OPTIONAL; + IN BOOLEAN FloatingSave; +} IO_CONNECT_INTERRUPT_LINE_BASED_PARAMETERS, *PIO_CONNECT_INTERRUPT_LINE_BASED_PARAMETERS; + +typedef struct _IO_CONNECT_INTERRUPT_MESSAGE_BASED_PARAMETERS { + IN PDEVICE_OBJECT PhysicalDeviceObject; + union { + OUT PVOID *Generic; + OUT PIO_INTERRUPT_MESSAGE_INFO *InterruptMessageTable; + OUT PKINTERRUPT *InterruptObject; + } ConnectionContext; + IN PKMESSAGE_SERVICE_ROUTINE MessageServiceRoutine; + IN PVOID ServiceContext; + IN PKSPIN_LOCK SpinLock OPTIONAL; + IN KIRQL SynchronizeIrql OPTIONAL; + IN BOOLEAN FloatingSave; + IN PKSERVICE_ROUTINE FallBackServiceRoutine OPTIONAL; +} IO_CONNECT_INTERRUPT_MESSAGE_BASED_PARAMETERS, *PIO_CONNECT_INTERRUPT_MESSAGE_BASED_PARAMETERS; + +typedef struct _IO_CONNECT_INTERRUPT_PARAMETERS { + IN OUT ULONG Version; + union { + IO_CONNECT_INTERRUPT_FULLY_SPECIFIED_PARAMETERS FullySpecified; + IO_CONNECT_INTERRUPT_LINE_BASED_PARAMETERS LineBased; + IO_CONNECT_INTERRUPT_MESSAGE_BASED_PARAMETERS MessageBased; + }; +} IO_CONNECT_INTERRUPT_PARAMETERS, *PIO_CONNECT_INTERRUPT_PARAMETERS; + +typedef struct _IO_DISCONNECT_INTERRUPT_PARAMETERS { + IN ULONG Version; + union { + IN PVOID Generic; + IN PKINTERRUPT InterruptObject; + IN PIO_INTERRUPT_MESSAGE_INFO InterruptMessageTable; + } ConnectionContext; +} IO_DISCONNECT_INTERRUPT_PARAMETERS, *PIO_DISCONNECT_INTERRUPT_PARAMETERS; + +typedef enum _IO_ACCESS_TYPE { + ReadAccess, + WriteAccess, + ModifyAccess +} IO_ACCESS_TYPE; + +typedef enum _IO_ACCESS_MODE { + SequentialAccess, + RandomAccess +} IO_ACCESS_MODE; + +typedef enum _IO_CONTAINER_NOTIFICATION_CLASS { + IoSessionStateNotification, + IoMaxContainerNotificationClass +} IO_CONTAINER_NOTIFICATION_CLASS; + +typedef struct _IO_SESSION_STATE_NOTIFICATION { + ULONG Size; + ULONG Flags; + PVOID IoObject; + ULONG EventMask; + PVOID Context; +} IO_SESSION_STATE_NOTIFICATION, *PIO_SESSION_STATE_NOTIFICATION; + +typedef enum _IO_CONTAINER_INFORMATION_CLASS { + IoSessionStateInformation, + IoMaxContainerInformationClass +} IO_CONTAINER_INFORMATION_CLASS; + +typedef struct _IO_SESSION_STATE_INFORMATION { + ULONG SessionId; + IO_SESSION_STATE SessionState; + BOOLEAN LocalSession; +} IO_SESSION_STATE_INFORMATION, *PIO_SESSION_STATE_INFORMATION; + +#if (NTDDI_VERSION >= NTDDI_WIN7) + +typedef NTSTATUS +(NTAPI *PIO_CONTAINER_NOTIFICATION_FUNCTION)( + VOID); + +typedef NTSTATUS +(NTAPI IO_SESSION_NOTIFICATION_FUNCTION)( + IN PVOID SessionObject, + IN PVOID IoObject, + IN ULONG Event, + IN PVOID Context, + IN PVOID NotificationPayload, + IN ULONG PayloadLength); + +typedef IO_SESSION_NOTIFICATION_FUNCTION *PIO_SESSION_NOTIFICATION_FUNCTION; + +#endif + typedef struct _IO_REMOVE_LOCK_TRACKING_BLOCK * PIO_REMOVE_LOCK_TRACKING_BLOCK; typedef struct _IO_REMOVE_LOCK_COMMON_BLOCK { @@ -3431,22 +4246,6 @@ typedef struct _SHARE_ACCESS { } type2; \ } u; -typedef struct _PCI_COMMON_HEADER { - PCI_COMMON_HEADER_LAYOUT -} PCI_COMMON_HEADER, *PPCI_COMMON_HEADER; - -#ifdef __cplusplus -typedef struct _PCI_COMMON_CONFIG { - PCI_COMMON_HEADER_LAYOUT - UCHAR DeviceSpecific[192]; -} PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG; -#else -typedef struct _PCI_COMMON_CONFIG { - PCI_COMMON_HEADER DUMMYSTRUCTNAME; - UCHAR DeviceSpecific[192]; -} PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG; -#endif - typedef enum _CREATE_FILE_TYPE { CreateFileTypeNone, CreateFileTypeNamedPipe, @@ -3467,16 +4266,12 @@ typedef struct _IO_STATUS_BLOCK { ULONG_PTR Information; } IO_STATUS_BLOCK, *PIO_STATUS_BLOCK; -typedef struct _PCI_SLOT_NUMBER { - union { - struct { - ULONG DeviceNumber : 5; - ULONG FunctionNumber : 3; - ULONG Reserved : 24; - } bits; - ULONG AsULONG; - } u; -} PCI_SLOT_NUMBER, *PPCI_SLOT_NUMBER; +#if defined(_WIN64) +typedef struct _IO_STATUS_BLOCK32 { + NTSTATUS Status; + ULONG Information; +} IO_STATUS_BLOCK32, *PIO_STATUS_BLOCK32; +#endif typedef VOID (NTAPI *PIO_APC_ROUTINE)( @@ -3484,16 +4279,35 @@ typedef VOID IN PIO_STATUS_BLOCK IoStatusBlock, IN ULONG Reserved); -typedef VOID -(NTAPI *WMI_NOTIFICATION_CALLBACK)( - PVOID Wnode, - PVOID Context); +#define PIO_APC_ROUTINE_DEFINED -#define WMIREG_ACTION_REGISTER 1 -#define WMIREG_ACTION_DEREGISTER 2 -#define WMIREG_ACTION_REREGISTER 3 -#define WMIREG_ACTION_UPDATE_GUIDS 4 -#define WMIREG_ACTION_BLOCK_IRPS 5 +typedef enum _IO_SESSION_EVENT { + IoSessionEventIgnore = 0, + IoSessionEventCreated, + IoSessionEventTerminated, + IoSessionEventConnected, + IoSessionEventDisconnected, + IoSessionEventLogon, + IoSessionEventLogoff, + IoSessionEventMax +} IO_SESSION_EVENT, *PIO_SESSION_EVENT; + +#define IO_SESSION_STATE_ALL_EVENTS 0xffffffff +#define IO_SESSION_STATE_CREATION_EVENT 0x00000001 +#define IO_SESSION_STATE_TERMINATION_EVENT 0x00000002 +#define IO_SESSION_STATE_CONNECT_EVENT 0x00000004 +#define IO_SESSION_STATE_DISCONNECT_EVENT 0x00000008 +#define IO_SESSION_STATE_LOGON_EVENT 0x00000010 +#define IO_SESSION_STATE_LOGOFF_EVENT 0x00000020 + +#define IO_SESSION_STATE_VALID_EVENT_MASK 0x0000003f + +#define IO_SESSION_MAX_PAYLOAD_SIZE 256L + +typedef struct _IO_SESSION_CONNECT_INFO { + ULONG SessionId; + BOOLEAN LocalSession; +} IO_SESSION_CONNECT_INFO, *PIO_SESSION_CONNECT_INFO; #define EVENT_INCREMENT 1 #define IO_NO_INCREMENT 0 @@ -3562,6 +4376,7 @@ typedef struct _BOOTDISK_INFORMATION_LITE { #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ +#include typedef struct _EISA_MEMORY_TYPE { UCHAR ReadWrite : 1; @@ -3573,7 +4388,6 @@ typedef struct _EISA_MEMORY_TYPE { UCHAR MoreEntries : 1; } EISA_MEMORY_TYPE, *PEISA_MEMORY_TYPE; -#include typedef struct _EISA_MEMORY_CONFIGURATION { EISA_MEMORY_TYPE ConfigurationByte; UCHAR DataSize; @@ -3581,7 +4395,6 @@ typedef struct _EISA_MEMORY_CONFIGURATION { UCHAR AddressHighByte; USHORT MemorySize; } EISA_MEMORY_CONFIGURATION, *PEISA_MEMORY_CONFIGURATION; -#include typedef struct _EISA_IRQ_DESCRIPTOR { UCHAR Interrupt : 4; @@ -3615,7 +4428,6 @@ typedef struct _EISA_DMA_CONFIGURATION { DMA_CONFIGURATION_BYTE1 ConfigurationByte1; } EISA_DMA_CONFIGURATION, *PEISA_DMA_CONFIGURATION; -#include typedef struct _EISA_PORT_DESCRIPTOR { UCHAR NumberPorts : 5; UCHAR Reserved : 1; @@ -3627,7 +4439,17 @@ typedef struct _EISA_PORT_CONFIGURATION { EISA_PORT_DESCRIPTOR Configuration; USHORT PortAddress; } EISA_PORT_CONFIGURATION, *PEISA_PORT_CONFIGURATION; -#include + +typedef struct _CM_EISA_SLOT_INFORMATION { + UCHAR ReturnCode; + UCHAR ReturnFlags; + UCHAR MajorRevision; + UCHAR MinorRevision; + USHORT Checksum; + UCHAR NumberFunctions; + UCHAR FunctionInformation; + ULONG CompressedId; +} CM_EISA_SLOT_INFORMATION, *PCM_EISA_SLOT_INFORMATION; typedef struct _CM_EISA_FUNCTION_INFORMATION { ULONG CompressedId; @@ -3645,6 +4467,8 @@ typedef struct _CM_EISA_FUNCTION_INFORMATION { UCHAR InitializationData[60]; } CM_EISA_FUNCTION_INFORMATION, *PCM_EISA_FUNCTION_INFORMATION; +#include + /* CM_EISA_FUNCTION_INFORMATION.FunctionFlags */ #define EISA_FUNCTION_ENABLED 0x80 @@ -3659,16 +4483,9 @@ typedef struct _CM_EISA_FUNCTION_INFORMATION { (EISA_HAS_PORT_RANGE + EISA_HAS_DMA_ENTRY + EISA_HAS_IRQ_ENTRY \ + EISA_HAS_MEMORY_ENTRY + EISA_HAS_TYPE_ENTRY) -typedef struct _CM_EISA_SLOT_INFORMATION { - UCHAR ReturnCode; - UCHAR ReturnFlags; - UCHAR MajorRevision; - UCHAR MinorRevision; - USHORT Checksum; - UCHAR NumberFunctions; - UCHAR FunctionInformation; - ULONG CompressedId; -} CM_EISA_SLOT_INFORMATION, *PCM_EISA_SLOT_INFORMATION; +#define EISA_MORE_ENTRIES 0x80 +#define EISA_SYSTEM_MEMORY 0x00 +#define EISA_MEMORY_TYPE_RAM 0x01 /* CM_EISA_SLOT_INFORMATION.ReturnCode */ @@ -3715,6 +4532,45 @@ typedef ULONG IN ULONG Length); typedef GET_SET_DEVICE_DATA *PGET_SET_DEVICE_DATA; +typedef enum _DEVICE_INSTALL_STATE { + InstallStateInstalled, + InstallStateNeedsReinstall, + InstallStateFailedInstall, + InstallStateFinishInstall +} DEVICE_INSTALL_STATE, *PDEVICE_INSTALL_STATE; + +typedef struct _LEGACY_BUS_INFORMATION { + GUID BusTypeGuid; + INTERFACE_TYPE LegacyBusType; + ULONG BusNumber; +} LEGACY_BUS_INFORMATION, *PLEGACY_BUS_INFORMATION; + +typedef enum _DEVICE_REMOVAL_POLICY { + RemovalPolicyExpectNoRemoval = 1, + RemovalPolicyExpectOrderlyRemoval = 2, + RemovalPolicyExpectSurpriseRemoval = 3 +} DEVICE_REMOVAL_POLICY, *PDEVICE_REMOVAL_POLICY; + +typedef VOID +(NTAPI*PREENUMERATE_SELF)( + IN PVOID Context); + +typedef struct _REENUMERATE_SELF_INTERFACE_STANDARD { + USHORT Size; + USHORT Version; + PVOID Context; + PINTERFACE_REFERENCE InterfaceReference; + PINTERFACE_DEREFERENCE InterfaceDereference; + PREENUMERATE_SELF SurpriseRemoveAndReenumerateSelf; +} REENUMERATE_SELF_INTERFACE_STANDARD, *PREENUMERATE_SELF_INTERFACE_STANDARD; + +typedef VOID +(NTAPI *PIO_DEVICE_EJECT_CALLBACK)( + IN NTSTATUS Status, + IN OUT PVOID Context OPTIONAL); + +#define PCI_DEVICE_PRESENT_INTERFACE_VERSION 1 + /* PCI_DEVICE_PRESENCE_PARAMETERS.Flags */ #define PCI_USE_SUBSYSTEM_IDS 0x00000001 #define PCI_USE_REVISION 0x00000002 @@ -3775,175 +4631,6 @@ typedef struct _PCI_DEVICE_PRESENT_INTERFACE { PPCI_IS_DEVICE_PRESENT_EX IsDevicePresentEx; } PCI_DEVICE_PRESENT_INTERFACE, *PPCI_DEVICE_PRESENT_INTERFACE; -typedef -BOOLEAN -(*PGPE_SERVICE_ROUTINE2)( - PVOID ObjectContext, - PVOID ServiceContext -); - -typedef -NTSTATUS -(*PGPE_CONNECT_VECTOR2)( - PVOID Context, - ULONG GpeNumber, - KINTERRUPT_MODE Mode, - BOOLEAN Shareable, - PGPE_SERVICE_ROUTINE2 ServiceRoutine, - PVOID ServiceContext, - PVOID *ObjectContext -); - -typedef -NTSTATUS -(*PGPE_DISCONNECT_VECTOR2)( - PVOID Context, - PVOID ObjectContext -); - -typedef -NTSTATUS -(*PGPE_ENABLE_EVENT2)( - PVOID Context, - PVOID ObjectContext -); - -typedef -NTSTATUS -(*PGPE_DISABLE_EVENT2)( - PVOID Context, - PVOID ObjectContext -); - -typedef -NTSTATUS -(*PGPE_CLEAR_STATUS2)( - PVOID Context, - PVOID ObjectContext -); - -typedef -VOID -(*PDEVICE_NOTIFY_CALLBACK2)( - PVOID NotificationContext, - ULONG NotifyCode -); - -typedef -NTSTATUS -(*PREGISTER_FOR_DEVICE_NOTIFICATIONS2)( - PVOID Context, - PDEVICE_NOTIFY_CALLBACK2 NotificationHandler, - PVOID NotificationContext -); - -typedef -VOID -(*PUNREGISTER_FOR_DEVICE_NOTIFICATIONS2)( - PVOID Context -); - -typedef struct -{ - USHORT Size; - USHORT Version; - PVOID Context; - PINTERFACE_REFERENCE InterfaceReference; - PINTERFACE_DEREFERENCE InterfaceDereference; - PGPE_CONNECT_VECTOR2 GpeConnectVector; - PGPE_DISCONNECT_VECTOR2 GpeDisconnectVector; - PGPE_ENABLE_EVENT2 GpeEnableEvent; - PGPE_DISABLE_EVENT2 GpeDisableEvent; - PGPE_CLEAR_STATUS2 GpeClearStatus; - PREGISTER_FOR_DEVICE_NOTIFICATIONS2 RegisterForDeviceNotifications; - PUNREGISTER_FOR_DEVICE_NOTIFICATIONS2 UnregisterForDeviceNotifications; -} ACPI_INTERFACE_STANDARD2, *PACPI_INTERFACE_STANDARD2; - -typedef -BOOLEAN -(*PGPE_SERVICE_ROUTINE)( - PDEVICE_OBJECT ObjectContext, - PVOID ServiceContext -); - -typedef -NTSTATUS -(*PGPE_CONNECT_VECTOR)( - PDEVICE_OBJECT Context, - ULONG GpeNumber, - KINTERRUPT_MODE Mode, - BOOLEAN Shareable, - PGPE_SERVICE_ROUTINE ServiceRoutine, - PVOID ServiceContext, - PVOID *ObjectContext -); - -typedef -NTSTATUS -(*PGPE_DISCONNECT_VECTOR)( - PDEVICE_OBJECT Context, - PVOID ObjectContext -); - -typedef -NTSTATUS -(*PGPE_ENABLE_EVENT)( - PDEVICE_OBJECT Context, - PVOID ObjectContext -); - -typedef -NTSTATUS -(*PGPE_DISABLE_EVENT)( - PDEVICE_OBJECT Context, - PVOID ObjectContext -); - -typedef -NTSTATUS -(*PGPE_CLEAR_STATUS)( - PDEVICE_OBJECT Context, - PVOID ObjectContext -); - -typedef -VOID -(*PDEVICE_NOTIFY_CALLBACK)( - PVOID NotificationContext, - ULONG NotifyCode -); - -typedef -NTSTATUS -(*PREGISTER_FOR_DEVICE_NOTIFICATIONS)( - PDEVICE_OBJECT Context, - PDEVICE_NOTIFY_CALLBACK NotificationHandler, - PVOID NotificationContext -); - -typedef -VOID -(*PUNREGISTER_FOR_DEVICE_NOTIFICATIONS)( - PDEVICE_OBJECT Context, - PDEVICE_NOTIFY_CALLBACK NotificationHandler -); - -typedef struct -{ - USHORT Size; - USHORT Version; - PVOID Context; - PINTERFACE_REFERENCE InterfaceReference; - PINTERFACE_DEREFERENCE InterfaceDereference; - PGPE_CONNECT_VECTOR GpeConnectVector; - PGPE_DISCONNECT_VECTOR GpeDisconnectVector; - PGPE_ENABLE_EVENT GpeEnableEvent; - PGPE_DISABLE_EVENT GpeDisableEvent; - PGPE_CLEAR_STATUS GpeClearStatus; - PREGISTER_FOR_DEVICE_NOTIFICATIONS RegisterForDeviceNotifications; - PUNREGISTER_FOR_DEVICE_NOTIFICATIONS UnregisterForDeviceNotifications; -} ACPI_INTERFACE_STANDARD, *PACPI_INTERFACE_STANDARD; - typedef struct _DEVICE_CAPABILITIES { USHORT Size; USHORT Version; @@ -4033,6 +4720,139 @@ typedef struct _TARGET_DEVICE_REMOVAL_NOTIFICATION { struct _FILE_OBJECT *FileObject; } TARGET_DEVICE_REMOVAL_NOTIFICATION, *PTARGET_DEVICE_REMOVAL_NOTIFICATION; +#if (NTDDI_VERSION >= NTDDI_VISTA) +#include +#define PLUGPLAY_PROPERTY_PERSISTENT 0x00000001 +#endif + +#define PNP_REPLACE_NO_MAP MAXLONGLONG + +typedef NTSTATUS +(NTAPI *PREPLACE_MAP_MEMORY)( + IN PHYSICAL_ADDRESS TargetPhysicalAddress, + IN PHYSICAL_ADDRESS SparePhysicalAddress, + IN OUT PLARGE_INTEGER NumberOfBytes, + OUT PVOID *TargetAddress, + OUT PVOID *SpareAddress); + +typedef struct _PNP_REPLACE_MEMORY_LIST { + ULONG AllocatedCount; + ULONG Count; + ULONGLONG TotalLength; + struct { + PHYSICAL_ADDRESS Address; + ULONGLONG Length; + } Ranges[ANYSIZE_ARRAY]; +} PNP_REPLACE_MEMORY_LIST, *PPNP_REPLACE_MEMORY_LIST; + +typedef struct _PNP_REPLACE_PROCESSOR_LIST { + PKAFFINITY Affinity; + ULONG GroupCount; + ULONG AllocatedCount; + ULONG Count; + ULONG ApicIds[ANYSIZE_ARRAY]; +} PNP_REPLACE_PROCESSOR_LIST, *PPNP_REPLACE_PROCESSOR_LIST; + +typedef struct _PNP_REPLACE_PROCESSOR_LIST_V1 { + KAFFINITY AffinityMask; + ULONG AllocatedCount; + ULONG Count; + ULONG ApicIds[ANYSIZE_ARRAY]; +} PNP_REPLACE_PROCESSOR_LIST_V1, *PPNP_REPLACE_PROCESSOR_LIST_V1; + +#define PNP_REPLACE_PARAMETERS_VERSION 2 + +typedef struct _PNP_REPLACE_PARAMETERS { + ULONG Size; + ULONG Version; + ULONG64 Target; + ULONG64 Spare; + PPNP_REPLACE_PROCESSOR_LIST TargetProcessors; + PPNP_REPLACE_PROCESSOR_LIST SpareProcessors; + PPNP_REPLACE_MEMORY_LIST TargetMemory; + PPNP_REPLACE_MEMORY_LIST SpareMemory; + PREPLACE_MAP_MEMORY MapMemory; +} PNP_REPLACE_PARAMETERS, *PPNP_REPLACE_PARAMETERS; + +typedef VOID +(NTAPI *PREPLACE_UNLOAD)( + VOID); + +typedef NTSTATUS +(NTAPI *PREPLACE_BEGIN)( + IN PPNP_REPLACE_PARAMETERS Parameters, + OUT PVOID *Context); + +typedef NTSTATUS +(NTAPI *PREPLACE_END)( + IN PVOID Context); + +typedef NTSTATUS +(NTAPI *PREPLACE_MIRROR_PHYSICAL_MEMORY)( + IN PVOID Context, + IN PHYSICAL_ADDRESS PhysicalAddress, + IN LARGE_INTEGER ByteCount); + +typedef NTSTATUS +(NTAPI *PREPLACE_SET_PROCESSOR_ID)( + IN PVOID Context, + IN ULONG ApicId, + IN BOOLEAN Target); + +typedef NTSTATUS +(NTAPI *PREPLACE_SWAP)( + IN PVOID Context); + +typedef NTSTATUS +(NTAPI *PREPLACE_INITIATE_HARDWARE_MIRROR)( + IN PVOID Context); + +typedef NTSTATUS +(NTAPI *PREPLACE_MIRROR_PLATFORM_MEMORY)( + IN PVOID Context); + +typedef NTSTATUS +(NTAPI *PREPLACE_GET_MEMORY_DESTINATION)( + IN PVOID Context, + IN PHYSICAL_ADDRESS SourceAddress, + OUT PPHYSICAL_ADDRESS DestinationAddress); + +typedef NTSTATUS +(NTAPI *PREPLACE_ENABLE_DISABLE_HARDWARE_QUIESCE)( + IN PVOID Context, + IN BOOLEAN Enable); + +#define PNP_REPLACE_DRIVER_INTERFACE_VERSION 1 +#define PNP_REPLACE_DRIVER_INTERFACE_MINIMUM_SIZE \ + FIELD_OFFSET(PNP_REPLACE_DRIVER_INTERFACE, InitiateHardwareMirror) + +#define PNP_REPLACE_MEMORY_SUPPORTED 0x0001 +#define PNP_REPLACE_PROCESSOR_SUPPORTED 0x0002 +#define PNP_REPLACE_HARDWARE_MEMORY_MIRRORING 0x0004 +#define PNP_REPLACE_HARDWARE_PAGE_COPY 0x0008 +#define PNP_REPLACE_HARDWARE_QUIESCE 0x0010 + +typedef struct _PNP_REPLACE_DRIVER_INTERFACE { + ULONG Size; + ULONG Version; + ULONG Flags; + PREPLACE_UNLOAD Unload; + PREPLACE_BEGIN BeginReplace; + PREPLACE_END EndReplace; + PREPLACE_MIRROR_PHYSICAL_MEMORY MirrorPhysicalMemory; + PREPLACE_SET_PROCESSOR_ID SetProcessorId; + PREPLACE_SWAP Swap; + PREPLACE_INITIATE_HARDWARE_MIRROR InitiateHardwareMirror; + PREPLACE_MIRROR_PLATFORM_MEMORY MirrorPlatformMemory; + PREPLACE_GET_MEMORY_DESTINATION GetMemoryDestination; + PREPLACE_ENABLE_DISABLE_HARDWARE_QUIESCE EnableDisableHardwareQuiesce; +} PNP_REPLACE_DRIVER_INTERFACE, *PPNP_REPLACE_DRIVER_INTERFACE; + +typedef NTSTATUS +(NTAPI *PREPLACE_DRIVER_INIT)( + IN OUT PPNP_REPLACE_DRIVER_INTERFACE Interface, + IN PVOID Unused); + typedef enum _DEVICE_USAGE_NOTIFICATION_TYPE { DeviceUsageTypeUndefined, DeviceUsageTypePaging, @@ -4079,6 +4899,15 @@ typedef enum _IO_NOTIFICATION_EVENT_CATEGORY { EventCategoryTargetDeviceChange } IO_NOTIFICATION_EVENT_CATEGORY; +typedef enum _IO_PRIORITY_HINT { + IoPriorityVeryLow = 0, + IoPriorityLow, + IoPriorityNormal, + IoPriorityHigh, + IoPriorityCritical, + MaxIoPriorityTypes +} IO_PRIORITY_HINT; + #define PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES 0x00000001 typedef NTSTATUS @@ -4155,7 +4984,6 @@ typedef struct _FILE_POSITION_INFORMATION { LARGE_INTEGER CurrentByteOffset; } FILE_POSITION_INFORMATION, *PFILE_POSITION_INFORMATION; -#include typedef struct _FILE_BASIC_INFORMATION { LARGE_INTEGER CreationTime; LARGE_INTEGER LastAccessTime; @@ -4163,7 +4991,32 @@ typedef struct _FILE_BASIC_INFORMATION { LARGE_INTEGER ChangeTime; ULONG FileAttributes; } FILE_BASIC_INFORMATION, *PFILE_BASIC_INFORMATION; -#include + +typedef struct _FILE_IO_PRIORITY_HINT_INFORMATION { + IO_PRIORITY_HINT PriorityHint; +} FILE_IO_PRIORITY_HINT_INFORMATION, *PFILE_IO_PRIORITY_HINT_INFORMATION; + +typedef struct _FILE_IO_COMPLETION_NOTIFICATION_INFORMATION { + ULONG Flags; +} FILE_IO_COMPLETION_NOTIFICATION_INFORMATION, *PFILE_IO_COMPLETION_NOTIFICATION_INFORMATION; + +typedef struct _FILE_IOSTATUSBLOCK_RANGE_INFORMATION { + PUCHAR IoStatusBlockRange; + ULONG Length; +} FILE_IOSTATUSBLOCK_RANGE_INFORMATION, *PFILE_IOSTATUSBLOCK_RANGE_INFORMATION; + +typedef struct _FILE_IS_REMOTE_DEVICE_INFORMATION { + BOOLEAN IsRemote; +} FILE_IS_REMOTE_DEVICE_INFORMATION, *PFILE_IS_REMOTE_DEVICE_INFORMATION; + +typedef struct _FILE_NUMA_NODE_INFORMATION { + USHORT NodeNumber; +} FILE_NUMA_NODE_INFORMATION, *PFILE_NUMA_NODE_INFORMATION; + +typedef struct _FILE_PROCESS_IDS_USING_FILE_INFORMATION { + ULONG NumberOfProcessIdsInList; + ULONG_PTR ProcessIdList[1]; +} FILE_PROCESS_IDS_USING_FILE_INFORMATION, *PFILE_PROCESS_IDS_USING_FILE_INFORMATION; typedef struct _FILE_STANDARD_INFORMATION { LARGE_INTEGER AllocationSize; @@ -4210,49 +5063,30 @@ typedef struct _FILE_FULL_EA_INFORMATION { CHAR EaName[1]; } FILE_FULL_EA_INFORMATION, *PFILE_FULL_EA_INFORMATION; +typedef struct _FILE_SFIO_RESERVE_INFORMATION { + ULONG RequestsPerPeriod; + ULONG Period; + BOOLEAN RetryFailures; + BOOLEAN Discardable; + ULONG RequestSize; + ULONG NumOutstandingRequests; +} FILE_SFIO_RESERVE_INFORMATION, *PFILE_SFIO_RESERVE_INFORMATION; + +typedef struct _FILE_SFIO_VOLUME_INFORMATION { + ULONG MaximumRequestsPerPeriod; + ULONG MinimumPeriod; + ULONG MinimumTransferSize; +} FILE_SFIO_VOLUME_INFORMATION, *PFILE_SFIO_VOLUME_INFORMATION; + +#define FILE_SKIP_COMPLETION_PORT_ON_SUCCESS 0x1 +#define FILE_SKIP_SET_EVENT_ON_HANDLE 0x2 +#define FILE_SKIP_SET_USER_EVENT_ON_FAST_IO 0x4 + #define FM_LOCK_BIT (0x1) #define FM_LOCK_BIT_V (0x0) #define FM_LOCK_WAITER_WOKEN (0x2) #define FM_LOCK_WAITER_INC (0x4) -typedef ULONG_PTR ERESOURCE_THREAD, *PERESOURCE_THREAD; - -typedef struct _OWNER_ENTRY { - ERESOURCE_THREAD OwnerThread; - _ANONYMOUS_UNION union { - LONG OwnerCount; - ULONG TableSize; - } DUMMYUNIONNAME; -} OWNER_ENTRY, *POWNER_ENTRY; - -typedef struct _ERESOURCE -{ - LIST_ENTRY SystemResourcesList; - POWNER_ENTRY OwnerTable; - SHORT ActiveCount; - USHORT Flag; - volatile PKSEMAPHORE SharedWaiters; - volatile PKEVENT ExclusiveWaiters; - OWNER_ENTRY OwnerEntry; - ULONG ActiveEntries; - ULONG ContentionCount; - ULONG NumberOfSharedWaiters; - ULONG NumberOfExclusiveWaiters; - __GNU_EXTENSION union - { - PVOID Address; - ULONG_PTR CreatorBackTraceIndex; - }; - KSPIN_LOCK SpinLock; -} ERESOURCE, *PERESOURCE; - -/* ERESOURCE.Flag */ -#define ResourceNeverExclusive 0x0010 -#define ResourceReleaseByOtherThread 0x0020 -#define ResourceOwnedExclusive 0x0080 - -#define RESOURCE_HASH_TABLE_SIZE 64 - typedef BOOLEAN (NTAPI FAST_IO_CHECK_IF_POSSIBLE)( IN struct _FILE_OBJECT *FileObject, @@ -4796,6 +5630,12 @@ typedef struct _IO_ERROR_LOG_MESSAGE { #define ERROR_LOG_MAXIMUM_SIZE (IO_ERROR_LOG_MESSAGE_LENGTH - \ IO_ERROR_LOG_MESSAGE_HEADER_LENGTH) +#ifdef _WIN64 +#define PORT_MAXIMUM_MESSAGE_LENGTH 512 +#else +#define PORT_MAXIMUM_MESSAGE_LENGTH 256 +#endif + typedef enum _DMA_WIDTH { Width8Bits, Width16Bits, @@ -5252,12 +6092,6 @@ typedef NTSTATUS (NTAPI *PMM_DLL_UNLOAD)( VOID); -typedef BOOLEAN -(NTAPI KSERVICE_ROUTINE)( - IN struct _KINTERRUPT *Interrupt, - IN PVOID ServiceContext); -typedef KSERVICE_ROUTINE *PKSERVICE_ROUTINE; - typedef VOID (NTAPI IO_TIMER_ROUTINE)( IN struct _DEVICE_OBJECT *DeviceObject, @@ -5341,12 +6175,135 @@ typedef enum _DEVICE_TEXT_TYPE { DeviceTextLocationInformation } DEVICE_TEXT_TYPE, *PDEVICE_TEXT_TYPE; -typedef enum _WORK_QUEUE_TYPE { - CriticalWorkQueue, - DelayedWorkQueue, - HyperCriticalWorkQueue, - MaximumWorkQueue -} WORK_QUEUE_TYPE; +typedef BOOLEAN +(NTAPI *PGPE_SERVICE_ROUTINE)( + PVOID, + PVOID); + +typedef NTSTATUS +(NTAPI *PGPE_CONNECT_VECTOR)( + PDEVICE_OBJECT, + ULONG, + KINTERRUPT_MODE, + BOOLEAN, + PGPE_SERVICE_ROUTINE, + PVOID, + PVOID); + +typedef NTSTATUS +(NTAPI *PGPE_DISCONNECT_VECTOR)( + PVOID); + +typedef NTSTATUS +(NTAPI *PGPE_ENABLE_EVENT)( + PDEVICE_OBJECT, + PVOID); + +typedef NTSTATUS +(NTAPI *PGPE_DISABLE_EVENT)( + PDEVICE_OBJECT, + PVOID); + +typedef NTSTATUS +(NTAPI *PGPE_CLEAR_STATUS)( + PDEVICE_OBJECT, + PVOID); + +typedef VOID +(NTAPI *PDEVICE_NOTIFY_CALLBACK)( + PVOID, + ULONG); + +typedef NTSTATUS +(NTAPI *PREGISTER_FOR_DEVICE_NOTIFICATIONS)( + PDEVICE_OBJECT, + PDEVICE_NOTIFY_CALLBACK, + PVOID); + +typedef VOID +(NTAPI *PUNREGISTER_FOR_DEVICE_NOTIFICATIONS)( + PDEVICE_OBJECT, + PDEVICE_NOTIFY_CALLBACK); + +typedef struct _ACPI_INTERFACE_STANDARD { + USHORT Size; + USHORT Version; + PVOID Context; + PINTERFACE_REFERENCE InterfaceReference; + PINTERFACE_DEREFERENCE InterfaceDereference; + PGPE_CONNECT_VECTOR GpeConnectVector; + PGPE_DISCONNECT_VECTOR GpeDisconnectVector; + PGPE_ENABLE_EVENT GpeEnableEvent; + PGPE_DISABLE_EVENT GpeDisableEvent; + PGPE_CLEAR_STATUS GpeClearStatus; + PREGISTER_FOR_DEVICE_NOTIFICATIONS RegisterForDeviceNotifications; + PUNREGISTER_FOR_DEVICE_NOTIFICATIONS UnregisterForDeviceNotifications; +} ACPI_INTERFACE_STANDARD, *PACPI_INTERFACE_STANDARD; + +typedef BOOLEAN +(NTAPI *PGPE_SERVICE_ROUTINE2)( + PVOID ObjectContext, + PVOID ServiceContext); + +typedef NTSTATUS +(NTAPI *PGPE_CONNECT_VECTOR2)( + PVOID Context, + ULONG GpeNumber, + KINTERRUPT_MODE Mode, + BOOLEAN Shareable, + PGPE_SERVICE_ROUTINE ServiceRoutine, + PVOID ServiceContext, + PVOID *ObjectContext); + +typedef NTSTATUS +(NTAPI *PGPE_DISCONNECT_VECTOR2)( + PVOID Context, + PVOID ObjectContext); + +typedef NTSTATUS +(NTAPI *PGPE_ENABLE_EVENT2)( + PVOID Context, + PVOID ObjectContext); + +typedef NTSTATUS +(NTAPI *PGPE_DISABLE_EVENT2)( + PVOID Context, + PVOID ObjectContext); + +typedef NTSTATUS +(NTAPI *PGPE_CLEAR_STATUS2)( + PVOID Context, + PVOID ObjectContext); + +typedef VOID +(NTAPI *PDEVICE_NOTIFY_CALLBACK2)( + PVOID NotificationContext, + ULONG NotifyCode); + +typedef NTSTATUS +(NTAPI *PREGISTER_FOR_DEVICE_NOTIFICATIONS2)( + PVOID Context, + PDEVICE_NOTIFY_CALLBACK2 NotificationHandler, + PVOID NotificationContext); + +typedef VOID +(NTAPI *PUNREGISTER_FOR_DEVICE_NOTIFICATIONS2)( + PVOID Context); + +typedef struct _ACPI_INTERFACE_STANDARD2 { + USHORT Size; + USHORT Version; + PVOID Context; + PINTERFACE_REFERENCE InterfaceReference; + PINTERFACE_DEREFERENCE InterfaceDereference; + PGPE_CONNECT_VECTOR2 GpeConnectVector; + PGPE_DISCONNECT_VECTOR2 GpeDisconnectVector; + PGPE_ENABLE_EVENT2 GpeEnableEvent; + PGPE_DISABLE_EVENT2 GpeDisableEvent; + PGPE_CLEAR_STATUS2 GpeClearStatus; + PREGISTER_FOR_DEVICE_NOTIFICATIONS2 RegisterForDeviceNotifications; + PUNREGISTER_FOR_DEVICE_NOTIFICATIONS2 UnregisterForDeviceNotifications; +} ACPI_INTERFACE_STANDARD2, *PACPI_INTERFACE_STANDARD2; #if !defined(_AMD64_) && !defined(_IA64_) #include @@ -5546,11 +6503,6 @@ typedef struct _IO_STACK_LOCATION { #define SL_INVOKE_ON_SUCCESS 0x40 #define SL_INVOKE_ON_ERROR 0x80 -/* IO_STACK_LOCATION.Parameters.ReadWriteControl.WhichSpace */ - -#define PCI_WHICHSPACE_CONFIG 0x0 -#define PCI_WHICHSPACE_ROM 0x52696350 /* 'PciR' */ - #define METHOD_BUFFERED 0 #define METHOD_IN_DIRECT 1 #define METHOD_OUT_DIRECT 2 @@ -5680,10 +6632,920 @@ typedef struct _IO_STACK_LOCATION { /* end winnt.h */ +#define WMIREG_ACTION_REGISTER 1 +#define WMIREG_ACTION_DEREGISTER 2 +#define WMIREG_ACTION_REREGISTER 3 +#define WMIREG_ACTION_UPDATE_GUIDS 4 +#define WMIREG_ACTION_BLOCK_IRPS 5 + +#define WMIREGISTER 0 +#define WMIUPDATE 1 + +typedef VOID +(NTAPI FWMI_NOTIFICATION_CALLBACK)( + PVOID Wnode, + PVOID Context); +typedef FWMI_NOTIFICATION_CALLBACK *WMI_NOTIFICATION_CALLBACK; + +#ifndef _PCI_X_ +#define _PCI_X_ + +typedef struct _PCI_SLOT_NUMBER { + union { + struct { + ULONG DeviceNumber:5; + ULONG FunctionNumber:3; + ULONG Reserved:24; + } bits; + ULONG AsULONG; + } u; +} PCI_SLOT_NUMBER, *PPCI_SLOT_NUMBER; + +#define PCI_TYPE0_ADDRESSES 6 +#define PCI_TYPE1_ADDRESSES 2 +#define PCI_TYPE2_ADDRESSES 5 + +typedef struct _PCI_COMMON_HEADER { + PCI_COMMON_HEADER_LAYOUT +} PCI_COMMON_HEADER, *PPCI_COMMON_HEADER; + +#ifdef __cplusplus +typedef struct _PCI_COMMON_CONFIG { + PCI_COMMON_HEADER_LAYOUT + UCHAR DeviceSpecific[192]; +} PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG; +#else +typedef struct _PCI_COMMON_CONFIG { + PCI_COMMON_HEADER DUMMYSTRUCTNAME; + UCHAR DeviceSpecific[192]; +} PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG; +#endif + +#define PCI_COMMON_HDR_LENGTH (FIELD_OFFSET(PCI_COMMON_CONFIG, DeviceSpecific)) + +#define PCI_EXTENDED_CONFIG_LENGTH 0x1000 + +#define PCI_MAX_DEVICES 32 +#define PCI_MAX_FUNCTION 8 +#define PCI_MAX_BRIDGE_NUMBER 0xFF +#define PCI_INVALID_VENDORID 0xFFFF + +/* PCI_COMMON_CONFIG.HeaderType */ +#define PCI_MULTIFUNCTION 0x80 +#define PCI_DEVICE_TYPE 0x00 +#define PCI_BRIDGE_TYPE 0x01 +#define PCI_CARDBUS_BRIDGE_TYPE 0x02 + +#define PCI_CONFIGURATION_TYPE(PciData) \ + (((PPCI_COMMON_CONFIG) (PciData))->HeaderType & ~PCI_MULTIFUNCTION) + +#define PCI_MULTIFUNCTION_DEVICE(PciData) \ + ((((PPCI_COMMON_CONFIG) (PciData))->HeaderType & PCI_MULTIFUNCTION) != 0) + +/* PCI_COMMON_CONFIG.Command */ +#define PCI_ENABLE_IO_SPACE 0x0001 +#define PCI_ENABLE_MEMORY_SPACE 0x0002 +#define PCI_ENABLE_BUS_MASTER 0x0004 +#define PCI_ENABLE_SPECIAL_CYCLES 0x0008 +#define PCI_ENABLE_WRITE_AND_INVALIDATE 0x0010 +#define PCI_ENABLE_VGA_COMPATIBLE_PALETTE 0x0020 +#define PCI_ENABLE_PARITY 0x0040 +#define PCI_ENABLE_WAIT_CYCLE 0x0080 +#define PCI_ENABLE_SERR 0x0100 +#define PCI_ENABLE_FAST_BACK_TO_BACK 0x0200 +#define PCI_DISABLE_LEVEL_INTERRUPT 0x0400 + +/* PCI_COMMON_CONFIG.Status */ +#define PCI_STATUS_INTERRUPT_PENDING 0x0008 +#define PCI_STATUS_CAPABILITIES_LIST 0x0010 +#define PCI_STATUS_66MHZ_CAPABLE 0x0020 +#define PCI_STATUS_UDF_SUPPORTED 0x0040 +#define PCI_STATUS_FAST_BACK_TO_BACK 0x0080 +#define PCI_STATUS_DATA_PARITY_DETECTED 0x0100 +#define PCI_STATUS_DEVSEL 0x0600 +#define PCI_STATUS_SIGNALED_TARGET_ABORT 0x0800 +#define PCI_STATUS_RECEIVED_TARGET_ABORT 0x1000 +#define PCI_STATUS_RECEIVED_MASTER_ABORT 0x2000 +#define PCI_STATUS_SIGNALED_SYSTEM_ERROR 0x4000 +#define PCI_STATUS_DETECTED_PARITY_ERROR 0x8000 + +/* IO_STACK_LOCATION.Parameters.ReadWriteControl.WhichSpace */ + +#define PCI_WHICHSPACE_CONFIG 0x0 +#define PCI_WHICHSPACE_ROM 0x52696350 /* 'PciR' */ + +#define PCI_CAPABILITY_ID_POWER_MANAGEMENT 0x01 +#define PCI_CAPABILITY_ID_AGP 0x02 +#define PCI_CAPABILITY_ID_VPD 0x03 +#define PCI_CAPABILITY_ID_SLOT_ID 0x04 +#define PCI_CAPABILITY_ID_MSI 0x05 +#define PCI_CAPABILITY_ID_CPCI_HOTSWAP 0x06 +#define PCI_CAPABILITY_ID_PCIX 0x07 +#define PCI_CAPABILITY_ID_HYPERTRANSPORT 0x08 +#define PCI_CAPABILITY_ID_VENDOR_SPECIFIC 0x09 +#define PCI_CAPABILITY_ID_DEBUG_PORT 0x0A +#define PCI_CAPABILITY_ID_CPCI_RES_CTRL 0x0B +#define PCI_CAPABILITY_ID_SHPC 0x0C +#define PCI_CAPABILITY_ID_P2P_SSID 0x0D +#define PCI_CAPABILITY_ID_AGP_TARGET 0x0E +#define PCI_CAPABILITY_ID_SECURE 0x0F +#define PCI_CAPABILITY_ID_PCI_EXPRESS 0x10 +#define PCI_CAPABILITY_ID_MSIX 0x11 + +typedef struct _PCI_CAPABILITIES_HEADER { + UCHAR CapabilityID; + UCHAR Next; +} PCI_CAPABILITIES_HEADER, *PPCI_CAPABILITIES_HEADER; + +typedef struct _PCI_PMC { + UCHAR Version:3; + UCHAR PMEClock:1; + UCHAR Rsvd1:1; + UCHAR DeviceSpecificInitialization:1; + UCHAR Rsvd2:2; + struct _PM_SUPPORT { + UCHAR Rsvd2:1; + UCHAR D1:1; + UCHAR D2:1; + UCHAR PMED0:1; + UCHAR PMED1:1; + UCHAR PMED2:1; + UCHAR PMED3Hot:1; + UCHAR PMED3Cold:1; + } Support; +} PCI_PMC, *PPCI_PMC; + +typedef struct _PCI_PMCSR { + USHORT PowerState:2; + USHORT Rsvd1:6; + USHORT PMEEnable:1; + USHORT DataSelect:4; + USHORT DataScale:2; + USHORT PMEStatus:1; +} PCI_PMCSR, *PPCI_PMCSR; + +typedef struct _PCI_PMCSR_BSE { + UCHAR Rsvd1:6; + UCHAR D3HotSupportsStopClock:1; + UCHAR BusPowerClockControlEnabled:1; +} PCI_PMCSR_BSE, *PPCI_PMCSR_BSE; + +typedef struct _PCI_PM_CAPABILITY { + PCI_CAPABILITIES_HEADER Header; + union { + PCI_PMC Capabilities; + USHORT AsUSHORT; + } PMC; + union { + PCI_PMCSR ControlStatus; + USHORT AsUSHORT; + } PMCSR; + union { + PCI_PMCSR_BSE BridgeSupport; + UCHAR AsUCHAR; + } PMCSR_BSE; + UCHAR Data; +} PCI_PM_CAPABILITY, *PPCI_PM_CAPABILITY; + +typedef struct { + PCI_CAPABILITIES_HEADER Header; + union { + struct { + USHORT DataParityErrorRecoveryEnable:1; + USHORT EnableRelaxedOrdering:1; + USHORT MaxMemoryReadByteCount:2; + USHORT MaxOutstandingSplitTransactions:3; + USHORT Reserved:9; + } bits; + USHORT AsUSHORT; + } Command; + union { + struct { + ULONG FunctionNumber:3; + ULONG DeviceNumber:5; + ULONG BusNumber:8; + ULONG Device64Bit:1; + ULONG Capable133MHz:1; + ULONG SplitCompletionDiscarded:1; + ULONG UnexpectedSplitCompletion:1; + ULONG DeviceComplexity:1; + ULONG DesignedMaxMemoryReadByteCount:2; + ULONG DesignedMaxOutstandingSplitTransactions:3; + ULONG DesignedMaxCumulativeReadSize:3; + ULONG ReceivedSplitCompletionErrorMessage:1; + ULONG CapablePCIX266:1; + ULONG CapablePCIX533:1; + } bits; + ULONG AsULONG; + } Status; +} PCI_X_CAPABILITY, *PPCI_X_CAPABILITY; + +#define PCI_EXPRESS_ADVANCED_ERROR_REPORTING_CAP_ID 0x0001 +#define PCI_EXPRESS_VIRTUAL_CHANNEL_CAP_ID 0x0002 +#define PCI_EXPRESS_DEVICE_SERIAL_NUMBER_CAP_ID 0x0003 +#define PCI_EXPRESS_POWER_BUDGETING_CAP_ID 0x0004 +#define PCI_EXPRESS_RC_LINK_DECLARATION_CAP_ID 0x0005 +#define PCI_EXPRESS_RC_INTERNAL_LINK_CONTROL_CAP_ID 0x0006 +#define PCI_EXPRESS_RC_EVENT_COLLECTOR_ENDPOINT_ASSOCIATION_CAP_ID 0x0007 +#define PCI_EXPRESS_MFVC_CAP_ID 0x0008 +#define PCI_EXPRESS_VC_AND_MFVC_CAP_ID 0x0009 +#define PCI_EXPRESS_RCRB_HEADER_CAP_ID 0x000A +#define PCI_EXPRESS_SINGLE_ROOT_IO_VIRTUALIZATION_CAP_ID 0x0010 + +typedef struct _PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER { + USHORT CapabilityID; + USHORT Version:4; + USHORT Next:12; +} PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER, *PPCI_EXPRESS_ENHANCED_CAPABILITY_HEADER; + +typedef struct _PCI_EXPRESS_SERIAL_NUMBER_CAPABILITY { + PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header; + ULONG LowSerialNumber; + ULONG HighSerialNumber; +} PCI_EXPRESS_SERIAL_NUMBER_CAPABILITY, *PPCI_EXPRESS_SERIAL_NUMBER_CAPABILITY; + +typedef union _PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS { + struct { + ULONG Undefined:1; + ULONG Reserved1:3; + ULONG DataLinkProtocolError:1; + ULONG SurpriseDownError:1; + ULONG Reserved2:6; + ULONG PoisonedTLP:1; + ULONG FlowControlProtocolError:1; + ULONG CompletionTimeout:1; + ULONG CompleterAbort:1; + ULONG UnexpectedCompletion:1; + ULONG ReceiverOverflow:1; + ULONG MalformedTLP:1; + ULONG ECRCError:1; + ULONG UnsupportedRequestError:1; + ULONG Reserved3:11; + } DUMMYSTRUCTNAME; + ULONG AsULONG; +} PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS, *PPCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS; + +typedef union _PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK { + struct { + ULONG Undefined:1; + ULONG Reserved1:3; + ULONG DataLinkProtocolError:1; + ULONG SurpriseDownError:1; + ULONG Reserved2:6; + ULONG PoisonedTLP:1; + ULONG FlowControlProtocolError:1; + ULONG CompletionTimeout:1; + ULONG CompleterAbort:1; + ULONG UnexpectedCompletion:1; + ULONG ReceiverOverflow:1; + ULONG MalformedTLP:1; + ULONG ECRCError:1; + ULONG UnsupportedRequestError:1; + ULONG Reserved3:11; + } DUMMYSTRUCTNAME; + ULONG AsULONG; +} PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK, *PPCI_EXPRESS_UNCORRECTABLE_ERROR_MASK; + +typedef union _PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY { + struct { + ULONG Undefined:1; + ULONG Reserved1:3; + ULONG DataLinkProtocolError:1; + ULONG SurpriseDownError:1; + ULONG Reserved2:6; + ULONG PoisonedTLP:1; + ULONG FlowControlProtocolError:1; + ULONG CompletionTimeout:1; + ULONG CompleterAbort:1; + ULONG UnexpectedCompletion:1; + ULONG ReceiverOverflow:1; + ULONG MalformedTLP:1; + ULONG ECRCError:1; + ULONG UnsupportedRequestError:1; + ULONG Reserved3:11; + } DUMMYSTRUCTNAME; + ULONG AsULONG; +} PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY, *PPCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY; + +typedef union _PCI_EXPRESS_CORRECTABLE_ERROR_STATUS { + struct { + ULONG ReceiverError:1; + ULONG Reserved1:5; + ULONG BadTLP:1; + ULONG BadDLLP:1; + ULONG ReplayNumRollover:1; + ULONG Reserved2:3; + ULONG ReplayTimerTimeout:1; + ULONG AdvisoryNonFatalError:1; + ULONG Reserved3:18; + } DUMMYSTRUCTNAME; + ULONG AsULONG; +} PCI_EXPRESS_CORRECTABLE_ERROR_STATUS, *PPCI_CORRECTABLE_ERROR_STATUS; + +typedef union _PCI_EXPRESS_CORRECTABLE_ERROR_MASK { + struct { + ULONG ReceiverError:1; + ULONG Reserved1:5; + ULONG BadTLP:1; + ULONG BadDLLP:1; + ULONG ReplayNumRollover:1; + ULONG Reserved2:3; + ULONG ReplayTimerTimeout:1; + ULONG AdvisoryNonFatalError:1; + ULONG Reserved3:18; + } DUMMYSTRUCTNAME; + ULONG AsULONG; +} PCI_EXPRESS_CORRECTABLE_ERROR_MASK, *PPCI_CORRECTABLE_ERROR_MASK; + +typedef union _PCI_EXPRESS_AER_CAPABILITIES { + struct { + ULONG FirstErrorPointer:5; + ULONG ECRCGenerationCapable:1; + ULONG ECRCGenerationEnable:1; + ULONG ECRCCheckCapable:1; + ULONG ECRCCheckEnable:1; + ULONG Reserved:23; + } DUMMYSTRUCTNAME; + ULONG AsULONG; +} PCI_EXPRESS_AER_CAPABILITIES, *PPCI_EXPRESS_AER_CAPABILITIES; + +typedef union _PCI_EXPRESS_ROOT_ERROR_COMMAND { + struct { + ULONG CorrectableErrorReportingEnable:1; + ULONG NonFatalErrorReportingEnable:1; + ULONG FatalErrorReportingEnable:1; + ULONG Reserved:29; + } DUMMYSTRUCTNAME; + ULONG AsULONG; +} PCI_EXPRESS_ROOT_ERROR_COMMAND, *PPCI_EXPRESS_ROOT_ERROR_COMMAND; + +typedef union _PCI_EXPRESS_ROOT_ERROR_STATUS { + struct { + ULONG CorrectableErrorReceived:1; + ULONG MultipleCorrectableErrorsReceived:1; + ULONG UncorrectableErrorReceived:1; + ULONG MultipleUncorrectableErrorsReceived:1; + ULONG FirstUncorrectableFatal:1; + ULONG NonFatalErrorMessagesReceived:1; + ULONG FatalErrorMessagesReceived:1; + ULONG Reserved:20; + ULONG AdvancedErrorInterruptMessageNumber:5; + } DUMMYSTRUCTNAME; + ULONG AsULONG; +} PCI_EXPRESS_ROOT_ERROR_STATUS, *PPCI_EXPRESS_ROOT_ERROR_STATUS; + +typedef union _PCI_EXPRESS_ERROR_SOURCE_ID { + struct { + USHORT CorrectableSourceIdFun:3; + USHORT CorrectableSourceIdDev:5; + USHORT CorrectableSourceIdBus:8; + USHORT UncorrectableSourceIdFun:3; + USHORT UncorrectableSourceIdDev:5; + USHORT UncorrectableSourceIdBus:8; + } DUMMYSTRUCTNAME; + ULONG AsULONG; +} PCI_EXPRESS_ERROR_SOURCE_ID, *PPCI_EXPRESS_ERROR_SOURCE_ID; + +typedef union _PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS { + struct { + ULONG TargetAbortOnSplitCompletion:1; + ULONG MasterAbortOnSplitCompletion:1; + ULONG ReceivedTargetAbort:1; + ULONG ReceivedMasterAbort:1; + ULONG RsvdZ:1; + ULONG UnexpectedSplitCompletionError:1; + ULONG UncorrectableSplitCompletion:1; + ULONG UncorrectableDataError:1; + ULONG UncorrectableAttributeError:1; + ULONG UncorrectableAddressError:1; + ULONG DelayedTransactionDiscardTimerExpired:1; + ULONG PERRAsserted:1; + ULONG SERRAsserted:1; + ULONG InternalBridgeError:1; + ULONG Reserved:18; + } DUMMYSTRUCTNAME; + ULONG AsULONG; +} PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS, *PPCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS; + +typedef union _PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK { + struct { + ULONG TargetAbortOnSplitCompletion:1; + ULONG MasterAbortOnSplitCompletion:1; + ULONG ReceivedTargetAbort:1; + ULONG ReceivedMasterAbort:1; + ULONG RsvdZ:1; + ULONG UnexpectedSplitCompletionError:1; + ULONG UncorrectableSplitCompletion:1; + ULONG UncorrectableDataError:1; + ULONG UncorrectableAttributeError:1; + ULONG UncorrectableAddressError:1; + ULONG DelayedTransactionDiscardTimerExpired:1; + ULONG PERRAsserted:1; + ULONG SERRAsserted:1; + ULONG InternalBridgeError:1; + ULONG Reserved:18; + } DUMMYSTRUCTNAME; + ULONG AsULONG; +} PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK, *PPCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK; + +typedef union _PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY { + struct { + ULONG TargetAbortOnSplitCompletion:1; + ULONG MasterAbortOnSplitCompletion:1; + ULONG ReceivedTargetAbort:1; + ULONG ReceivedMasterAbort:1; + ULONG RsvdZ:1; + ULONG UnexpectedSplitCompletionError:1; + ULONG UncorrectableSplitCompletion:1; + ULONG UncorrectableDataError:1; + ULONG UncorrectableAttributeError:1; + ULONG UncorrectableAddressError:1; + ULONG DelayedTransactionDiscardTimerExpired:1; + ULONG PERRAsserted:1; + ULONG SERRAsserted:1; + ULONG InternalBridgeError:1; + ULONG Reserved:18; + } DUMMYSTRUCTNAME; + ULONG AsULONG; +} PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY, *PPCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY; + +typedef union _PCI_EXPRESS_SEC_AER_CAPABILITIES { + struct { + ULONG SecondaryUncorrectableFirstErrorPtr:5; + ULONG Reserved:27; + } DUMMYSTRUCTNAME; + ULONG AsULONG; +} PCI_EXPRESS_SEC_AER_CAPABILITIES, *PPCI_EXPRESS_SEC_AER_CAPABILITIES; + +#define ROOT_CMD_ENABLE_CORRECTABLE_ERROR_REPORTING 0x00000001 +#define ROOT_CMD_ENABLE_NONFATAL_ERROR_REPORTING 0x00000002 +#define ROOT_CMD_ENABLE_FATAL_ERROR_REPORTING 0x00000004 + +#define ROOT_CMD_ERROR_REPORTING_ENABLE_MASK \ + (ROOT_CMD_ENABLE_FATAL_ERROR_REPORTING | \ + ROOT_CMD_ENABLE_NONFATAL_ERROR_REPORTING | \ + ROOT_CMD_ENABLE_CORRECTABLE_ERROR_REPORTING) + +typedef struct _PCI_EXPRESS_AER_CAPABILITY { + PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header; + PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS UncorrectableErrorStatus; + PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK UncorrectableErrorMask; + PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY UncorrectableErrorSeverity; + PCI_EXPRESS_CORRECTABLE_ERROR_STATUS CorrectableErrorStatus; + PCI_EXPRESS_CORRECTABLE_ERROR_MASK CorrectableErrorMask; + PCI_EXPRESS_AER_CAPABILITIES CapabilitiesAndControl; + ULONG HeaderLog[4]; + PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS SecUncorrectableErrorStatus; + PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK SecUncorrectableErrorMask; + PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY SecUncorrectableErrorSeverity; + PCI_EXPRESS_SEC_AER_CAPABILITIES SecCapabilitiesAndControl; + ULONG SecHeaderLog[4]; +} PCI_EXPRESS_AER_CAPABILITY, *PPCI_EXPRESS_AER_CAPABILITY; + +typedef struct _PCI_EXPRESS_ROOTPORT_AER_CAPABILITY { + PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header; + PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS UncorrectableErrorStatus; + PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK UncorrectableErrorMask; + PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY UncorrectableErrorSeverity; + PCI_EXPRESS_CORRECTABLE_ERROR_STATUS CorrectableErrorStatus; + PCI_EXPRESS_CORRECTABLE_ERROR_MASK CorrectableErrorMask; + PCI_EXPRESS_AER_CAPABILITIES CapabilitiesAndControl; + ULONG HeaderLog[4]; + PCI_EXPRESS_ROOT_ERROR_COMMAND RootErrorCommand; + PCI_EXPRESS_ROOT_ERROR_STATUS RootErrorStatus; + PCI_EXPRESS_ERROR_SOURCE_ID ErrorSourceId; +} PCI_EXPRESS_ROOTPORT_AER_CAPABILITY, *PPCI_EXPRESS_ROOTPORT_AER_CAPABILITY; + +typedef struct _PCI_EXPRESS_BRIDGE_AER_CAPABILITY { + PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header; + PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS UncorrectableErrorStatus; + PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK UncorrectableErrorMask; + PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY UncorrectableErrorSeverity; + PCI_EXPRESS_CORRECTABLE_ERROR_STATUS CorrectableErrorStatus; + PCI_EXPRESS_CORRECTABLE_ERROR_MASK CorrectableErrorMask; + PCI_EXPRESS_AER_CAPABILITIES CapabilitiesAndControl; + ULONG HeaderLog[4]; + PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS SecUncorrectableErrorStatus; + PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK SecUncorrectableErrorMask; + PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY SecUncorrectableErrorSeverity; + PCI_EXPRESS_SEC_AER_CAPABILITIES SecCapabilitiesAndControl; + ULONG SecHeaderLog[4]; +} PCI_EXPRESS_BRIDGE_AER_CAPABILITY, *PPCI_EXPRESS_BRIDGE_AER_CAPABILITY; + +typedef union _PCI_EXPRESS_SRIOV_CAPS { + struct { + ULONG VFMigrationCapable:1; + ULONG Reserved1:20; + ULONG VFMigrationInterruptNumber:11; + } DUMMYSTRUCTNAME; + ULONG AsULONG; +} PCI_EXPRESS_SRIOV_CAPS, *PPCI_EXPRESS_SRIOV_CAPS; + +typedef union _PCI_EXPRESS_SRIOV_CONTROL { + struct { + USHORT VFEnable:1; + USHORT VFMigrationEnable:1; + USHORT VFMigrationInterruptEnable:1; + USHORT VFMemorySpaceEnable:1; + USHORT ARICapableHierarchy:1; + USHORT Reserved1:11; + } DUMMYSTRUCTNAME; + USHORT AsUSHORT; +} PCI_EXPRESS_SRIOV_CONTROL, *PPCI_EXPRESS_SRIOV_CONTROL; + +typedef union _PCI_EXPRESS_SRIOV_STATUS { + struct { + USHORT VFMigrationStatus:1; + USHORT Reserved1:15; + } DUMMYSTRUCTNAME; + USHORT AsUSHORT; +} PCI_EXPRESS_SRIOV_STATUS, *PPCI_EXPRESS_SRIOV_STATUS; + +typedef union _PCI_EXPRESS_SRIOV_MIGRATION_STATE_ARRAY { + struct { + ULONG VFMigrationStateBIR:3; + ULONG VFMigrationStateOffset:29; + } DUMMYSTRUCTNAME; + ULONG AsULONG; +} PCI_EXPRESS_SRIOV_MIGRATION_STATE_ARRAY, *PPCI_EXPRESS_SRIOV_MIGRATION_STATE_ARRAY; + +typedef struct _PCI_EXPRESS_SRIOV_CAPABILITY { + PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header; + PCI_EXPRESS_SRIOV_CAPS SRIOVCapabilities; + PCI_EXPRESS_SRIOV_CONTROL SRIOVControl; + PCI_EXPRESS_SRIOV_STATUS SRIOVStatus; + USHORT InitialVFs; + USHORT TotalVFs; + USHORT NumVFs; + UCHAR FunctionDependencyLink; + UCHAR RsvdP1; + USHORT FirstVFOffset; + USHORT VFStride; + USHORT RsvdP2; + USHORT VFDeviceId; + ULONG SupportedPageSizes; + ULONG SystemPageSize; + ULONG BaseAddresses[PCI_TYPE0_ADDRESSES]; + PCI_EXPRESS_SRIOV_MIGRATION_STATE_ARRAY VFMigrationStateArrayOffset; +} PCI_EXPRESS_SRIOV_CAPABILITY, *PPCI_EXPRESS_SRIOV_CAPABILITY; + +/* PCI device classes */ +#define PCI_CLASS_PRE_20 0x00 +#define PCI_CLASS_MASS_STORAGE_CTLR 0x01 +#define PCI_CLASS_NETWORK_CTLR 0x02 +#define PCI_CLASS_DISPLAY_CTLR 0x03 +#define PCI_CLASS_MULTIMEDIA_DEV 0x04 +#define PCI_CLASS_MEMORY_CTLR 0x05 +#define PCI_CLASS_BRIDGE_DEV 0x06 +#define PCI_CLASS_SIMPLE_COMMS_CTLR 0x07 +#define PCI_CLASS_BASE_SYSTEM_DEV 0x08 +#define PCI_CLASS_INPUT_DEV 0x09 +#define PCI_CLASS_DOCKING_STATION 0x0a +#define PCI_CLASS_PROCESSOR 0x0b +#define PCI_CLASS_SERIAL_BUS_CTLR 0x0c +#define PCI_CLASS_WIRELESS_CTLR 0x0d +#define PCI_CLASS_INTELLIGENT_IO_CTLR 0x0e +#define PCI_CLASS_SATELLITE_COMMS_CTLR 0x0f +#define PCI_CLASS_ENCRYPTION_DECRYPTION 0x10 +#define PCI_CLASS_DATA_ACQ_SIGNAL_PROC 0x11 +#define PCI_CLASS_NOT_DEFINED 0xff + +/* PCI device subclasses for class 0 */ +#define PCI_SUBCLASS_PRE_20_NON_VGA 0x00 +#define PCI_SUBCLASS_PRE_20_VGA 0x01 + +/* PCI device subclasses for class 1 (mass storage controllers)*/ +#define PCI_SUBCLASS_MSC_SCSI_BUS_CTLR 0x00 +#define PCI_SUBCLASS_MSC_IDE_CTLR 0x01 +#define PCI_SUBCLASS_MSC_FLOPPY_CTLR 0x02 +#define PCI_SUBCLASS_MSC_IPI_CTLR 0x03 +#define PCI_SUBCLASS_MSC_RAID_CTLR 0x04 +#define PCI_SUBCLASS_MSC_OTHER 0x80 + +/* PCI device subclasses for class 2 (network controllers)*/ +#define PCI_SUBCLASS_NET_ETHERNET_CTLR 0x00 +#define PCI_SUBCLASS_NET_TOKEN_RING_CTLR 0x01 +#define PCI_SUBCLASS_NET_FDDI_CTLR 0x02 +#define PCI_SUBCLASS_NET_ATM_CTLR 0x03 +#define PCI_SUBCLASS_NET_ISDN_CTLR 0x04 +#define PCI_SUBCLASS_NET_OTHER 0x80 + +/* PCI device subclasses for class 3 (display controllers)*/ +#define PCI_SUBCLASS_VID_VGA_CTLR 0x00 +#define PCI_SUBCLASS_VID_XGA_CTLR 0x01 +#define PCI_SUBCLASS_VID_3D_CTLR 0x02 +#define PCI_SUBCLASS_VID_OTHER 0x80 + +/* PCI device subclasses for class 4 (multimedia device)*/ +#define PCI_SUBCLASS_MM_VIDEO_DEV 0x00 +#define PCI_SUBCLASS_MM_AUDIO_DEV 0x01 +#define PCI_SUBCLASS_MM_TELEPHONY_DEV 0x02 +#define PCI_SUBCLASS_MM_OTHER 0x80 + +/* PCI device subclasses for class 5 (memory controller)*/ +#define PCI_SUBCLASS_MEM_RAM 0x00 +#define PCI_SUBCLASS_MEM_FLASH 0x01 +#define PCI_SUBCLASS_MEM_OTHER 0x80 + +/* PCI device subclasses for class 6 (bridge device)*/ +#define PCI_SUBCLASS_BR_HOST 0x00 +#define PCI_SUBCLASS_BR_ISA 0x01 +#define PCI_SUBCLASS_BR_EISA 0x02 +#define PCI_SUBCLASS_BR_MCA 0x03 +#define PCI_SUBCLASS_BR_PCI_TO_PCI 0x04 +#define PCI_SUBCLASS_BR_PCMCIA 0x05 +#define PCI_SUBCLASS_BR_NUBUS 0x06 +#define PCI_SUBCLASS_BR_CARDBUS 0x07 +#define PCI_SUBCLASS_BR_RACEWAY 0x08 +#define PCI_SUBCLASS_BR_OTHER 0x80 + +#define PCI_SUBCLASS_COM_SERIAL 0x00 +#define PCI_SUBCLASS_COM_PARALLEL 0x01 +#define PCI_SUBCLASS_COM_MULTIPORT 0x02 +#define PCI_SUBCLASS_COM_MODEM 0x03 +#define PCI_SUBCLASS_COM_OTHER 0x80 + +#define PCI_SUBCLASS_SYS_INTERRUPT_CTLR 0x00 +#define PCI_SUBCLASS_SYS_DMA_CTLR 0x01 +#define PCI_SUBCLASS_SYS_SYSTEM_TIMER 0x02 +#define PCI_SUBCLASS_SYS_REAL_TIME_CLOCK 0x03 +#define PCI_SUBCLASS_SYS_GEN_HOTPLUG_CTLR 0x04 +#define PCI_SUBCLASS_SYS_SDIO_CTRL 0x05 +#define PCI_SUBCLASS_SYS_OTHER 0x80 + +#define PCI_SUBCLASS_INP_KEYBOARD 0x00 +#define PCI_SUBCLASS_INP_DIGITIZER 0x01 +#define PCI_SUBCLASS_INP_MOUSE 0x02 +#define PCI_SUBCLASS_INP_SCANNER 0x03 +#define PCI_SUBCLASS_INP_GAMEPORT 0x04 +#define PCI_SUBCLASS_INP_OTHER 0x80 + +#define PCI_SUBCLASS_DOC_GENERIC 0x00 +#define PCI_SUBCLASS_DOC_OTHER 0x80 + +#define PCI_SUBCLASS_PROC_386 0x00 +#define PCI_SUBCLASS_PROC_486 0x01 +#define PCI_SUBCLASS_PROC_PENTIUM 0x02 +#define PCI_SUBCLASS_PROC_ALPHA 0x10 +#define PCI_SUBCLASS_PROC_POWERPC 0x20 +#define PCI_SUBCLASS_PROC_COPROCESSOR 0x40 + +/* PCI device subclasses for class C (serial bus controller)*/ +#define PCI_SUBCLASS_SB_IEEE1394 0x00 +#define PCI_SUBCLASS_SB_ACCESS 0x01 +#define PCI_SUBCLASS_SB_SSA 0x02 +#define PCI_SUBCLASS_SB_USB 0x03 +#define PCI_SUBCLASS_SB_FIBRE_CHANNEL 0x04 +#define PCI_SUBCLASS_SB_SMBUS 0x05 + +#define PCI_SUBCLASS_WIRELESS_IRDA 0x00 +#define PCI_SUBCLASS_WIRELESS_CON_IR 0x01 +#define PCI_SUBCLASS_WIRELESS_RF 0x10 +#define PCI_SUBCLASS_WIRELESS_OTHER 0x80 + +#define PCI_SUBCLASS_INTIO_I2O 0x00 + +#define PCI_SUBCLASS_SAT_TV 0x01 +#define PCI_SUBCLASS_SAT_AUDIO 0x02 +#define PCI_SUBCLASS_SAT_VOICE 0x03 +#define PCI_SUBCLASS_SAT_DATA 0x04 + +#define PCI_SUBCLASS_CRYPTO_NET_COMP 0x00 +#define PCI_SUBCLASS_CRYPTO_ENTERTAINMENT 0x10 +#define PCI_SUBCLASS_CRYPTO_OTHER 0x80 + +#define PCI_SUBCLASS_DASP_DPIO 0x00 +#define PCI_SUBCLASS_DASP_OTHER 0x80 + +#define PCI_ADDRESS_IO_SPACE 0x00000001 +#define PCI_ADDRESS_MEMORY_TYPE_MASK 0x00000006 +#define PCI_ADDRESS_MEMORY_PREFETCHABLE 0x00000008 +#define PCI_ADDRESS_IO_ADDRESS_MASK 0xfffffffc +#define PCI_ADDRESS_MEMORY_ADDRESS_MASK 0xfffffff0 +#define PCI_ADDRESS_ROM_ADDRESS_MASK 0xfffff800 + +#define PCI_TYPE_32BIT 0 +#define PCI_TYPE_20BIT 2 +#define PCI_TYPE_64BIT 4 + +#define PCI_ROMADDRESS_ENABLED 0x00000001 + +#endif /* _PCI_X_ */ + +#define PCI_EXPRESS_LINK_QUIESCENT_INTERFACE_VERSION 1 + +typedef NTSTATUS +(NTAPI PCI_EXPRESS_ENTER_LINK_QUIESCENT_MODE)( + IN OUT PVOID Context); +typedef PCI_EXPRESS_ENTER_LINK_QUIESCENT_MODE *PPCI_EXPRESS_ENTER_LINK_QUIESCENT_MODE; + +typedef NTSTATUS +(NTAPI PCI_EXPRESS_EXIT_LINK_QUIESCENT_MODE)( + IN OUT PVOID Context); +typedef PCI_EXPRESS_EXIT_LINK_QUIESCENT_MODE *PPCI_EXPRESS_EXIT_LINK_QUIESCENT_MODE; + +typedef struct _PCI_EXPRESS_LINK_QUIESCENT_INTERFACE { + USHORT Size; + USHORT Version; + PVOID Context; + PINTERFACE_REFERENCE InterfaceReference; + PINTERFACE_DEREFERENCE InterfaceDereference; + PPCI_EXPRESS_ENTER_LINK_QUIESCENT_MODE PciExpressEnterLinkQuiescentMode; + PPCI_EXPRESS_EXIT_LINK_QUIESCENT_MODE PciExpressExitLinkQuiescentMode; +} PCI_EXPRESS_LINK_QUIESCENT_INTERFACE, *PPCI_EXPRESS_LINK_QUIESCENT_INTERFACE; + +#define PCI_EXPRESS_ROOT_PORT_INTERFACE_VERSION 1 + +typedef ULONG +(NTAPI *PPCI_EXPRESS_ROOT_PORT_READ_CONFIG_SPACE)( + IN PVOID Context, + OUT PVOID Buffer, + IN ULONG Offset, + IN ULONG Length); + +typedef ULONG +(NTAPI *PPCI_EXPRESS_ROOT_PORT_WRITE_CONFIG_SPACE)( + IN PVOID Context, + IN PVOID Buffer, + IN ULONG Offset, + IN ULONG Length); + +typedef struct _PCI_EXPRESS_ROOT_PORT_INTERFACE { + USHORT Size; + USHORT Version; + PVOID Context; + PINTERFACE_REFERENCE InterfaceReference; + PINTERFACE_DEREFERENCE InterfaceDereference; + PPCI_EXPRESS_ROOT_PORT_READ_CONFIG_SPACE ReadConfigSpace; + PPCI_EXPRESS_ROOT_PORT_WRITE_CONFIG_SPACE WriteConfigSpace; +} PCI_EXPRESS_ROOT_PORT_INTERFACE, *PPCI_EXPRESS_ROOT_PORT_INTERFACE; + +#define PCI_MSIX_TABLE_CONFIG_INTERFACE_VERSION 1 + +typedef NTSTATUS +(NTAPI PCI_MSIX_SET_ENTRY)( + IN PVOID Context, + IN ULONG TableEntry, + IN ULONG MessageNumber); +typedef PCI_MSIX_SET_ENTRY *PPCI_MSIX_SET_ENTRY; + +typedef NTSTATUS +(NTAPI PCI_MSIX_MASKUNMASK_ENTRY)( + IN PVOID Context, + IN ULONG TableEntry); +typedef PCI_MSIX_MASKUNMASK_ENTRY *PPCI_MSIX_MASKUNMASK_ENTRY; + +typedef NTSTATUS +(NTAPI PCI_MSIX_GET_ENTRY)( + IN PVOID Context, + IN ULONG TableEntry, + OUT PULONG MessageNumber, + OUT PBOOLEAN Masked); +typedef PCI_MSIX_GET_ENTRY *PPCI_MSIX_GET_ENTRY; + +typedef NTSTATUS +(NTAPI PCI_MSIX_GET_TABLE_SIZE)( + IN PVOID Context, + OUT PULONG TableSize); +typedef PCI_MSIX_GET_TABLE_SIZE *PPCI_MSIX_GET_TABLE_SIZE; + +typedef struct _PCI_MSIX_TABLE_CONFIG_INTERFACE { + USHORT Size; + USHORT Version; + PVOID Context; + PINTERFACE_REFERENCE InterfaceReference; + PINTERFACE_DEREFERENCE InterfaceDereference; + PPCI_MSIX_SET_ENTRY SetTableEntry; + PPCI_MSIX_MASKUNMASK_ENTRY MaskTableEntry; + PPCI_MSIX_MASKUNMASK_ENTRY UnmaskTableEntry; + PPCI_MSIX_GET_ENTRY GetTableEntry; + PPCI_MSIX_GET_TABLE_SIZE GetTableSize; +} PCI_MSIX_TABLE_CONFIG_INTERFACE, *PPCI_MSIX_TABLE_CONFIG_INTERFACE; + +#define PCI_MSIX_TABLE_CONFIG_MINIMUM_SIZE \ + RTL_SIZEOF_THROUGH_FIELD(PCI_MSIX_TABLE_CONFIG_INTERFACE, UnmaskTableEntry) + /****************************************************************************** * Object Manager Types * ******************************************************************************/ +#define MAXIMUM_FILENAME_LENGTH 256 +#define OBJ_NAME_PATH_SEPARATOR ((WCHAR)L'\\') + +#define OBJECT_TYPE_CREATE 0x0001 +#define OBJECT_TYPE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1) + +#define DIRECTORY_QUERY 0x0001 +#define DIRECTORY_TRAVERSE 0x0002 +#define DIRECTORY_CREATE_OBJECT 0x0004 +#define DIRECTORY_CREATE_SUBDIRECTORY 0x0008 +#define DIRECTORY_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0xF) + +#define SYMBOLIC_LINK_QUERY 0x0001 +#define SYMBOLIC_LINK_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1) + +#define DUPLICATE_CLOSE_SOURCE 0x00000001 +#define DUPLICATE_SAME_ACCESS 0x00000002 +#define DUPLICATE_SAME_ATTRIBUTES 0x00000004 + +#define OB_FLT_REGISTRATION_VERSION_0100 0x0100 +#define OB_FLT_REGISTRATION_VERSION OB_FLT_REGISTRATION_VERSION_0100 + +typedef ULONG OB_OPERATION; + +#define OB_OPERATION_HANDLE_CREATE 0x00000001 +#define OB_OPERATION_HANDLE_DUPLICATE 0x00000002 + +typedef struct _OB_PRE_CREATE_HANDLE_INFORMATION { + IN OUT ACCESS_MASK DesiredAccess; + IN ACCESS_MASK OriginalDesiredAccess; +} OB_PRE_CREATE_HANDLE_INFORMATION, *POB_PRE_CREATE_HANDLE_INFORMATION; + +typedef struct _OB_PRE_DUPLICATE_HANDLE_INFORMATION { + IN OUT ACCESS_MASK DesiredAccess; + IN ACCESS_MASK OriginalDesiredAccess; + IN PVOID SourceProcess; + IN PVOID TargetProcess; +} OB_PRE_DUPLICATE_HANDLE_INFORMATION, *POB_PRE_DUPLICATE_HANDLE_INFORMATION; + +typedef union _OB_PRE_OPERATION_PARAMETERS { + IN OUT OB_PRE_CREATE_HANDLE_INFORMATION CreateHandleInformation; + IN OUT OB_PRE_DUPLICATE_HANDLE_INFORMATION DuplicateHandleInformation; +} OB_PRE_OPERATION_PARAMETERS, *POB_PRE_OPERATION_PARAMETERS; + +typedef struct _OB_PRE_OPERATION_INFORMATION { + IN OB_OPERATION Operation; + union { + IN ULONG Flags; + struct { + IN ULONG KernelHandle:1; + IN ULONG Reserved:31; + }; + }; + IN PVOID Object; + IN POBJECT_TYPE ObjectType; + OUT PVOID CallContext; + IN POB_PRE_OPERATION_PARAMETERS Parameters; +} OB_PRE_OPERATION_INFORMATION, *POB_PRE_OPERATION_INFORMATION; + +typedef struct _OB_POST_CREATE_HANDLE_INFORMATION { + IN ACCESS_MASK GrantedAccess; +} OB_POST_CREATE_HANDLE_INFORMATION, *POB_POST_CREATE_HANDLE_INFORMATION; + +typedef struct _OB_POST_DUPLICATE_HANDLE_INFORMATION { + IN ACCESS_MASK GrantedAccess; +} OB_POST_DUPLICATE_HANDLE_INFORMATION, *POB_POST_DUPLICATE_HANDLE_INFORMATION; + +typedef union _OB_POST_OPERATION_PARAMETERS { + IN OB_POST_CREATE_HANDLE_INFORMATION CreateHandleInformation; + IN OB_POST_DUPLICATE_HANDLE_INFORMATION DuplicateHandleInformation; +} OB_POST_OPERATION_PARAMETERS, *POB_POST_OPERATION_PARAMETERS; + +typedef struct _OB_POST_OPERATION_INFORMATION { + IN OB_OPERATION Operation; + union { + IN ULONG Flags; + struct { + IN ULONG KernelHandle:1; + IN ULONG Reserved:31; + }; + }; + IN PVOID Object; + IN POBJECT_TYPE ObjectType; + IN PVOID CallContext; + IN NTSTATUS ReturnStatus; + IN POB_POST_OPERATION_PARAMETERS Parameters; +} OB_POST_OPERATION_INFORMATION,*POB_POST_OPERATION_INFORMATION; + +typedef enum _OB_PREOP_CALLBACK_STATUS { + OB_PREOP_SUCCESS +} OB_PREOP_CALLBACK_STATUS, *POB_PREOP_CALLBACK_STATUS; + +typedef OB_PREOP_CALLBACK_STATUS +(NTAPI *POB_PRE_OPERATION_CALLBACK)( + IN PVOID RegistrationContext, + IN OUT POB_PRE_OPERATION_INFORMATION OperationInformation); + +typedef VOID +(NTAPI *POB_POST_OPERATION_CALLBACK)( + IN PVOID RegistrationContext, + IN POB_POST_OPERATION_INFORMATION OperationInformation); + +typedef struct _OB_OPERATION_REGISTRATION { + IN POBJECT_TYPE *ObjectType; + IN OB_OPERATION Operations; + IN POB_PRE_OPERATION_CALLBACK PreOperation; + IN POB_POST_OPERATION_CALLBACK PostOperation; +} OB_OPERATION_REGISTRATION, *POB_OPERATION_REGISTRATION; + +typedef struct _OB_CALLBACK_REGISTRATION { + IN USHORT Version; + IN USHORT OperationRegistrationCount; + IN UNICODE_STRING Altitude; + IN PVOID RegistrationContext; + IN OB_OPERATION_REGISTRATION *OperationRegistration; +} OB_CALLBACK_REGISTRATION, *POB_CALLBACK_REGISTRATION; + typedef struct _OBJECT_NAME_INFORMATION { UNICODE_STRING Name; } OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION; @@ -5708,16 +7570,6 @@ extern POBJECT_TYPE NTSYSAPI PsProcessType; #define QUOTA_LIMITS_HARDWS_MAX_DISABLE 0x00000008 #define QUOTA_LIMITS_USE_DEFAULT_LIMITS 0x00000010 -/* Process Qoutas */ -typedef struct _QUOTA_LIMITS { - SIZE_T PagedPoolLimit; - SIZE_T NonPagedPoolLimit; - SIZE_T MinimumWorkingSetSize; - SIZE_T MaximumWorkingSetSize; - SIZE_T PagefileLimit; - LARGE_INTEGER TimeLimit; -} QUOTA_LIMITS, *PQUOTA_LIMITS; - /* Thread Access Rights */ #define THREAD_TERMINATE 0x0001 #define THREAD_SUSPEND_RESUME 0x0002 @@ -5742,18 +7594,76 @@ typedef struct _QUOTA_LIMITS { #define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3FF) #endif -#define ES_SYSTEM_REQUIRED 0x00000001 -#define ES_DISPLAY_REQUIRED 0x00000002 -#define ES_USER_PRESENT 0x00000004 -#define ES_CONTINUOUS 0x80000000 - #define LOW_PRIORITY 0 #define LOW_REALTIME_PRIORITY 16 #define HIGH_PRIORITY 31 #define MAXIMUM_PRIORITY 32 -#ifdef _X86_ +/****************************************************************************** + * WMI Library Support Types * + ******************************************************************************/ + +#ifdef RUN_WPP +#include +#include +#endif + +#ifndef _TRACEHANDLE_DEFINED +#define _TRACEHANDLE_DEFINED +typedef ULONG64 TRACEHANDLE, *PTRACEHANDLE; +#endif + +#ifndef TRACE_INFORMATION_CLASS_DEFINE + +typedef struct _ETW_TRACE_SESSION_SETTINGS { + ULONG Version; + ULONG BufferSize; + ULONG MinimumBuffers; + ULONG MaximumBuffers; + ULONG LoggerMode; + ULONG FlushTimer; + ULONG FlushThreshold; + ULONG ClockType; +} ETW_TRACE_SESSION_SETTINGS, *PETW_TRACE_SESSION_SETTINGS; + +typedef enum _TRACE_INFORMATION_CLASS { + TraceIdClass, + TraceHandleClass, + TraceEnableFlagsClass, + TraceEnableLevelClass, + GlobalLoggerHandleClass, + EventLoggerHandleClass, + AllLoggerHandlesClass, + TraceHandleByNameClass, + LoggerEventsLostClass, + TraceSessionSettingsClass, + LoggerEventsLoggedClass, + MaxTraceInformationClass +} TRACE_INFORMATION_CLASS; + +#endif /* TRACE_INFORMATION_CLASS_DEFINE */ + +#ifndef _ETW_KM_ +#define _ETW_KM_ +#endif + +#include + +typedef VOID +(NTAPI *PETWENABLECALLBACK)( + IN LPCGUID SourceId, + IN ULONG ControlCode, + IN UCHAR Level, + IN ULONGLONG MatchAnyKeyword, + IN ULONGLONG MatchAllKeyword, + IN PEVENT_FILTER_DESCRIPTOR FilterData OPTIONAL, + IN OUT PVOID CallbackContext OPTIONAL); + +#define EVENT_WRITE_FLAG_NO_FAULTING 0x00000001 + + +#if defined(_M_IX86) /** Kernel definitions for x86 **/ /* Interrupt request levels */ @@ -5914,11 +7824,346 @@ _KeQueryTickCount( } #define KeQueryTickCount(CurrentCount) _KeQueryTickCount(CurrentCount) -#endif /* _X86_ */ +#elif defined(_M_AMD64) +/** Kernel definitions for AMD64 **/ + +/* Interrupt request levels */ +#define PASSIVE_LEVEL 0 +#define LOW_LEVEL 0 +#define APC_LEVEL 1 +#define DISPATCH_LEVEL 2 +#define CMCI_LEVEL 5 +#define CLOCK_LEVEL 13 +#define IPI_LEVEL 14 +#define DRS_LEVEL 14 +#define POWER_LEVEL 14 +#define PROFILE_LEVEL 15 +#define HIGH_LEVEL 15 + +#define KI_USER_SHARED_DATA 0xFFFFF78000000000ULL +#define SharedUserData ((PKUSER_SHARED_DATA const)KI_USER_SHARED_DATA) +#define SharedInterruptTime (KI_USER_SHARED_DATA + 0x8) +#define SharedSystemTime (KI_USER_SHARED_DATA + 0x14) +#define SharedTickCount (KI_USER_SHARED_DATA + 0x320) + +#define PAGE_SIZE 0x1000 +#define PAGE_SHIFT 12L + +#define EFLAG_SIGN 0x8000 +#define EFLAG_ZERO 0x4000 +#define EFLAG_SELECT (EFLAG_SIGN | EFLAG_ZERO) + +#define RESULT_NEGATIVE ((EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT) +#define RESULT_ZERO ((~EFLAG_SIGN & EFLAG_ZERO) & EFLAG_SELECT) +#define RESULT_POSITIVE ((~EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT) + + +typedef struct _KFLOATING_SAVE { + ULONG Dummy; +} KFLOATING_SAVE, *PKFLOATING_SAVE; + +typedef XSAVE_FORMAT XMM_SAVE_AREA32, *PXMM_SAVE_AREA32; + +#define KeQueryInterruptTime() \ + (*(volatile ULONG64*)SharedInterruptTime) + +#define KeQuerySystemTime(CurrentCount) \ + *(ULONG64*)(CurrentCount) = *(volatile ULONG64*)SharedSystemTime + +#define KeQueryTickCount(CurrentCount) \ + *(ULONG64*)(CurrentCount) = *(volatile ULONG64*)SharedTickCount + +#define KeGetDcacheFillSize() 1L + +#define YieldProcessor _mm_pause + +FORCEINLINE +KIRQL +KeGetCurrentIrql(VOID) +{ + return (KIRQL)__readcr8(); +} + +FORCEINLINE +VOID +KeLowerIrql(IN KIRQL NewIrql) +{ + //ASSERT(KeGetCurrentIrql() >= NewIrql); + __writecr8(NewIrql); +} + +FORCEINLINE +KIRQL +KfRaiseIrql(IN KIRQL NewIrql) +{ + KIRQL OldIrql; + + OldIrql = __readcr8(); + //ASSERT(OldIrql <= NewIrql); + __writecr8(NewIrql); + return OldIrql; +} +#define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a) + +FORCEINLINE +KIRQL +KeRaiseIrqlToDpcLevel(VOID) +{ + return KfRaiseIrql(DISPATCH_LEVEL); +} + +FORCEINLINE +KIRQL +KeRaiseIrqlToSynchLevel(VOID) +{ + return KfRaiseIrql(12); // SYNCH_LEVEL = IPI_LEVEL - 2 + } + +FORCEINLINE +PKTHREAD +KeGetCurrentThread(VOID) +{ + return (struct _KTHREAD *)__readgsqword(0x188); +} + +/* VOID + * KeFlushIoBuffers( + * IN PMDL Mdl, + * IN BOOLEAN ReadOperation, + * IN BOOLEAN DmaOperation) + */ +#define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation) + +/* x86 and x64 performs a 0x2C interrupt */ +#define DbgRaiseAssertionFailure __int2c + +#elif defined(_M_IA64) +/** Kernel definitions for IA64 **/ + +/* Interrupt request levels */ +#define PASSIVE_LEVEL 0 +#define LOW_LEVEL 0 +#define APC_LEVEL 1 +#define DISPATCH_LEVEL 2 +#define CMC_LEVEL 3 +#define DEVICE_LEVEL_BASE 4 +#define PC_LEVEL 12 +#define IPI_LEVEL 14 +#define DRS_LEVEL 14 +#define CLOCK_LEVEL 13 +#define POWER_LEVEL 15 +#define PROFILE_LEVEL 15 +#define HIGH_LEVEL 15 + +#define KI_USER_SHARED_DATA ((ULONG_PTR)(KADDRESS_BASE + 0xFFFE0000)) +extern volatile LARGE_INTEGER KeTickCount; + +#define PAUSE_PROCESSOR __yield(); + +FORCEINLINE +VOID +KeFlushWriteBuffer(VOID) +{ + __mf (); + return; +} + +NTSYSAPI +PKTHREAD +NTAPI +KeGetCurrentThread(VOID); + + +#elif defined(_M_PPC) + +/* Interrupt request levels */ +#define PASSIVE_LEVEL 0 +#define LOW_LEVEL 0 +#define APC_LEVEL 1 +#define DISPATCH_LEVEL 2 +#define PROFILE_LEVEL 27 +#define CLOCK1_LEVEL 28 +#define CLOCK2_LEVEL 28 +#define IPI_LEVEL 29 +#define POWER_LEVEL 30 +#define HIGH_LEVEL 31 + +// +// Used to contain PFNs and PFN counts +// +typedef ULONG PFN_COUNT; +typedef ULONG PFN_NUMBER, *PPFN_NUMBER; +typedef LONG SPFN_NUMBER, *PSPFN_NUMBER; + + +typedef struct _KFLOATING_SAVE { + ULONG Dummy; +} KFLOATING_SAVE, *PKFLOATING_SAVE; + +typedef struct _KPCR_TIB { + PVOID ExceptionList; /* 00 */ + PVOID StackBase; /* 04 */ + PVOID StackLimit; /* 08 */ + PVOID SubSystemTib; /* 0C */ + _ANONYMOUS_UNION union { + PVOID FiberData; /* 10 */ + ULONG Version; /* 10 */ + } DUMMYUNIONNAME; + PVOID ArbitraryUserPointer; /* 14 */ + struct _KPCR_TIB *Self; /* 18 */ +} KPCR_TIB, *PKPCR_TIB; /* 1C */ + +#define PCR_MINOR_VERSION 1 +#define PCR_MAJOR_VERSION 1 + +typedef struct _KPCR { + KPCR_TIB Tib; /* 00 */ + struct _KPCR *Self; /* 1C */ + struct _KPRCB *Prcb; /* 20 */ + KIRQL Irql; /* 24 */ + ULONG IRR; /* 28 */ + ULONG IrrActive; /* 2C */ + ULONG IDR; /* 30 */ + PVOID KdVersionBlock; /* 34 */ + PUSHORT IDT; /* 38 */ + PUSHORT GDT; /* 3C */ + struct _KTSS *TSS; /* 40 */ + USHORT MajorVersion; /* 44 */ + USHORT MinorVersion; /* 46 */ + KAFFINITY SetMember; /* 48 */ + ULONG StallScaleFactor; /* 4C */ + UCHAR SpareUnused; /* 50 */ + UCHAR Number; /* 51 */ +} KPCR, *PKPCR; /* 54 */ + +#define KeGetPcr() PCR + +#define YieldProcessor() __asm__ __volatile__("nop"); + +FORCEINLINE +ULONG +NTAPI +KeGetCurrentProcessorNumber(VOID) +{ + ULONG Number; + __asm__ __volatile__ ( + "lwz %0, %c1(12)\n" + : "=r" (Number) + : "i" (FIELD_OFFSET(KPCR, Number)) + ); + return Number; +} + +NTHALAPI +VOID +FASTCALL +KfLowerIrql( + IN KIRQL NewIrql); +#define KeLowerIrql(a) KfLowerIrql(a) + +NTHALAPI +KIRQL +FASTCALL +KfRaiseIrql( + IN KIRQL NewIrql); +#define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a) + +NTHALAPI +KIRQL +NTAPI +KeRaiseIrqlToDpcLevel(VOID); + +NTHALAPI +KIRQL +NTAPI +KeRaiseIrqlToSynchLevel(VOID); + + + +#elif defined(_M_MIPS) +#error MIPS Headers are totally incorrect + +// +// Used to contain PFNs and PFN counts +// +typedef ULONG PFN_COUNT; +typedef ULONG PFN_NUMBER, *PPFN_NUMBER; +typedef LONG SPFN_NUMBER, *PSPFN_NUMBER; + +#define PASSIVE_LEVEL 0 +#define APC_LEVEL 1 +#define DISPATCH_LEVEL 2 +#define PROFILE_LEVEL 27 +#define IPI_LEVEL 29 +#define HIGH_LEVEL 31 + +typedef struct _KPCR { + struct _KPRCB *Prcb; /* 20 */ + KIRQL Irql; /* 24 */ + ULONG IRR; /* 28 */ + ULONG IDR; /* 30 */ +} KPCR, *PKPCR; + +#define KeGetPcr() PCR + +typedef struct _KFLOATING_SAVE { +} KFLOATING_SAVE, *PKFLOATING_SAVE; + +static __inline +ULONG +NTAPI +KeGetCurrentProcessorNumber(VOID) +{ + return 0; +} + +#define YieldProcessor() __asm__ __volatile__("nop"); + +#define KeLowerIrql(a) KfLowerIrql(a) +#define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a) + +NTKERNELAPI +VOID +NTAPI +KfLowerIrql( + IN KIRQL NewIrql); + +NTKERNELAPI +KIRQL +NTAPI +KfRaiseIrql( + IN KIRQL NewIrql); + +NTKERNELAPI +KIRQL +NTAPI +KeRaiseIrqlToDpcLevel(VOID); + +NTKERNELAPI +KIRQL +NTAPI +KeRaiseIrqlToSynchLevel(VOID); + + +#elif defined(_M_ARM) +#include +#else +#error Unknown Architecture +#endif + +/****************************************************************************** + * Runtime Library Functions * + ******************************************************************************/ + + +#if !defined(MIDL_PASS) && !defined(SORTPP_PASS) + +#define RTL_STATIC_LIST_HEAD(x) LIST_ENTRY x = { &x, &x } + FORCEINLINE VOID InitializeListHead( @@ -5927,34 +8172,6 @@ InitializeListHead( ListHead->Flink = ListHead->Blink = ListHead; } -FORCEINLINE -VOID -InsertHeadList( - IN OUT PLIST_ENTRY ListHead, - IN OUT PLIST_ENTRY Entry) -{ - PLIST_ENTRY OldFlink; - OldFlink = ListHead->Flink; - Entry->Flink = OldFlink; - Entry->Blink = ListHead; - OldFlink->Blink = Entry; - ListHead->Flink = Entry; -} - -FORCEINLINE -VOID -InsertTailList( - IN OUT PLIST_ENTRY ListHead, - IN OUT PLIST_ENTRY Entry) -{ - PLIST_ENTRY OldBlink; - OldBlink = ListHead->Blink; - Entry->Flink = ListHead; - Entry->Blink = OldBlink; - OldBlink->Flink = Entry; - ListHead->Blink = Entry; -} - BOOLEAN FORCEINLINE IsListEmpty( @@ -5963,29 +8180,6 @@ IsListEmpty( return (BOOLEAN)(ListHead->Flink == ListHead); } -FORCEINLINE -PSINGLE_LIST_ENTRY -PopEntryList( - IN OUT PSINGLE_LIST_ENTRY ListHead) -{ - PSINGLE_LIST_ENTRY FirstEntry; - FirstEntry = ListHead->Next; - if (FirstEntry != NULL) { - ListHead->Next = FirstEntry->Next; - } - return FirstEntry; -} - -FORCEINLINE -VOID -PushEntryList( - IN OUT PSINGLE_LIST_ENTRY ListHead, - IN OUT PSINGLE_LIST_ENTRY Entry) -{ - Entry->Next = ListHead->Next; - ListHead->Next = Entry; -} - FORCEINLINE BOOLEAN RemoveEntryList( @@ -6031,6 +8225,73 @@ RemoveTailList( return Entry; } +FORCEINLINE +VOID +InsertTailList( + IN OUT PLIST_ENTRY ListHead, + IN OUT PLIST_ENTRY Entry) +{ + PLIST_ENTRY OldBlink; + OldBlink = ListHead->Blink; + Entry->Flink = ListHead; + Entry->Blink = OldBlink; + OldBlink->Flink = Entry; + ListHead->Blink = Entry; +} + +FORCEINLINE +VOID +InsertHeadList( + IN OUT PLIST_ENTRY ListHead, + IN OUT PLIST_ENTRY Entry) +{ + PLIST_ENTRY OldFlink; + OldFlink = ListHead->Flink; + Entry->Flink = OldFlink; + Entry->Blink = ListHead; + OldFlink->Blink = Entry; + ListHead->Flink = Entry; +} + +FORCEINLINE +VOID +AppendTailList( + IN OUT PLIST_ENTRY ListHead, + IN OUT PLIST_ENTRY ListToAppend) +{ + PLIST_ENTRY ListEnd = ListHead->Blink; + + ListHead->Blink->Flink = ListToAppend; + ListHead->Blink = ListToAppend->Blink; + ListToAppend->Blink->Flink = ListHead; + ListToAppend->Blink = ListEnd; +} + +FORCEINLINE +PSINGLE_LIST_ENTRY +PopEntryList( + IN OUT PSINGLE_LIST_ENTRY ListHead) +{ + PSINGLE_LIST_ENTRY FirstEntry; + FirstEntry = ListHead->Next; + if (FirstEntry != NULL) { + ListHead->Next = FirstEntry->Next; + } + return FirstEntry; +} + +FORCEINLINE +VOID +PushEntryList( + IN OUT PSINGLE_LIST_ENTRY ListHead, + IN OUT PSINGLE_LIST_ENTRY Entry) +{ + Entry->Next = ListHead->Next; + ListHead->Next = Entry; +} + +#endif /* !defined(MIDL_PASS) && !defined(SORTPP_PASS) */ + NTSYSAPI VOID NTAPI @@ -6391,15 +8652,6 @@ RtlFindSetBitsAndClear( IN ULONG NumberToFind, IN ULONG HintIndex); -NTSYSAPI -NTSTATUS -NTAPI -RtlHashUnicodeString( - IN CONST UNICODE_STRING *String, - IN BOOLEAN CaseInSensitive, - IN ULONG HashAlgorithm, - OUT PULONG HashValue); - NTSYSAPI VOID NTAPI @@ -6489,49 +8741,10 @@ RtlQueryRegistryValues( #define LONGLONG_MASK (LONGLONG_SIZE - 1) #define LOWBYTE_MASK 0x00FF -/* VOID - * RtlRetrieveUlong( - * PULONG DestinationAddress, - * PULONG SourceAddress); - */ -#if defined(_AMD64_) -#define RtlRetrieveUlong(DestAddress,SrcAddress) \ - *(ULONG UNALIGNED *)(DestAddress) = *(PULONG)(SrcAddress) -#else -#define RtlRetrieveUlong(DestAddress,SrcAddress) \ - if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \ - { \ - ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \ - ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \ - ((PUCHAR)(DestAddress))[2]=((PUCHAR)(SrcAddress))[2]; \ - ((PUCHAR)(DestAddress))[3]=((PUCHAR)(SrcAddress))[3]; \ - } \ - else \ - { \ - *((PULONG)(DestAddress))=*((PULONG)(SrcAddress)); \ - } -#endif - -/* VOID - * RtlRetrieveUshort( - * PUSHORT DestinationAddress, - * PUSHORT SourceAddress); - */ -#if defined(_AMD64_) -#define RtlRetrieveUshort(DestAddress,SrcAddress) \ - *(USHORT UNALIGNED *)(DestAddress) = *(USHORT)(SrcAddress) -#else -#define RtlRetrieveUshort(DestAddress,SrcAddress) \ - if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \ - { \ - ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \ - ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \ - } \ - else \ - { \ - *((PUSHORT)(DestAddress))=*((PUSHORT)(SrcAddress)); \ - } -#endif +#define FIRSTBYTE(VALUE) ((VALUE) & LOWBYTE_MASK) +#define SECONDBYTE(VALUE) (((VALUE) >> 8) & LOWBYTE_MASK) +#define THIRDBYTE(VALUE) (((VALUE) >> 16) & LOWBYTE_MASK) +#define FOURTHBYTE(VALUE) (((VALUE) >> 24) & LOWBYTE_MASK) NTSYSAPI VOID @@ -6610,17 +8823,7 @@ RtlSetDaclSecurityDescriptor( else { \ *((PULONG)(Address)) = (ULONG) (Value); \ } -#endif -/* VOID - * RtlStoreUlonglong( - * IN OUT PULONGLONG Address, - * ULONGLONG Value); - */ -#if defined(_AMD64_) -#define RtlStoreUlonglong(Address,Value) \ - *(ULONGLONG UNALIGNED *)(Address) = (Value) -#else #define RtlStoreUlonglong(Address,Value) \ if ((ULONG_PTR)(Address) & LONGLONG_MASK) { \ RtlStoreUlong((ULONG_PTR)(Address), \ @@ -6630,30 +8833,7 @@ RtlSetDaclSecurityDescriptor( } else { \ *((PULONGLONG)(Address)) = (ULONGLONG)(Value); \ } -#endif -/* VOID - * RtlStoreUlongPtr( - * IN OUT PULONG_PTR Address, - * IN ULONG_PTR Value); - */ -#ifdef _WIN64 -#define RtlStoreUlongPtr(Address,Value) \ - RtlStoreUlonglong(Address,Value) -#else -#define RtlStoreUlongPtr(Address,Value) \ - RtlStoreUlong(Address,Value) -#endif - -/* VOID - * RtlStoreUshort( - * IN PUSHORT Address, - * IN USHORT Value); - */ -#if defined(_AMD64_) -#define RtlStoreUshort(Address,Value) \ - *(USHORT UNALIGNED *)(Address) = (Value) -#else #define RtlStoreUshort(Address,Value) \ if ((ULONG_PTR)(Address) & SHORT_MASK) { \ ((PUCHAR) (Address))[SHORT_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \ @@ -6662,7 +8842,44 @@ RtlSetDaclSecurityDescriptor( else { \ *((PUSHORT) (Address)) = (USHORT)Value; \ } -#endif + +#define RtlRetrieveUshort(DestAddress,SrcAddress) \ + if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \ + { \ + ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \ + ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \ + } \ + else \ + { \ + *((PUSHORT)(DestAddress))=*((PUSHORT)(SrcAddress)); \ + } + +#define RtlRetrieveUlong(DestAddress,SrcAddress) \ + if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \ + { \ + ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \ + ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \ + ((PUCHAR)(DestAddress))[2]=((PUCHAR)(SrcAddress))[2]; \ + ((PUCHAR)(DestAddress))[3]=((PUCHAR)(SrcAddress))[3]; \ + } \ + else \ + { \ + *((PULONG)(DestAddress))=*((PULONG)(SrcAddress)); \ + } + +#endif /* defined(_AMD64_) */ + +#ifdef _WIN64 +/* VOID + * RtlStoreUlongPtr( + * IN OUT PULONG_PTR Address, + * IN ULONG_PTR Value); + */ +#define RtlStoreUlongPtr(Address,Value) RtlStoreUlonglong(Address,Value) +#else +#define RtlStoreUlongPtr(Address,Value) RtlStoreUlong(Address,Value) +#endif /* _WIN64 */ + NTSYSAPI BOOLEAN @@ -6928,6 +9145,34 @@ RtlConvertUlongToLargeInteger( return ret; } +//DECLSPEC_DEPRECATED_DDK_WINXP +static __inline +LARGE_INTEGER +NTAPI_INLINE +RtlLargeIntegerShiftLeft( + IN LARGE_INTEGER LargeInteger, + IN CCHAR ShiftCount) +{ + LARGE_INTEGER Result; + + Result.QuadPart = LargeInteger.QuadPart << ShiftCount; + return Result; +} + +//DECLSPEC_DEPRECATED_DDK_WINXP +static __inline +LARGE_INTEGER +NTAPI_INLINE +RtlLargeIntegerShiftRight( + IN LARGE_INTEGER LargeInteger, + IN CCHAR ShiftCount) +{ + LARGE_INTEGER Result; + + Result.QuadPart = (ULONG64)LargeInteger.QuadPart >> ShiftCount; + return Result; +} + //DECLSPEC_DEPRECATED_DDK static __inline ULONG @@ -6942,6 +9187,33 @@ RtlEnlargedUnsignedDivide( return (ULONG)(Dividend.QuadPart / Divisor); } +//DECLSPEC_DEPRECATED_DDK +static __inline +LARGE_INTEGER +NTAPI_INLINE +RtlLargeIntegerNegate( + IN LARGE_INTEGER Subtrahend) +{ + LARGE_INTEGER Difference; + + Difference.QuadPart = -Subtrahend.QuadPart; + return Difference; +} + +//DECLSPEC_DEPRECATED_DDK +static __inline +LARGE_INTEGER +NTAPI_INLINE +RtlLargeIntegerSubtract( + IN LARGE_INTEGER Minuend, + IN LARGE_INTEGER Subtrahend) +{ + LARGE_INTEGER Difference; + + Difference.QuadPart = Minuend.QuadPart - Subtrahend.QuadPart; + return Difference; +} + //DECLSPEC_DEPRECATED_DDK static __inline LARGE_INTEGER @@ -7220,6 +9492,10 @@ RtlCheckBit( (__annotation(L"Debug", L"AssertFail", msg), \ DbgRaiseAssertionFailure(), FALSE) : TRUE) +#define NT_VERIFY NT_ASSERT +#define NT_VERIFYMSG NT_ASSERTMSG +#define NT_VERIFYMSGW NT_ASSERTMSGW + #else /* GCC doesn't support __annotation (nor PDB) */ @@ -7246,8 +9522,8 @@ RtlCheckBit( #define RTL_SOFT_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE) #define NT_ASSERT(exp) ((VOID)0) -#define NT_ASSERTMSG(exp) ((VOID)0) -#define NT_ASSERTMSGW(exp) ((VOID)0) +#define NT_ASSERTMSG(msg, exp) ((VOID)0) +#define NT_ASSERTMSGW(msg, exp) ((VOID)0) #define NT_VERIFY(_exp) ((_exp) ? TRUE : FALSE) #define NT_VERIFYMSG(_msg, _exp ) ((_exp) ? TRUE : FALSE) @@ -7334,16 +9610,61 @@ InterlockedPushEntrySList( #endif /* !defined(_WINBASE_) */ +#define RTL_CONTEXT_EX_OFFSET(ContextEx, Chunk) ((ContextEx)->Chunk.Offset) +#define RTL_CONTEXT_EX_LENGTH(ContextEx, Chunk) ((ContextEx)->Chunk.Length) +#define RTL_CONTEXT_EX_CHUNK(Base, Layout, Chunk) \ + ((PVOID)((PCHAR)(Base) + RTL_CONTEXT_EX_OFFSET(Layout, Chunk))) +#define RTL_CONTEXT_OFFSET(Context, Chunk) \ + RTL_CONTEXT_EX_OFFSET((PCONTEXT_EX)(Context + 1), Chunk) +#define RTL_CONTEXT_LENGTH(Context, Chunk) \ + RTL_CONTEXT_EX_LENGTH((PCONTEXT_EX)(Context + 1), Chunk) +#define RTL_CONTEXT_CHUNK(Context, Chunk) \ + RTL_CONTEXT_EX_CHUNK((PCONTEXT_EX)(Context + 1), \ + (PCONTEXT_EX)(Context + 1), \ + Chunk) + +BOOLEAN +RTLVERLIB_DDI(RtlIsNtDdiVersionAvailable)( + IN ULONG Version); + +BOOLEAN +RTLVERLIB_DDI(RtlIsServicePackVersionInstalled)( + IN ULONG Version); + +#ifndef RtlIsNtDdiVersionAvailable +#define RtlIsNtDdiVersionAvailable WdmlibRtlIsNtDdiVersionAvailable +#endif + +#ifndef RtlIsServicePackVersionInstalled +#define RtlIsServicePackVersionInstalled WdmlibRtlIsServicePackVersionInstalled +#endif + +#define RtlInterlockedSetBits(Flags, Flag) \ + InterlockedOr((PLONG)(Flags), Flag) + +#define RtlInterlockedAndBits(Flags, Flag) \ + InterlockedAnd((PLONG)(Flags), Flag) + +#define RtlInterlockedClearBits(Flags, Flag) \ + RtlInterlockedAndBits(Flags, ~(Flag)) + +#define RtlInterlockedXorBits(Flags, Flag) \ + InterlockedXor(Flags, Flag) + +#define RtlInterlockedSetBitsDiscardReturn(Flags, Flag) \ + (VOID) RtlInterlockedSetBits(Flags, Flag) + +#define RtlInterlockedAndBitsDiscardReturn(Flags, Flag) \ + (VOID) RtlInterlockedAndBits(Flags, Flag) + +#define RtlInterlockedClearBitsDiscardReturn(Flags, Flag) \ + RtlInterlockedAndBitsDiscardReturn(Flags, ~(Flag)) + + /****************************************************************************** * Kernel Functions * ******************************************************************************/ -NTHALAPI -KIRQL -NTAPI -KeGetCurrentIrql( - VOID); - NTKERNELAPI VOID NTAPI @@ -8230,6 +10551,22 @@ KeFlushWriteBuffer(VOID); #define ALIGN_UP_POINTER(ptr, type) \ ALIGN_UP_POINTER_BY(ptr, sizeof(type)) +#ifndef FIELD_OFFSET +#define FIELD_OFFSET(type, field) ((ULONG)&(((type *)0)->field)) +#endif + +#ifndef FIELD_SIZE +#define FIELD_SIZE(type, field) (sizeof(((type *)0)->field)) +#endif + +#define POOL_TAGGING 1 + +#if DBG +#define IF_DEBUG if (TRUE) +#else +#define IF_DEBUG if (FALSE) +#endif /* DBG */ + /* ULONG * BYTE_OFFSET( * IN PVOID Va) @@ -8242,7 +10579,7 @@ KeFlushWriteBuffer(VOID); * IN ULONG Size) */ #define BYTES_TO_PAGES(Size) \ - (((Size) >> PAGE_SHIFT) + (((Size) & (PAGE_SIZE - 1)) != 0)) + (((Size) + PAGE_SIZE - 1) >> PAGE_SHIFT) /* PVOID * PAGE_ALIGN( @@ -8536,7 +10873,16 @@ MmUnmapLockedPages( IN PVOID BaseAddress, IN PMDL MemoryDescriptorList); - +NTKERNELAPI +PVOID +NTAPI +MmAllocateContiguousMemorySpecifyCacheNode( + IN SIZE_T NumberOfBytes, + IN PHYSICAL_ADDRESS LowestAcceptableAddress, + IN PHYSICAL_ADDRESS HighestAcceptableAddress, + IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL, + IN MEMORY_CACHING_TYPE CacheType, + IN NODE_REQUIREMENT PreferredNode); #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ @@ -8593,6 +10939,22 @@ MmUnmapReservedMapping( IN ULONG PoolTag, IN PMDL MemoryDescriptorList); +NTKERNELAPI +NTSTATUS +NTAPI +MmAddVerifierThunks( + IN PVOID ThunkBuffer, + IN ULONG ThunkBufferSize); + +#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ + +#if (NTDDI_VERSION >= NTDDI_WS03) +NTKERNELAPI +LOGICAL +NTAPI +MmIsIoSpaceActive( + IN PHYSICAL_ADDRESS StartAddress, + IN SIZE_T NumberOfBytes); #endif #if (NTDDI_VERSION >= NTDDI_WS03SP1) @@ -8821,6 +11183,40 @@ CmGetBoundTransaction( * I/O Manager Functions * ******************************************************************************/ + +/* + * NTSTATUS + * IoAcquireRemoveLock( + * IN PIO_REMOVE_LOCK RemoveLock, + * IN OPTIONAL PVOID Tag) + */ +#if DBG +#define IoAcquireRemoveLock(RemoveLock, Tag) \ + IoAcquireRemoveLockEx(RemoveLock, Tag, __FILE__, __LINE__, sizeof (IO_REMOVE_LOCK)) +#else +#define IoAcquireRemoveLock(RemoveLock, Tag) \ + IoAcquireRemoveLockEx(RemoveLock, Tag, "", 1, sizeof (IO_REMOVE_LOCK)) +#endif + +/* + * VOID + * IoAdjustPagingPathCount( + * IN PLONG Count, + * IN BOOLEAN Increment) + */ +#define IoAdjustPagingPathCount(_Count, \ + _Increment) \ +{ \ + if (_Increment) \ + { \ + InterlockedIncrement(_Count); \ + } \ + else \ + { \ + InterlockedDecrement(_Count); \ + } \ +} + #if !defined(_M_AMD64) NTHALAPI VOID @@ -9347,43 +11743,6 @@ IoAcquireRemoveLockEx( IN PCSTR File, IN ULONG Line, IN ULONG RemlockSize); -#endif - -/* - * NTSTATUS - * IoAcquireRemoveLock( - * IN PIO_REMOVE_LOCK RemoveLock, - * IN OPTIONAL PVOID Tag) - */ -#if DBG -#define IoAcquireRemoveLock(RemoveLock, Tag) \ - IoAcquireRemoveLockEx(RemoveLock, Tag, __FILE__, __LINE__, sizeof (IO_REMOVE_LOCK)) -#else -#define IoAcquireRemoveLock(RemoveLock, Tag) \ - IoAcquireRemoveLockEx(RemoveLock, Tag, "", 1, sizeof (IO_REMOVE_LOCK)) -#endif - -/* - * VOID - * IoAdjustPagingPathCount( - * IN PLONG Count, - * IN BOOLEAN Increment) - */ -#define IoAdjustPagingPathCount(_Count, \ - _Increment) \ -{ \ - if (_Increment) \ - { \ - InterlockedIncrement(_Count); \ - } \ - else \ - { \ - InterlockedDecrement(_Count); \ - } \ -} - -#if (NTDDI_VERSION >= NTDDI_WIN2K) - NTKERNELAPI NTSTATUS NTAPI @@ -10179,9 +12538,237 @@ IoWMISetSingleItem( IN ULONG Version, IN ULONG ValueBufferSize, IN PVOID ValueBuffer); +#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ +#if (NTDDI_VERSION >= NTDDI_WINXPSP1) +NTKERNELAPI +NTSTATUS +NTAPI +IoValidateDeviceIoControlAccess( + IN PIRP Irp, + IN ULONG RequiredAccess); #endif +#if (NTDDI_VERSION >= NTDDI_WS03) + +NTKERNELAPI +NTSTATUS +NTAPI +IoCsqInitializeEx( + IN PIO_CSQ Csq, + IN PIO_CSQ_INSERT_IRP_EX CsqInsertIrp, + IN PIO_CSQ_REMOVE_IRP CsqRemoveIrp, + IN PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp, + IN PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock, + IN PIO_CSQ_RELEASE_LOCK CsqReleaseLock, + IN PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp); + +NTKERNELAPI +NTSTATUS +NTAPI +IoCsqInsertIrpEx( + IN PIO_CSQ Csq, + IN PIRP Irp, + IN PIO_CSQ_IRP_CONTEXT Context OPTIONAL, + IN PVOID InsertContext OPTIONAL); +#endif /* (NTDDI_VERSION >= NTDDI_WS03) */ + + +#if (NTDDI_VERSION >= NTDDI_VISTA) + +NTKERNELAPI +NTSTATUS +NTAPI +IoGetBootDiskInformationLite( + OUT PBOOTDISK_INFORMATION_LITE *BootDiskInformation); + +NTKERNELAPI +NTSTATUS +NTAPI +IoCheckShareAccessEx( + IN ACCESS_MASK DesiredAccess, + IN ULONG DesiredShareAccess, + IN OUT PFILE_OBJECT FileObject, + IN OUT PSHARE_ACCESS ShareAccess, + IN BOOLEAN Update, + IN PBOOLEAN WritePermission); + +NTKERNELAPI +NTSTATUS +NTAPI +IoConnectInterruptEx( + IN OUT PIO_CONNECT_INTERRUPT_PARAMETERS Parameters); + +NTKERNELAPI +VOID +NTAPI +IoDisconnectInterruptEx( + IN PIO_DISCONNECT_INTERRUPT_PARAMETERS Parameters); + +LOGICAL +NTAPI +IoWithinStackLimits( + IN ULONG_PTR RegionStart, + IN SIZE_T RegionSize); + +NTKERNELAPI +VOID +NTAPI +IoSetShareAccessEx( + IN ACCESS_MASK DesiredAccess, + IN ULONG DesiredShareAccess, + IN OUT PFILE_OBJECT FileObject, + OUT PSHARE_ACCESS ShareAccess, + IN PBOOLEAN WritePermission); + +ULONG +NTAPI +IoSizeofWorkItem(VOID); + +VOID +NTAPI +IoInitializeWorkItem( + IN PVOID IoObject, + IN PIO_WORKITEM IoWorkItem); + +VOID +NTAPI +IoUninitializeWorkItem( + IN PIO_WORKITEM IoWorkItem); + +VOID +NTAPI +IoQueueWorkItemEx( + IN PIO_WORKITEM IoWorkItem, + IN PIO_WORKITEM_ROUTINE_EX WorkerRoutine, + IN WORK_QUEUE_TYPE QueueType, + IN PVOID Context OPTIONAL); + +IO_PRIORITY_HINT +NTAPI +IoGetIoPriorityHint( + IN PIRP Irp); + +NTSTATUS +NTAPI +IoSetIoPriorityHint( + IN PIRP Irp, + IN IO_PRIORITY_HINT PriorityHint); + +NTSTATUS +NTAPI +IoAllocateSfioStreamIdentifier( + IN PFILE_OBJECT FileObject, + IN ULONG Length, + IN PVOID Signature, + OUT PVOID *StreamIdentifier); + +PVOID +NTAPI +IoGetSfioStreamIdentifier( + IN PFILE_OBJECT FileObject, + IN PVOID Signature); + +NTSTATUS +NTAPI +IoFreeSfioStreamIdentifier( + IN PFILE_OBJECT FileObject, + IN PVOID Signature); + +NTKERNELAPI +NTSTATUS +NTAPI +IoRequestDeviceEjectEx( + IN PDEVICE_OBJECT PhysicalDeviceObject, + IN PIO_DEVICE_EJECT_CALLBACK Callback OPTIONAL, + IN PVOID Context OPTIONAL, + IN PDRIVER_OBJECT DriverObject OPTIONAL); + +NTKERNELAPI +NTSTATUS +NTAPI +IoSetDevicePropertyData( + IN PDEVICE_OBJECT Pdo, + IN CONST DEVPROPKEY *PropertyKey, + IN LCID Lcid, + IN ULONG Flags, + IN DEVPROPTYPE Type, + IN ULONG Size, + IN PVOID Data OPTIONAL); + +NTKERNELAPI +NTSTATUS +NTAPI +IoGetDevicePropertyData( + PDEVICE_OBJECT Pdo, + CONST DEVPROPKEY *PropertyKey, + LCID Lcid, + ULONG Flags, + ULONG Size, + PVOID Data, + PULONG RequiredSize, + PDEVPROPTYPE Type); + +#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ + +#define IoCallDriverStackSafeDefault(a, b) IoCallDriver(a, b) + +#if (NTDDI_VERSION >= NTDDI_WS08) +NTKERNELAPI +NTSTATUS +NTAPI +IoReplacePartitionUnit( + IN PDEVICE_OBJECT TargetPdo, + IN PDEVICE_OBJECT SparePdo, + IN ULONG Flags); +#endif + +#if (NTDDI_VERSION >= NTDDI_WIN7) + +NTKERNELAPI +NTSTATUS +NTAPI +IoGetAffinityInterrupt( + IN PKINTERRUPT InterruptObject, + OUT PGROUP_AFFINITY GroupAffinity); + +NTSTATUS +NTAPI +IoGetContainerInformation( + IN IO_CONTAINER_INFORMATION_CLASS InformationClass, + IN PVOID ContainerObject OPTIONAL, + IN OUT PVOID Buffer OPTIONAL, + IN ULONG BufferLength); + +NTSTATUS +NTAPI +IoRegisterContainerNotification( + IN IO_CONTAINER_NOTIFICATION_CLASS NotificationClass, + IN PIO_CONTAINER_NOTIFICATION_FUNCTION CallbackFunction, + IN PVOID NotificationInformation OPTIONAL, + IN ULONG NotificationInformationLength, + OUT PVOID CallbackRegistration); + +VOID +NTAPI +IoUnregisterContainerNotification( + IN PVOID CallbackRegistration); + +NTKERNELAPI +NTSTATUS +NTAPI +IoUnregisterPlugPlayNotificationEx( + IN PVOID NotificationEntry); + +NTKERNELAPI +NTSTATUS +NTAPI +IoGetDeviceNumaNode( + IN PDEVICE_OBJECT Pdo, + OUT PUSHORT NodeNumber); + +#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ + #if defined(_WIN64) NTKERNELAPI ULONG @@ -10602,12 +13189,57 @@ PoCreatePowerRequest( #define ExInitializeSListHead InitializeSListHead -#if defined(_X86_) -#if defined(_NTHAL_) +#if defined(_NTHAL_) && defined(_X86_) + +NTKERNELAPI +VOID +FASTCALL +ExiAcquireFastMutex( + IN OUT PFAST_MUTEX FastMutex); + +NTKERNELAPI +VOID +FASTCALL +ExiReleaseFastMutex( + IN OUT PFAST_MUTEX FastMutex); + +NTKERNELAPI +BOOLEAN +FASTCALL +ExiTryToAcquireFastMutex( + IN OUT PFAST_MUTEX FastMutex); + #define ExAcquireFastMutex ExiAcquireFastMutex #define ExReleaseFastMutex ExiReleaseFastMutex #define ExTryToAcquireFastMutex ExiTryToAcquireFastMutex -#endif + +#else + +#if (NTDDI_VERSION >= NTDDI_WIN2K) + +NTKERNELAPI +VOID +FASTCALL +ExAcquireFastMutex( + IN OUT PFAST_MUTEX FastMutex); + +NTKERNELAPI +VOID +FASTCALL +ExReleaseFastMutex( + IN OUT PFAST_MUTEX FastMutex); + +NTKERNELAPI +BOOLEAN +FASTCALL +ExTryToAcquireFastMutex( + IN OUT PFAST_MUTEX FastMutex); + +#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ + +#endif /* defined(_NTHAL_) && defined(_X86_) */ + +#if defined(_X86_) #define ExInterlockedAddUlong ExfInterlockedAddUlong #define ExInterlockedInsertHeadList ExfInterlockedInsertHeadList #define ExInterlockedInsertTailList ExfInterlockedInsertTailList @@ -10665,6 +13297,8 @@ FASTCALL ExInterlockedFlushSList( IN OUT PSLIST_HEADER ListHead); +#endif /* !defined(_WIN64) */ + #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_) NTKERNELAPI @@ -10681,20 +13315,70 @@ ExInterlockedPushEntrySList( IN PSLIST_HEADER ListHead, IN PSINGLE_LIST_ENTRY ListEntry, IN PKSPIN_LOCK Lock); -#else + +NTKERNELAPI +PVOID +NTAPI +ExAllocateFromPagedLookasideList( + IN OUT PPAGED_LOOKASIDE_LIST Lookaside); + +NTKERNELAPI +VOID +NTAPI +ExFreeToPagedLookasideList( + IN OUT PPAGED_LOOKASIDE_LIST Lookaside, + IN PVOID Entry); + +#else /* !_WIN2K_COMPAT_SLIST_USAGE */ + +#if !defined(_WIN64) #define ExInterlockedPopEntrySList(_ListHead, _Lock) \ InterlockedPopEntrySList(_ListHead) #define ExInterlockedPushEntrySList(_ListHead, _ListEntry, _Lock) \ InterlockedPushEntrySList(_ListHead, _ListEntry) -#endif // _WIN2K_COMPAT_SLIST_USAGE +#endif + +static __inline +PVOID +ExAllocateFromPagedLookasideList( + IN OUT PPAGED_LOOKASIDE_LIST Lookaside) +{ + PVOID Entry; + + Lookaside->L.TotalAllocates++; + Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead); + if (Entry == NULL) { + Lookaside->L.AllocateMisses++; + Entry = (Lookaside->L.Allocate)(Lookaside->L.Type, + Lookaside->L.Size, + Lookaside->L.Tag); + } + return Entry; +} + +static __inline +VOID +ExFreeToPagedLookasideList( + IN OUT PPAGED_LOOKASIDE_LIST Lookaside, + IN PVOID Entry) +{ + Lookaside->L.TotalFrees++; + if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) { + Lookaside->L.FreeMisses++; + (Lookaside->L.Free)(Entry); + } else { + InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry); + } +} + +#endif /* _WIN2K_COMPAT_SLIST_USAGE */ -#endif // !defined(_WIN64) /* ERESOURCE_THREAD * ExGetCurrentResourceThread( * VOID); */ -#define ExGetCurrentResourceThread() ((ERESOURCE_THREAD)PsGetCurrentThread()) +#define ExGetCurrentResourceThread() ((ULONG_PTR)PsGetCurrentThread()) #define ExReleaseResource(R) (ExReleaseResourceLite(R)) @@ -10725,24 +13409,6 @@ ExInitializeFastMutex( #if (NTDDI_VERSION >= NTDDI_WIN2K) -NTKERNELAPI -VOID -FASTCALL -ExAcquireFastMutex( - IN OUT PFAST_MUTEX FastMutex); - -NTKERNELAPI -VOID -FASTCALL -ExReleaseFastMutex( - IN OUT PFAST_MUTEX FastMutex); - -NTKERNELAPI -BOOLEAN -FASTCALL -ExTryToAcquireFastMutex( - IN OUT PFAST_MUTEX FastMutex); - NTKERNELAPI VOID FASTCALL @@ -10790,10 +13456,6 @@ ExAllocatePool( IN POOL_TYPE PoolType, IN SIZE_T NumberOfBytes); -#ifdef POOL_TAGGING -#define ExAllocatePool(p,n) ExAllocatePoolWithTag(p,n,' kdD') -#endif /* POOL_TAGGING */ - NTKERNELAPI PVOID NTAPI @@ -10801,10 +13463,6 @@ ExAllocatePoolWithQuota( IN POOL_TYPE PoolType, IN SIZE_T NumberOfBytes); -#ifdef POOL_TAGGING -#define ExAllocatePoolWithQuota(p,n) ExAllocatePoolWithQuotaTag(p,n,' kdD') -#endif /* POOL_TAGGING */ - NTKERNELAPI PVOID NTAPI @@ -10825,6 +13483,10 @@ ExAllocatePoolWithTag( IN SIZE_T NumberOfBytes, IN ULONG Tag); +#ifndef POOL_TAGGING +#define ExAllocatePoolWithTag(a,b,c) ExAllocatePool(a,b) +#endif + NTKERNELAPI PVOID NTAPI @@ -10873,10 +13535,6 @@ NTAPI ExFreePool( IN PVOID P); -#ifdef POOL_TAGGING -#define ExFreePool(P) ExFreePoolWithTag(P, 0) -#endif - NTKERNELAPI VOID NTAPI @@ -11304,35 +13962,83 @@ ExInitializeLookasideListEx( IN SIZE_T Size, IN ULONG Tag, IN USHORT Depth); -#endif -#if !defined(MIDL_PASS) +NTKERNELAPI +VOID +NTAPI +ExDeleteLookasideListEx( + IN OUT PLOOKASIDE_LIST_EX Lookaside); -static __inline PVOID -ExAllocateFromNPagedLookasideList( - IN PNPAGED_LOOKASIDE_LIST Lookaside) +NTKERNELAPI +VOID +NTAPI +ExFlushLookasideListEx( + IN OUT PLOOKASIDE_LIST_EX Lookaside); + +FORCEINLINE +PVOID +ExAllocateFromLookasideListEx( + IN OUT PLOOKASIDE_LIST_EX Lookaside) { PVOID Entry; Lookaside->L.TotalAllocates += 1; Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead); if (Entry == NULL) { - Lookaside->L.AllocateMisses++; - Entry = (Lookaside->L.Allocate)(Lookaside->L.Type, + Lookaside->L.AllocateMisses += 1; + Entry = (Lookaside->L.AllocateEx)(Lookaside->L.Type, Lookaside->L.Size, - Lookaside->L.Tag); + Lookaside->L.Tag, + Lookaside); } return Entry; } +FORCEINLINE +VOID +ExFreeToLookasideListEx( + IN OUT PLOOKASIDE_LIST_EX Lookaside, + IN PVOID Entry) +{ + Lookaside->L.TotalFrees += 1; + if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) { + Lookaside->L.FreeMisses += 1; + (Lookaside->L.FreeEx)(Entry, Lookaside); + } else { + InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry); + } + return; +} + +#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ + +#if (NTDDI_VERSION >= NTDDI_WIN7) + +NTKERNELAPI +VOID +NTAPI +ExSetResourceOwnerPointerEx( + IN OUT PERESOURCE Resource, + IN PVOID OwnerPointer, + IN ULONG Flags); + +#define FLAG_OWNER_POINTER_IS_THREAD 0x1 + +#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ + static __inline PVOID -ExAllocateFromPagedLookasideList( - IN PPAGED_LOOKASIDE_LIST Lookaside) +ExAllocateFromNPagedLookasideList( + IN OUT PNPAGED_LOOKASIDE_LIST Lookaside) { PVOID Entry; Lookaside->L.TotalAllocates++; +#if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_) + Entry = ExInterlockedPopEntrySList(&Lookaside->L.ListHead, + &Lookaside->Lock__ObsoleteButDoNotDelete); +#else Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead); +#endif if (Entry == NULL) { Lookaside->L.AllocateMisses++; Entry = (Lookaside->L.Allocate)(Lookaside->L.Type, @@ -11352,25 +14058,16 @@ ExFreeToNPagedLookasideList( Lookaside->L.FreeMisses++; (Lookaside->L.Free)(Entry); } else { +#if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_) + ExInterlockedPushEntrySList(&Lookaside->L.ListHead, + (PSLIST_ENTRY)Entry, + &Lookaside->Lock__ObsoleteButDoNotDelete); +#else InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry); +#endif } } -static __inline VOID -ExFreeToPagedLookasideList( - IN PPAGED_LOOKASIDE_LIST Lookaside, - IN PVOID Entry) -{ - Lookaside->L.TotalFrees++; - if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) { - Lookaside->L.FreeMisses++; - (Lookaside->L.Free)(Entry); - } else { - InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry); - } -} - -#endif // !defined(MIDL_PASS) /****************************************************************************** * Object Manager Functions * @@ -11606,8 +14303,115 @@ WmiTraceMessageVa( IN va_list MessageArgList); #endif +#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ + +#ifndef TRACE_INFORMATION_CLASS_DEFINE + +#if (NTDDI_VERSION >= NTDDI_WINXP) +NTKERNELAPI +NTSTATUS +NTAPI +WmiQueryTraceInformation( + IN TRACE_INFORMATION_CLASS TraceInformationClass, + OUT PVOID TraceInformation, + IN ULONG TraceInformationLength, + OUT PULONG RequiredLength OPTIONAL, + IN PVOID Buffer OPTIONAL); #endif +#define TRACE_INFORMATION_CLASS_DEFINE + +#endif /* TRACE_INFOPRMATION_CLASS_DEFINE */ + +#if (NTDDI_VERSION >= NTDDI_VISTA) + +NTSTATUS +NTKERNELAPI +NTAPI +EtwRegister( + IN LPCGUID ProviderId, + IN PETWENABLECALLBACK EnableCallback OPTIONAL, + IN PVOID CallbackContext OPTIONAL, + OUT PREGHANDLE RegHandle); + +NTSTATUS +NTKERNELAPI +NTAPI +EtwUnregister( + IN REGHANDLE RegHandle); + +BOOLEAN +NTKERNELAPI +NTAPI +EtwEventEnabled( + IN REGHANDLE RegHandle, + IN PCEVENT_DESCRIPTOR EventDescriptor); + +BOOLEAN +NTKERNELAPI +NTAPI +EtwProviderEnabled( + IN REGHANDLE RegHandle, + IN UCHAR Level, + IN ULONGLONG Keyword); + +NTSTATUS +NTKERNELAPI +NTAPI +EtwActivityIdControl( + IN ULONG ControlCode, + IN OUT LPGUID ActivityId); + +NTSTATUS +NTKERNELAPI +NTAPI +EtwWrite( + IN REGHANDLE RegHandle, + IN PCEVENT_DESCRIPTOR EventDescriptor, + IN LPCGUID ActivityId OPTIONAL, + IN ULONG UserDataCount, + IN PEVENT_DATA_DESCRIPTOR UserData OPTIONAL); + +NTSTATUS +NTKERNELAPI +NTAPI +EtwWriteTransfer( + IN REGHANDLE RegHandle, + IN PCEVENT_DESCRIPTOR EventDescriptor, + IN LPCGUID ActivityId OPTIONAL, + IN LPCGUID RelatedActivityId OPTIONAL, + IN ULONG UserDataCount, + IN PEVENT_DATA_DESCRIPTOR UserData OPTIONAL); + +NTSTATUS +NTKERNELAPI +NTAPI +EtwWriteString( + IN REGHANDLE RegHandle, + IN UCHAR Level, + IN ULONGLONG Keyword, + IN LPCGUID ActivityId OPTIONAL, + IN PCWSTR String); + +#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ + +#if (NTDDI_VERSION >= NTDDI_WIN7) +NTSTATUS +NTKERNELAPI +NTAPI +EtwWriteEx( + IN REGHANDLE RegHandle, + IN PCEVENT_DESCRIPTOR EventDescriptor, + IN ULONG64 Filter, + IN ULONG Flags, + IN LPCGUID ActivityId OPTIONAL, + IN LPCGUID RelatedActivityId OPTIONAL, + IN ULONG UserDataCount, + IN PEVENT_DATA_DESCRIPTOR UserData OPTIONAL); +#endif + + + /****************************************************************************** * Kernel Debugger Functions * ******************************************************************************/ @@ -11619,8 +14423,86 @@ __cdecl DbgPrint( IN PCSTR Format, IN ...); + +#if (NTDDI_VERSION >= NTDDI_WIN2K) +NTSYSAPI +ULONG +__cdecl +DbgPrintReturnControlC( + IN PCCH Format, + IN ...); #endif +#if (NTDDI_VERSION >= NTDDI_WINXP) + +NTSYSAPI +ULONG +__cdecl +DbgPrintEx( + IN ULONG ComponentId, + IN ULONG Level, + IN PCSTR Format, + IN ...); + +#ifdef _VA_LIST_DEFINED + +NTSYSAPI +ULONG +NTAPI +vDbgPrintEx( + IN ULONG ComponentId, + IN ULONG Level, + IN PCCH Format, + IN va_list ap); + +NTSYSAPI +ULONG +NTAPI +vDbgPrintExWithPrefix( + IN PCCH Prefix, + IN ULONG ComponentId, + IN ULONG Level, + IN PCCH Format, + IN va_list ap); + +#endif /* _VA_LIST_DEFINED */ + +NTSYSAPI +NTSTATUS +NTAPI +DbgQueryDebugFilterState( + IN ULONG ComponentId, + IN ULONG Level); + +NTSYSAPI +NTSTATUS +NTAPI +DbgSetDebugFilterState( + IN ULONG ComponentId, + IN ULONG Level, + IN BOOLEAN State); + +#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ + +#if (NTDDI_VERSION >= NTDDI_VISTA) + +typedef VOID +(*PDEBUG_PRINT_CALLBACK)( + IN PSTRING Output, + IN ULONG ComponentId, + IN ULONG Level); + +NTSYSAPI +NTSTATUS +NTAPI +DbgSetDebugPrintCallback( + IN PDEBUG_PRINT_CALLBACK DebugPrintCallback, + IN BOOLEAN Enable); + +#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ + +#endif /* _DBGNT_ */ + #if DBG #define KdPrint(_x_) DbgPrint _x_ @@ -11664,31 +14546,6 @@ extern BOOLEAN KdDebuggerEnabled; #endif -#ifdef _VA_LIST_DEFINED -#if (NTDDI_VERSION >= NTDDI_WINXP) - -NTSYSAPI -ULONG -NTAPI -vDbgPrintEx( - IN ULONG ComponentId, - IN ULONG Level, - IN PCCH Format, - IN va_list ap); - -NTSYSAPI -ULONG -NTAPI -vDbgPrintExWithPrefix( - IN PCCH Prefix, - IN ULONG ComponentId, - IN ULONG Level, - IN PCCH Format, - IN va_list ap); - -#endif -#endif // _VA_LIST_DEFINED - #if (NTDDI_VERSION >= NTDDI_WIN2K) NTKERNELAPI @@ -11715,42 +14572,7 @@ NTAPI DbgBreakPointWithStatus( IN ULONG Status); -NTSYSAPI -ULONG -_cdecl -DbgPrintReturnControlC( - IN PCCH Format, - IN ...); - -#endif - -#if (NTDDI_VERSION >= NTDDI_WINXP) - -NTSYSAPI -ULONG -_cdecl -DbgPrintEx( - IN ULONG ComponentId, - IN ULONG Level, - IN PCSTR Format, - IN ...); - -NTSYSAPI -NTSTATUS -NTAPI -DbgQueryDebugFilterState( - IN ULONG ComponentId, - IN ULONG Level); - -NTSYSAPI -NTSTATUS -NTAPI -DbgSetDebugFilterState( - IN ULONG ComponentId, - IN ULONG Level, - IN BOOLEAN State); - -#endif +#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ #if (NTDDI_VERSION >= NTDDI_WS03) NTKERNELAPI @@ -11771,6 +14593,9 @@ KdChangeOption( OUT PVOID OutBuffer, OUT PULONG OutBufferNeeded OPTIONAL); #endif +/* Hardware Abstraction Layer Functions */ + +#if (NTDDI_VERSION >= NTDDI_WIN2K) #if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_) @@ -11824,14 +14649,224 @@ HalReadDmaCounter( return counter; } -#endif +FORCEINLINE +ULONG +HalGetDmaAlignment( + IN PDMA_ADAPTER DmaAdapter) +{ + PGET_DMA_ALIGNMENT getDmaAlignment; + ULONG alignment; + getDmaAlignment = *(DmaAdapter)->DmaOperations->GetDmaAlignment; + ASSERT( getDmaAlignment != NULL ); + alignment = getDmaAlignment( DmaAdapter ); + return alignment; +} + +#endif /* USE_DMA_MACROS ... */ +#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ #ifndef _NTTMAPI_ #define _NTTMAPI_ #include +#define TRANSACTIONMANAGER_QUERY_INFORMATION (0x0001) +#define TRANSACTIONMANAGER_SET_INFORMATION (0x0002) +#define TRANSACTIONMANAGER_RECOVER (0x0004) +#define TRANSACTIONMANAGER_RENAME (0x0008) +#define TRANSACTIONMANAGER_CREATE_RM (0x0010) +#define TRANSACTIONMANAGER_BIND_TRANSACTION (0x0020) + +#define TRANSACTIONMANAGER_GENERIC_READ (STANDARD_RIGHTS_READ |\ + TRANSACTIONMANAGER_QUERY_INFORMATION) + +#define TRANSACTIONMANAGER_GENERIC_WRITE (STANDARD_RIGHTS_WRITE |\ + TRANSACTIONMANAGER_SET_INFORMATION |\ + TRANSACTIONMANAGER_RECOVER |\ + TRANSACTIONMANAGER_RENAME |\ + TRANSACTIONMANAGER_CREATE_RM) + +#define TRANSACTIONMANAGER_GENERIC_EXECUTE (STANDARD_RIGHTS_EXECUTE) + +#define TRANSACTIONMANAGER_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED |\ + TRANSACTIONMANAGER_GENERIC_READ |\ + TRANSACTIONMANAGER_GENERIC_WRITE |\ + TRANSACTIONMANAGER_GENERIC_EXECUTE |\ + TRANSACTIONMANAGER_BIND_TRANSACTION) + +#define TRANSACTION_QUERY_INFORMATION (0x0001) +#define TRANSACTION_SET_INFORMATION (0x0002) +#define TRANSACTION_ENLIST (0x0004) +#define TRANSACTION_COMMIT (0x0008) +#define TRANSACTION_ROLLBACK (0x0010) +#define TRANSACTION_PROPAGATE (0x0020) +#define TRANSACTION_RIGHT_RESERVED1 (0x0040) + +#define TRANSACTION_GENERIC_READ (STANDARD_RIGHTS_READ |\ + TRANSACTION_QUERY_INFORMATION |\ + SYNCHRONIZE) + +#define TRANSACTION_GENERIC_WRITE (STANDARD_RIGHTS_WRITE |\ + TRANSACTION_SET_INFORMATION |\ + TRANSACTION_COMMIT |\ + TRANSACTION_ENLIST |\ + TRANSACTION_ROLLBACK |\ + TRANSACTION_PROPAGATE |\ + SYNCHRONIZE) + +#define TRANSACTION_GENERIC_EXECUTE (STANDARD_RIGHTS_EXECUTE |\ + TRANSACTION_COMMIT |\ + TRANSACTION_ROLLBACK |\ + SYNCHRONIZE) + +#define TRANSACTION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED |\ + TRANSACTION_GENERIC_READ |\ + TRANSACTION_GENERIC_WRITE |\ + TRANSACTION_GENERIC_EXECUTE) + +#define TRANSACTION_RESOURCE_MANAGER_RIGHTS (TRANSACTION_GENERIC_READ |\ + STANDARD_RIGHTS_WRITE |\ + TRANSACTION_SET_INFORMATION |\ + TRANSACTION_ENLIST |\ + TRANSACTION_ROLLBACK |\ + TRANSACTION_PROPAGATE |\ + SYNCHRONIZE) + +#define RESOURCEMANAGER_QUERY_INFORMATION (0x0001) +#define RESOURCEMANAGER_SET_INFORMATION (0x0002) +#define RESOURCEMANAGER_RECOVER (0x0004) +#define RESOURCEMANAGER_ENLIST (0x0008) +#define RESOURCEMANAGER_GET_NOTIFICATION (0x0010) +#define RESOURCEMANAGER_REGISTER_PROTOCOL (0x0020) +#define RESOURCEMANAGER_COMPLETE_PROPAGATION (0x0040) + +#define RESOURCEMANAGER_GENERIC_READ (STANDARD_RIGHTS_READ |\ + RESOURCEMANAGER_QUERY_INFORMATION |\ + SYNCHRONIZE) + +#define RESOURCEMANAGER_GENERIC_WRITE (STANDARD_RIGHTS_WRITE |\ + RESOURCEMANAGER_SET_INFORMATION |\ + RESOURCEMANAGER_RECOVER |\ + RESOURCEMANAGER_ENLIST |\ + RESOURCEMANAGER_GET_NOTIFICATION |\ + RESOURCEMANAGER_REGISTER_PROTOCOL |\ + RESOURCEMANAGER_COMPLETE_PROPAGATION |\ + SYNCHRONIZE) + +#define RESOURCEMANAGER_GENERIC_EXECUTE (STANDARD_RIGHTS_EXECUTE |\ + RESOURCEMANAGER_RECOVER |\ + RESOURCEMANAGER_ENLIST |\ + RESOURCEMANAGER_GET_NOTIFICATION |\ + RESOURCEMANAGER_COMPLETE_PROPAGATION |\ + SYNCHRONIZE) + +#define RESOURCEMANAGER_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED |\ + RESOURCEMANAGER_GENERIC_READ |\ + RESOURCEMANAGER_GENERIC_WRITE |\ + RESOURCEMANAGER_GENERIC_EXECUTE) + +#define ENLISTMENT_QUERY_INFORMATION (0x0001) +#define ENLISTMENT_SET_INFORMATION (0x0002) +#define ENLISTMENT_RECOVER (0x0004) +#define ENLISTMENT_SUBORDINATE_RIGHTS (0x0008) +#define ENLISTMENT_SUPERIOR_RIGHTS (0x0010) + +#define ENLISTMENT_GENERIC_READ (STANDARD_RIGHTS_READ |\ + ENLISTMENT_QUERY_INFORMATION) + +#define ENLISTMENT_GENERIC_WRITE (STANDARD_RIGHTS_WRITE |\ + ENLISTMENT_SET_INFORMATION |\ + ENLISTMENT_RECOVER |\ + ENLISTMENT_SUBORDINATE_RIGHTS |\ + ENLISTMENT_SUPERIOR_RIGHTS) + +#define ENLISTMENT_GENERIC_EXECUTE (STANDARD_RIGHTS_EXECUTE |\ + ENLISTMENT_RECOVER |\ + ENLISTMENT_SUBORDINATE_RIGHTS |\ + ENLISTMENT_SUPERIOR_RIGHTS) + +#define ENLISTMENT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED |\ + ENLISTMENT_GENERIC_READ |\ + ENLISTMENT_GENERIC_WRITE |\ + ENLISTMENT_GENERIC_EXECUTE) + +typedef enum _TRANSACTION_OUTCOME { + TransactionOutcomeUndetermined = 1, + TransactionOutcomeCommitted, + TransactionOutcomeAborted, +} TRANSACTION_OUTCOME; + + +typedef enum _TRANSACTION_STATE { + TransactionStateNormal = 1, + TransactionStateIndoubt, + TransactionStateCommittedNotify, +} TRANSACTION_STATE; + + +typedef struct _TRANSACTION_BASIC_INFORMATION { + GUID TransactionId; + ULONG State; + ULONG Outcome; +} TRANSACTION_BASIC_INFORMATION, *PTRANSACTION_BASIC_INFORMATION; + +typedef struct _TRANSACTIONMANAGER_BASIC_INFORMATION { + GUID TmIdentity; + LARGE_INTEGER VirtualClock; +} TRANSACTIONMANAGER_BASIC_INFORMATION, *PTRANSACTIONMANAGER_BASIC_INFORMATION; + +typedef struct _TRANSACTIONMANAGER_LOG_INFORMATION { + GUID LogIdentity; +} TRANSACTIONMANAGER_LOG_INFORMATION, *PTRANSACTIONMANAGER_LOG_INFORMATION; + +typedef struct _TRANSACTIONMANAGER_LOGPATH_INFORMATION { + ULONG LogPathLength; + WCHAR LogPath[1]; +} TRANSACTIONMANAGER_LOGPATH_INFORMATION, *PTRANSACTIONMANAGER_LOGPATH_INFORMATION; + +typedef struct _TRANSACTIONMANAGER_RECOVERY_INFORMATION { + ULONGLONG LastRecoveredLsn; +} TRANSACTIONMANAGER_RECOVERY_INFORMATION, *PTRANSACTIONMANAGER_RECOVERY_INFORMATION; + +typedef struct _TRANSACTION_PROPERTIES_INFORMATION { + ULONG IsolationLevel; + ULONG IsolationFlags; + LARGE_INTEGER Timeout; + ULONG Outcome; + ULONG DescriptionLength; + WCHAR Description[1]; +} TRANSACTION_PROPERTIES_INFORMATION, *PTRANSACTION_PROPERTIES_INFORMATION; + +typedef struct _TRANSACTION_BIND_INFORMATION { + HANDLE TmHandle; +} TRANSACTION_BIND_INFORMATION, *PTRANSACTION_BIND_INFORMATION; + +typedef struct _TRANSACTION_ENLISTMENT_PAIR { + GUID EnlistmentId; + GUID ResourceManagerId; +} TRANSACTION_ENLISTMENT_PAIR, *PTRANSACTION_ENLISTMENT_PAIR; + +typedef struct _TRANSACTION_ENLISTMENTS_INFORMATION { + ULONG NumberOfEnlistments; + TRANSACTION_ENLISTMENT_PAIR EnlistmentPair[1]; +} TRANSACTION_ENLISTMENTS_INFORMATION, *PTRANSACTION_ENLISTMENTS_INFORMATION; + +typedef struct _TRANSACTION_SUPERIOR_ENLISTMENT_INFORMATION { + TRANSACTION_ENLISTMENT_PAIR SuperiorEnlistmentPair; +} TRANSACTION_SUPERIOR_ENLISTMENT_INFORMATION, *PTRANSACTION_SUPERIOR_ENLISTMENT_INFORMATION; + +typedef struct _RESOURCEMANAGER_BASIC_INFORMATION { + GUID ResourceManagerId; + ULONG DescriptionLength; + WCHAR Description[1]; +} RESOURCEMANAGER_BASIC_INFORMATION, *PRESOURCEMANAGER_BASIC_INFORMATION; + +typedef struct _RESOURCEMANAGER_COMPLETION_INFORMATION { + HANDLE IoCompletionPortHandle; + ULONG_PTR CompletionKey; +} RESOURCEMANAGER_COMPLETION_INFORMATION, *PRESOURCEMANAGER_COMPLETION_INFORMATION; + typedef enum _KTMOBJECT_TYPE { KTMOBJECT_TRANSACTION, KTMOBJECT_TRANSACTION_MANAGER, @@ -11865,12 +14900,421 @@ typedef enum _RESOURCEMANAGER_INFORMATION_CLASS { ResourceManagerCompletionInformation, } RESOURCEMANAGER_INFORMATION_CLASS; +typedef struct _ENLISTMENT_BASIC_INFORMATION { + GUID EnlistmentId; + GUID TransactionId; + GUID ResourceManagerId; +} ENLISTMENT_BASIC_INFORMATION, *PENLISTMENT_BASIC_INFORMATION; + +typedef struct _ENLISTMENT_CRM_INFORMATION { + GUID CrmTransactionManagerId; + GUID CrmResourceManagerId; + GUID CrmEnlistmentId; +} ENLISTMENT_CRM_INFORMATION, *PENLISTMENT_CRM_INFORMATION; + typedef enum _ENLISTMENT_INFORMATION_CLASS { EnlistmentBasicInformation, EnlistmentRecoveryInformation, EnlistmentCrmInformation } ENLISTMENT_INFORMATION_CLASS; +typedef struct _TRANSACTION_LIST_ENTRY { +#if defined(__cplusplus) + ::UOW UOW; +#else + UOW UOW; +#endif +} TRANSACTION_LIST_ENTRY, *PTRANSACTION_LIST_ENTRY; + +typedef struct _TRANSACTION_LIST_INFORMATION { + ULONG NumberOfTransactions; + TRANSACTION_LIST_ENTRY TransactionInformation[1]; +} TRANSACTION_LIST_INFORMATION, *PTRANSACTION_LIST_INFORMATION; + +typedef NTSTATUS +(NTAPI *PFN_NT_CREATE_TRANSACTION)( + OUT PHANDLE TransactionHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, + IN LPGUID Uow OPTIONAL, + IN HANDLE TmHandle OPTIONAL, + IN ULONG CreateOptions OPTIONAL, + IN ULONG IsolationLevel OPTIONAL, + IN ULONG IsolationFlags OPTIONAL, + IN PLARGE_INTEGER Timeout OPTIONAL, + IN PUNICODE_STRING Description OPTIONAL); + +typedef NTSTATUS +(NTAPI *PFN_NT_OPEN_TRANSACTION)( + OUT PHANDLE TransactionHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes, + IN LPGUID Uow OPTIONAL, + IN HANDLE TmHandle OPTIONAL); + +typedef NTSTATUS +(NTAPI *PFN_NT_QUERY_INFORMATION_TRANSACTION)( + IN HANDLE TransactionHandle, + IN TRANSACTION_INFORMATION_CLASS TransactionInformationClass, + OUT PVOID TransactionInformation, + IN ULONG TransactionInformationLength, + OUT PULONG ReturnLength OPTIONAL); + +typedef NTSTATUS +(NTAPI *PFN_NT_SET_INFORMATION_TRANSACTION)( + IN HANDLE TransactionHandle, + IN TRANSACTION_INFORMATION_CLASS TransactionInformationClass, + IN PVOID TransactionInformation, + IN ULONG TransactionInformationLength); + +typedef NTSTATUS +(NTAPI *PFN_NT_COMMIT_TRANSACTION)( + IN HANDLE TransactionHandle, + IN BOOLEAN Wait); + +typedef NTSTATUS +(NTAPI *PFN_NT_ROLLBACK_TRANSACTION)( + IN HANDLE TransactionHandle, + IN BOOLEAN Wait); + +#if (NTDDI_VERSION >= NTDDI_VISTA) + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtCreateTransactionManager( + OUT PHANDLE TmHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, + IN PUNICODE_STRING LogFileName OPTIONAL, + IN ULONG CreateOptions OPTIONAL, + IN ULONG CommitStrength OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtOpenTransactionManager( + OUT PHANDLE TmHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, + IN PUNICODE_STRING LogFileName OPTIONAL, + IN LPGUID TmIdentity OPTIONAL, + IN ULONG OpenOptions OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtRenameTransactionManager( + IN PUNICODE_STRING LogFileName, + IN LPGUID ExistingTransactionManagerGuid); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtRollforwardTransactionManager( + IN HANDLE TransactionManagerHandle, + IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtRecoverTransactionManager( + IN HANDLE TransactionManagerHandle); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtQueryInformationTransactionManager( + IN HANDLE TransactionManagerHandle, + IN TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass, + OUT PVOID TransactionManagerInformation, + IN ULONG TransactionManagerInformationLength, + OUT PULONG ReturnLength); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtSetInformationTransactionManager( + IN HANDLE TmHandle OPTIONAL, + IN TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass, + IN PVOID TransactionManagerInformation, + IN ULONG TransactionManagerInformationLength); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtEnumerateTransactionObject( + IN HANDLE RootObjectHandle OPTIONAL, + IN KTMOBJECT_TYPE QueryType, + IN OUT PKTMOBJECT_CURSOR ObjectCursor, + IN ULONG ObjectCursorLength, + OUT PULONG ReturnLength); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtCreateTransaction( + OUT PHANDLE TransactionHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, + IN LPGUID Uow OPTIONAL, + IN HANDLE TmHandle OPTIONAL, + IN ULONG CreateOptions OPTIONAL, + IN ULONG IsolationLevel OPTIONAL, + IN ULONG IsolationFlags OPTIONAL, + IN PLARGE_INTEGER Timeout OPTIONAL, + IN PUNICODE_STRING Description OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtOpenTransaction( + OUT PHANDLE TransactionHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes, + IN LPGUID Uow, + IN HANDLE TmHandle OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtQueryInformationTransaction( + IN HANDLE TransactionHandle, + IN TRANSACTION_INFORMATION_CLASS TransactionInformationClass, + OUT PVOID TransactionInformation, + IN ULONG TransactionInformationLength, + OUT PULONG ReturnLength OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtSetInformationTransaction( + IN HANDLE TransactionHandle, + IN TRANSACTION_INFORMATION_CLASS TransactionInformationClass, + IN PVOID TransactionInformation, + IN ULONG TransactionInformationLength); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtCommitTransaction( + IN HANDLE TransactionHandle, + IN BOOLEAN Wait); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtRollbackTransaction( + IN HANDLE TransactionHandle, + IN BOOLEAN Wait); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtCreateEnlistment( + OUT PHANDLE EnlistmentHandle, + IN ACCESS_MASK DesiredAccess, + IN HANDLE ResourceManagerHandle, + IN HANDLE TransactionHandle, + IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, + IN ULONG CreateOptions OPTIONAL, + IN NOTIFICATION_MASK NotificationMask, + IN PVOID EnlistmentKey OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtOpenEnlistment( + OUT PHANDLE EnlistmentHandle, + IN ACCESS_MASK DesiredAccess, + IN HANDLE ResourceManagerHandle, + IN LPGUID EnlistmentGuid, + IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtQueryInformationEnlistment( + IN HANDLE EnlistmentHandle, + IN ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass, + OUT PVOID EnlistmentInformation, + IN ULONG EnlistmentInformationLength, + OUT PULONG ReturnLength); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtSetInformationEnlistment( + IN HANDLE EnlistmentHandle OPTIONAL, + IN ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass, + IN PVOID EnlistmentInformation, + IN ULONG EnlistmentInformationLength); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtRecoverEnlistment( + IN HANDLE EnlistmentHandle, + IN PVOID EnlistmentKey OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtPrePrepareEnlistment( + IN HANDLE EnlistmentHandle, + IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtPrepareEnlistment( + IN HANDLE EnlistmentHandle, + IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtCommitEnlistment( + IN HANDLE EnlistmentHandle, + IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtRollbackEnlistment( + IN HANDLE EnlistmentHandle, + IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtPrePrepareComplete( + IN HANDLE EnlistmentHandle, + IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtPrepareComplete( + IN HANDLE EnlistmentHandle, + IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtCommitComplete( + IN HANDLE EnlistmentHandle, + IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtReadOnlyEnlistment( + IN HANDLE EnlistmentHandle, + IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtRollbackComplete( + IN HANDLE EnlistmentHandle, + IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtSinglePhaseReject( + IN HANDLE EnlistmentHandle, + IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtCreateResourceManager( + OUT PHANDLE ResourceManagerHandle, + IN ACCESS_MASK DesiredAccess, + IN HANDLE TmHandle, + IN LPGUID RmGuid, + IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, + IN ULONG CreateOptions OPTIONAL, + IN PUNICODE_STRING Description OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtOpenResourceManager( + OUT PHANDLE ResourceManagerHandle, + IN ACCESS_MASK DesiredAccess, + IN HANDLE TmHandle, + IN LPGUID ResourceManagerGuid OPTIONAL, + IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtRecoverResourceManager( + IN HANDLE ResourceManagerHandle); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtGetNotificationResourceManager( + IN HANDLE ResourceManagerHandle, + OUT PTRANSACTION_NOTIFICATION TransactionNotification, + IN ULONG NotificationLength, + IN PLARGE_INTEGER Timeout OPTIONAL, + OUT PULONG ReturnLength OPTIONAL, + IN ULONG Asynchronous, + IN ULONG_PTR AsynchronousContext OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtQueryInformationResourceManager( + IN HANDLE ResourceManagerHandle, + IN RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass, + OUT PVOID ResourceManagerInformation, + IN ULONG ResourceManagerInformationLength, + OUT PULONG ReturnLength OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtSetInformationResourceManager( + IN HANDLE ResourceManagerHandle, + IN RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass, + IN PVOID ResourceManagerInformation, + IN ULONG ResourceManagerInformationLength); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtRegisterProtocolAddressInformation( + IN HANDLE ResourceManager, + IN PCRM_PROTOCOL_ID ProtocolId, + IN ULONG ProtocolInformationSize, + IN PVOID ProtocolInformation, + IN ULONG CreateOptions OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtPropagationComplete( + IN HANDLE ResourceManagerHandle, + IN ULONG RequestCookie, + IN ULONG BufferLength, + IN PVOID Buffer); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtPropagationFailed( + IN HANDLE ResourceManagerHandle, + IN ULONG RequestCookie, + IN NTSTATUS PropStatus); + +#endif /* NTDDI_VERSION >= NTDDI_VISTA */ + #endif /* !_NTTMAPI_ */ /****************************************************************************** * ZwXxx Functions * @@ -12562,74 +16006,8 @@ ZwSetInformationKey( IN PVOID KeySetInformation, IN ULONG KeySetInformationLength); -#endif - -/****************************************************************************** - * Unsorted * - ******************************************************************************/ - -/* GUID Comparison */ -#ifndef __IID_ALIGNED__ -#define __IID_ALIGNED__ -#ifdef __cplusplus -inline int IsEqualGUIDAligned(REFGUID guid1, REFGUID guid2) -{ - return ( (*(PLONGLONG)(&guid1) == *(PLONGLONG)(&guid2)) && - (*((PLONGLONG)(&guid1) + 1) == *((PLONGLONG)(&guid2) + 1)) ); -} -#else -#define IsEqualGUIDAligned(guid1, guid2) \ - ( (*(PLONGLONG)(guid1) == *(PLONGLONG)(guid2)) && \ - (*((PLONGLONG)(guid1) + 1) == *((PLONGLONG)(guid2) + 1)) ) -#endif /* __cplusplus */ -#endif /* !__IID_ALIGNED__ */ - -typedef enum { - LT_DONT_CARE, - LT_LOWEST_LATENCY -} LATENCY_TIME; - -#define MAXIMUM_SUSPEND_COUNT MAXCHAR - -#define MAXIMUM_FILENAME_LENGTH 256 - -#define OBJ_NAME_PATH_SEPARATOR ((WCHAR)L'\\') - -#define OBJECT_TYPE_CREATE (0x0001) -#define OBJECT_TYPE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1) - -#define DIRECTORY_QUERY (0x0001) -#define DIRECTORY_TRAVERSE (0x0002) -#define DIRECTORY_CREATE_OBJECT (0x0004) -#define DIRECTORY_CREATE_SUBDIRECTORY (0x0008) -#define DIRECTORY_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0xF) - -#define EVENT_QUERY_STATE (0x0001) -#define EVENT_MODIFY_STATE (0x0002) -#define EVENT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3) - -#define SYMBOLIC_LINK_QUERY 0x0001 -#define SYMBOLIC_LINK_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1) - -#define DUPLICATE_CLOSE_SOURCE 0x00000001 -#define DUPLICATE_SAME_ACCESS 0x00000002 -#define DUPLICATE_SAME_ATTRIBUTES 0x00000004 - -/* Global debug flag */ -extern ULONG NtGlobalFlag; - -/* Service Start Types */ -#define SERVICE_BOOT_START 0x00000000 -#define SERVICE_SYSTEM_START 0x00000001 -#define SERVICE_AUTO_START 0x00000002 -#define SERVICE_DEMAND_START 0x00000003 -#define SERVICE_DISABLED 0x00000004 - -#ifndef _TRACEHANDLE_DEFINED -#define _TRACEHANDLE_DEFINED -typedef ULONG64 TRACEHANDLE, *PTRACEHANDLE; -#endif +#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ #ifdef __cplusplus From 73b2dc431790f3a3064965c3769efab8157a0483 Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Wed, 21 Apr 2010 14:06:01 +0000 Subject: [PATCH 023/131] [NTOS]: Enable MmPageEntireDriver by implementing MiSetPagingOfDriver. [NTOS]: Call MiEnablePagingOfDriver from MmLoadSystemImage and implement it. All the work is done other than actually enabling paging, which requires system working set support. [NTOS]: Implement MiWriteProtectSystemImage and MiComputeDriverProtection. All the work is done other than actually setting the bits on the pages, since I wanted to avoid too many changes. [NTOS]: MmCheckSystemImage returns STATUS_INVALID_IMAGE_PROTECT, not STATUS_INVALID_IMAGE_FORMAT, so the branch in MmLoadSystemImage needs to check for the correct status code. [NTOS]: Support FLG_SHOW_LDR_SNAPS for the kernel loader. svn path=/trunk/; revision=46977 --- reactos/ntoskrnl/mm/sysldr.c | 425 +++++++++++++++++++++++++++++++++-- 1 file changed, 408 insertions(+), 17 deletions(-) diff --git a/reactos/ntoskrnl/mm/sysldr.c b/reactos/ntoskrnl/mm/sysldr.c index 36b3ce5a8fc..34a91b4b860 100644 --- a/reactos/ntoskrnl/mm/sysldr.c +++ b/reactos/ntoskrnl/mm/sysldr.c @@ -39,10 +39,10 @@ ERESOURCE PsLoadedModuleResource; ULONG_PTR PsNtosImageBase; KMUTANT MmSystemLoadLock; +PFN_NUMBER MmTotalSystemDriverPages; + PVOID MmUnloadedDrivers; PVOID MmLastUnloadedDrivers; -PVOID MmTriageActionTaken; -PVOID KernelVerifier; BOOLEAN MmMakeLowMemory; BOOLEAN MmEnforceWriteProtection = TRUE; @@ -1468,6 +1468,374 @@ MiInitializeLoadedModuleList(IN PLOADER_PARAMETER_BLOCK LoaderBlock) return TRUE; } +ULONG +NTAPI +MiComputeDriverProtection(IN BOOLEAN SessionSpace, + IN ULONG SectionProtection) +{ + ULONG Protection = MM_ZERO_ACCESS; + + /* Check if the caller gave anything */ + if (SectionProtection) + { + /* Always turn on execute access */ + SectionProtection |= IMAGE_SCN_MEM_EXECUTE; + + /* Check if the registry setting is on or not */ + if (!MmEnforceWriteProtection) + { + /* Turn on write access too */ + SectionProtection |= (IMAGE_SCN_MEM_WRITE | IMAGE_SCN_MEM_EXECUTE); + } + } + + /* Convert to internal PTE flags */ + if (SectionProtection & IMAGE_SCN_MEM_EXECUTE) Protection |= MM_EXECUTE; + if (SectionProtection & IMAGE_SCN_MEM_READ) Protection |= MM_READONLY; + + /* Check for write access */ + if (SectionProtection & IMAGE_SCN_MEM_WRITE) + { + /* Session space is not supported */ + if (SessionSpace) + { + DPRINT1("Session drivers not supported\n"); + ASSERT(SessionSpace == FALSE); + } + else + { + /* Convert to internal PTE flag */ + Protection = (Protection & MM_EXECUTE) ? MM_EXECUTE_READWRITE : MM_READWRITE; + } + } + + /* If there's no access at all by now, convert to internal no access flag */ + if (Protection == MM_ZERO_ACCESS) Protection = MM_NOACCESS; + + /* Return the computed PTE protection */ + return Protection; +} + +VOID +NTAPI +MiSetSystemCodeProtection(IN PMMPTE FirstPte, + IN PMMPTE LastPte, + IN ULONG ProtectionMask) +{ + /* I'm afraid to introduce regressions at the moment... */ + return; +} + +VOID +NTAPI +MiWriteProtectSystemImage(IN PVOID ImageBase) +{ + PIMAGE_NT_HEADERS NtHeaders; + PIMAGE_SECTION_HEADER Section; + PFN_NUMBER DriverPages; + ULONG CurrentProtection, SectionProtection, CombinedProtection, ProtectionMask; + ULONG Sections, Size; + ULONG_PTR BaseAddress, CurrentAddress; + PMMPTE PointerPte, StartPte, LastPte, CurrentPte, ComboPte = NULL; + ULONG CurrentMask, CombinedMask = 0; + PAGED_CODE(); + + /* No need to write protect physical memory-backed drivers (large pages) */ + if (MI_IS_PHYSICAL_ADDRESS(ImageBase)) return; + + /* Get the image headers */ + NtHeaders = RtlImageNtHeader(ImageBase); + if (!NtHeaders) return; + + /* Check if this is a session driver or not */ + if (!MI_IS_SESSION_ADDRESS(ImageBase)) + { + /* Don't touch NT4 drivers */ + if (NtHeaders->OptionalHeader.MajorOperatingSystemVersion < 5) return; + if (NtHeaders->OptionalHeader.MajorImageVersion < 5) return; + } + else + { + /* Not supported */ + DPRINT1("Session drivers not supported\n"); + ASSERT(FALSE); + } + + /* These are the only protection masks we care about */ + ProtectionMask = IMAGE_SCN_MEM_WRITE | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_EXECUTE; + + /* Calculate the number of pages this driver is occupying */ + DriverPages = BYTES_TO_PAGES(NtHeaders->OptionalHeader.SizeOfImage); + + /* Get the number of sections and the first section header */ + Sections = NtHeaders->FileHeader.NumberOfSections; + ASSERT(Sections != 0); + Section = IMAGE_FIRST_SECTION(NtHeaders); + + /* Loop all the sections */ + CurrentAddress = (ULONG_PTR)ImageBase; + while (Sections) + { + /* Get the section size */ + Size = max(Section->SizeOfRawData, Section->Misc.VirtualSize); + + /* Get its virtual address */ + BaseAddress = (ULONG_PTR)ImageBase + Section->VirtualAddress; + if (BaseAddress < CurrentAddress) + { + /* Windows doesn't like these */ + DPRINT1("Badly linked image!\n"); + return; + } + + /* Remember the current address */ + CurrentAddress = BaseAddress + Size - 1; + + /* Next */ + Sections--; + Section++; + } + + /* Get the number of sections and the first section header */ + Sections = NtHeaders->FileHeader.NumberOfSections; + ASSERT(Sections != 0); + Section = IMAGE_FIRST_SECTION(NtHeaders); + + /* Set the address at the end to initialize the loop */ + CurrentAddress = (ULONG_PTR)Section + Sections - 1; + CurrentProtection = IMAGE_SCN_MEM_WRITE | IMAGE_SCN_MEM_READ; + + /* Set the PTE points for the image, and loop its sections */ + StartPte = MiAddressToPte(ImageBase); + LastPte = StartPte + DriverPages; + while (Sections) + { + /* Get the section size */ + Size = max(Section->SizeOfRawData, Section->Misc.VirtualSize); + + /* Get its virtual address and PTE */ + BaseAddress = (ULONG_PTR)ImageBase + Section->VirtualAddress; + PointerPte = MiAddressToPte(BaseAddress); + + /* Check if we were already protecting a run, and found a new run */ + if ((ComboPte) && (PointerPte > ComboPte)) + { + /* Compute protection */ + CombinedMask = MiComputeDriverProtection(FALSE, CombinedProtection); + + /* Set it */ + MiSetSystemCodeProtection(ComboPte, ComboPte, CombinedMask); + + /* Check for overlap */ + if (ComboPte == StartPte) StartPte++; + + /* One done, reset variables */ + ComboPte = NULL; + CombinedProtection = 0; + } + + /* Break out when needed */ + if (PointerPte >= LastPte) break; + + /* Get the requested protection from the image header */ + SectionProtection = Section->Characteristics & ProtectionMask; + if (SectionProtection == CurrentProtection) + { + /* Same protection, so merge the request */ + CurrentAddress = BaseAddress + Size - 1; + continue; + } + + /* This is now a new section, so close up the old one */ + CurrentPte = MiAddressToPte(CurrentAddress); + + /* Check for overlap */ + if (CurrentPte == PointerPte) + { + /* Skip the last PTE, since it overlaps with us */ + CurrentPte--; + + /* And set the PTE we will merge with */ + ASSERT((ComboPte == NULL) || (ComboPte == PointerPte)); + ComboPte = PointerPte; + + /* Get the most flexible protection by merging both */ + CombinedMask |= (SectionProtection | CurrentProtection); + } + + /* Loop any PTEs left */ + if (CurrentPte >= StartPte) + { + /* Sanity check */ + ASSERT(StartPte < LastPte); + + /* Make sure we don't overflow past the last PTE in the driver */ + if (CurrentPte >= LastPte) CurrentPte = LastPte - 1; + ASSERT(CurrentPte >= StartPte); + + /* Compute the protection and set it */ + CurrentMask = MiComputeDriverProtection(FALSE, CurrentProtection); + MiSetSystemCodeProtection(StartPte, CurrentPte, CurrentMask); + } + + /* Set new state */ + StartPte = PointerPte; + CurrentAddress = BaseAddress + Size - 1; + CurrentProtection = SectionProtection; + + /* Next */ + Sections--; + Section++; + } + + /* Is there a leftover section to merge? */ + if (ComboPte) + { + /* Compute and set the protection */ + CombinedMask = MiComputeDriverProtection(FALSE, CombinedProtection); + MiSetSystemCodeProtection(ComboPte, ComboPte, CombinedMask); + + /* Handle overlap */ + if (ComboPte == StartPte) StartPte++; + } + + /* Finally, handle the last section */ + CurrentPte = MiPteToAddress(CurrentAddress); + if ((StartPte < LastPte) && (CurrentPte >= StartPte)) + { + /* Handle overlap */ + if (CurrentPte >= LastPte) CurrentPte = LastPte - 1; + ASSERT(CurrentPte >= StartPte); + + /* Compute and set the protection */ + CurrentMask = MiComputeDriverProtection(FALSE, CurrentProtection); + MiSetSystemCodeProtection(StartPte, CurrentPte, CurrentMask); + } +} + +VOID +NTAPI +MiSetPagingOfDriver(IN PMMPTE PointerPte, + IN PMMPTE LastPte) +{ + PVOID ImageBase; + PETHREAD CurrentThread; + PFN_NUMBER PageCount = 0, PageFrameIndex; + PMMPFN Pfn1; + PAGED_CODE(); + + /* Get the driver's base address */ + ImageBase = MiPteToAddress(PointerPte); + ASSERT(MI_IS_SESSION_IMAGE_ADDRESS(ImageBase) == FALSE); + + /* If this is a large page, it's stuck in physical memory */ + if (MI_IS_PHYSICAL_ADDRESS(ImageBase)) return; + + /* We should lock the system working set -- we don't have one yet, so just be consistent */ + CurrentThread = PsGetCurrentThread(); + KeEnterGuardedRegion(); + ASSERT((CurrentThread->OwnsSystemWorkingSetExclusive == 0) && + (CurrentThread->OwnsSystemWorkingSetShared == 0)); + CurrentThread->OwnsSystemWorkingSetExclusive = 1; + + /* Loop the PTEs */ + while (PointerPte <= LastPte) + { + /* Check for valid PTE */ + if (PointerPte->u.Hard.Valid == 1) + { + PageFrameIndex = PFN_FROM_PTE(PointerPte); + Pfn1 = MiGetPfnEntry(PageFrameIndex); + ASSERT(Pfn1->u2.ShareCount == 1); + + /* No working sets in ReactOS yet */ + PageCount++; + } + + ImageBase = (PVOID)((ULONG_PTR)ImageBase + PAGE_SIZE); + PointerPte++; + } + + /* Release the working set "lock" */ + ASSERT(KeAreAllApcsDisabled() == TRUE); + CurrentThread->OwnsSystemWorkingSetExclusive = 0; + KeLeaveGuardedRegion(); + + /* Do we have any driver pages? */ + if (PageCount) + { + /* Update counters */ + InterlockedExchangeAdd((PLONG)&MmTotalSystemDriverPages, PageCount); + } +} + +VOID +NTAPI +MiEnablePagingOfDriver(IN PLDR_DATA_TABLE_ENTRY LdrEntry) +{ + ULONG_PTR ImageBase; + PIMAGE_NT_HEADERS NtHeaders; + ULONG Sections, Alignment, Size; + PIMAGE_SECTION_HEADER Section; + PMMPTE PointerPte = NULL, LastPte = NULL; + if (MmDisablePagingExecutive) return; + + /* Get the driver base address and its NT header */ + ImageBase = (ULONG_PTR)LdrEntry->DllBase; + NtHeaders = RtlImageNtHeader((PVOID)ImageBase); + if (!NtHeaders) return; + + /* Get the sections and their alignment */ + Sections = NtHeaders->FileHeader.NumberOfSections; + Alignment = NtHeaders->OptionalHeader.SectionAlignment - 1; + + /* Loop each section */ + Section = IMAGE_FIRST_SECTION(NtHeaders); + while (Sections) + { + /* Find PAGE or .edata */ + if ((*(PULONG)Section->Name == 'EGAP') || + (*(PULONG)Section->Name == 'ade.')) + { + /* Had we already done some work? */ + if (!PointerPte) + { + /* Nope, setup the first PTE address */ + PointerPte = MiAddressToPte(ROUND_TO_PAGES(ImageBase + + Section-> + VirtualAddress)); + } + + /* Compute the size */ + Size = max(Section->SizeOfRawData, Section->Misc.VirtualSize); + + /* Find the last PTE that maps this section */ + LastPte = MiAddressToPte(ImageBase + + Section->VirtualAddress + + Alignment + + Size - + PAGE_SIZE); + } + else + { + /* Had we found a section before? */ + if (PointerPte) + { + /* Mark it as pageable */ + MiSetPagingOfDriver(PointerPte, LastPte); + PointerPte = NULL; + } + } + + /* Keep searching */ + Sections--; + Section++; + } + + /* Handle the straggler */ + if (PointerPte) MiSetPagingOfDriver(PointerPte, LastPte); +} + BOOLEAN NTAPI MmVerifyImageIsOkForMpUse(IN PVOID BaseAddress) @@ -1590,7 +1958,7 @@ MmLoadSystemImage(IN PUNICODE_STRING FileName, UNICODE_STRING BaseName, BaseDirectory, PrefixName, UnicodeTemp; PLDR_DATA_TABLE_ENTRY LdrEntry = NULL; ULONG EntrySize, DriverSize; - PLOAD_IMPORTS LoadedImports = (PVOID)-2; + PLOAD_IMPORTS LoadedImports = MM_SYSLDR_NO_IMPORTS; PCHAR MissingApiName, Buffer; PWCHAR MissingDriverName; HANDLE SectionHandle; @@ -1614,7 +1982,7 @@ MmLoadSystemImage(IN PUNICODE_STRING FileName, } /* Allocate a buffer we'll use for names */ - Buffer = ExAllocatePoolWithTag(NonPagedPool, MAX_PATH, TAG_LDR_WSTR); + Buffer = ExAllocatePoolWithTag(NonPagedPool, MAX_PATH, 'nLmM'); if (!Buffer) return STATUS_INSUFFICIENT_RESOURCES; /* Check for a separator */ @@ -1658,6 +2026,14 @@ MmLoadSystemImage(IN PUNICODE_STRING FileName, /* Check if we already have a name, use it instead */ if (LoadedName) BaseName = *LoadedName; + + /* Check for loader snap debugging */ + if (NtGlobalFlag & FLG_SHOW_LDR_SNAPS) + { + /* Print out standard string */ + DPRINT1("MM:SYSLDR Loading %wZ (%wZ) %s\n", + &PrefixName, &BaseName, Flags ? "in session space" : ""); + } /* Acquire the load lock */ LoaderScan: @@ -1753,7 +2129,7 @@ LoaderScan: Status = MmCheckSystemImage(FileHandle, FALSE); if ((Status == STATUS_IMAGE_CHECKSUM_MISMATCH) || (Status == STATUS_IMAGE_MP_UP_MISMATCH) || - (Status == STATUS_INVALID_IMAGE_FORMAT)) + (Status == STATUS_INVALID_IMAGE_PROTECT)) { /* Fail loading */ goto Quickie; @@ -1832,16 +2208,22 @@ LoaderScan: /* Check for success */ if (NT_SUCCESS(Status)) { - /* FIXME: Support large pages for drivers */ + #if 0 + /* Support large pages for drivers */ + MiUseLargeDriverPage(DriverSize / PAGE_SIZE, + &ModuleLoadBase, + &BaseName, + TRUE); + #endif } /* Dereference the section */ ObDereferenceObject(Section); Section = NULL; } - - /* Get the NT Header */ - NtHeader = RtlImageNtHeader(ModuleLoadBase); + + /* Check for failure of the load earlier */ + if (!NT_SUCCESS(Status)) goto Quickie; /* Relocate the driver */ Status = LdrRelocateImageWithBias(ModuleLoadBase, @@ -1852,6 +2234,10 @@ LoaderScan: STATUS_INVALID_IMAGE_FORMAT); if (!NT_SUCCESS(Status)) goto Quickie; + + /* Get the NT Header */ + NtHeader = RtlImageNtHeader(ModuleLoadBase); + /* Calculate the size we'll need for the entry and allocate it */ EntrySize = sizeof(LDR_DATA_TABLE_ENTRY) + BaseName.Length + @@ -1959,9 +2345,10 @@ LoaderScan: LdrEntry->Flags &= ~LDRP_LOAD_IN_PROGRESS; LdrEntry->LoadedImports = LoadedImports; - /* FIXME: Apply driver verifier */ + /* FIXME: Call driver verifier's loader function */ - /* FIXME: Write-protect the system image */ + /* Write-protect the system image */ + MiWriteProtectSystemImage(LdrEntry->DllBase); /* Check if notifications are enabled */ if (PsImageNotifyEnabled) @@ -2015,17 +2402,15 @@ LoaderScan: LdrEntry->Flags |= LDRP_DEBUG_SYMBOLS_LOADED; } - /* FIXME: Page the driver */ + /* Page the driver */ ASSERT(Section == NULL); + MiEnablePagingOfDriver(LdrEntry); /* Return pointers */ *ModuleObject = LdrEntry; *ImageBaseAddress = LdrEntry->DllBase; Quickie: - /* If we have a file handle, close it */ - if (FileHandle) ZwClose(FileHandle); - /* Check if we have the lock acquired */ if (LockOwned) { @@ -2035,6 +2420,9 @@ Quickie: LockOwned = FALSE; } + /* If we have a file handle, close it */ + if (FileHandle) ZwClose(FileHandle); + /* Check if we had a prefix */ if (NamePrefix) ExFreePool(PrefixName.Buffer); @@ -2078,6 +2466,8 @@ MiLookupDataTableEntry(IN PVOID Address) return FoundEntry; } +/* PUBLIC FUNCTIONS ***********************************************************/ + /* * @implemented */ @@ -2106,11 +2496,11 @@ MmPageEntireDriver(IN PVOID AddressWithinSection) /* Get the PTE range for the whole driver image */ StartPte = MiAddressToPte((ULONG_PTR)LdrEntry->DllBase); EndPte = MiAddressToPte((ULONG_PTR)LdrEntry->DllBase + LdrEntry->SizeOfImage); -#if 0 + /* Enable paging for the PTE range */ ASSERT(MI_IS_SESSION_IMAGE_ADDRESS(AddressWithinSection) == FALSE); MiSetPagingOfDriver(StartPte, EndPte); -#endif + /* Return the base address */ return LdrEntry->DllBase; } @@ -2124,6 +2514,7 @@ MmResetDriverPaging(IN PVOID AddressWithinSection) { UNIMPLEMENTED; } + /* * @implemented */ From 1400882dda593db400d7a16d6df7c9e991d34c8a Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Wed, 21 Apr 2010 14:14:45 +0000 Subject: [PATCH 024/131] [NTOS]: Support unload of system modules by parsing the LoadedImports (implement MiDereferenceImports which was just a stub) and calling MiCallDllUnloadAndUnloadDll. [NTOS]: Fix a bug in MiClearImports. svn path=/trunk/; revision=46978 --- reactos/ntoskrnl/mm/sysldr.c | 305 ++++++++++++++++++++++------------- 1 file changed, 191 insertions(+), 114 deletions(-) diff --git a/reactos/ntoskrnl/mm/sysldr.c b/reactos/ntoskrnl/mm/sysldr.c index 34a91b4b860..1b08c91f28d 100644 --- a/reactos/ntoskrnl/mm/sysldr.c +++ b/reactos/ntoskrnl/mm/sysldr.c @@ -191,120 +191,6 @@ MiLoadImageSection(IN OUT PVOID *SectionPtr, return Status; } -NTSTATUS -NTAPI -MiDereferenceImports(IN PLOAD_IMPORTS ImportList) -{ - SIZE_T i; - - /* Check if there's no imports or if we're a boot driver */ - if ((ImportList == (PVOID)-1) || - (ImportList == (PVOID)-2) || - (ImportList->Count == 0)) - { - /* Then there's nothing to do */ - return STATUS_SUCCESS; - } - - /* Otherwise, FIXME */ - DPRINT1("%u imports not dereferenced!\n", ImportList->Count); - for (i = 0; i < ImportList->Count; i++) - { - DPRINT1("%wZ <%wZ>\n", &ImportList->Entry[i]->FullDllName, &ImportList->Entry[i]->BaseDllName); - } - return STATUS_UNSUCCESSFUL; -} - -VOID -NTAPI -MiClearImports(IN PLDR_DATA_TABLE_ENTRY LdrEntry) -{ - PAGED_CODE(); - - /* Check if there's no imports or we're a boot driver or only one entry */ - if ((LdrEntry->LoadedImports == (PVOID)-1) || - (LdrEntry->LoadedImports == (PVOID)-2) || - ((ULONG_PTR)LdrEntry->LoadedImports & 1)) - { - /* Nothing to do */ - return; - } - - /* Otherwise, free the import list */ - ExFreePool(LdrEntry->LoadedImports); -} - -PVOID -NTAPI -MiFindExportedRoutineByName(IN PVOID DllBase, - IN PANSI_STRING ExportName) -{ - PULONG NameTable; - PUSHORT OrdinalTable; - PIMAGE_EXPORT_DIRECTORY ExportDirectory; - LONG Low = 0, Mid = 0, High, Ret; - USHORT Ordinal; - PVOID Function; - ULONG ExportSize; - PULONG ExportTable; - PAGED_CODE(); - - /* Get the export directory */ - ExportDirectory = RtlImageDirectoryEntryToData(DllBase, - TRUE, - IMAGE_DIRECTORY_ENTRY_EXPORT, - &ExportSize); - if (!ExportDirectory) return NULL; - - /* Setup name tables */ - NameTable = (PULONG)((ULONG_PTR)DllBase + - ExportDirectory->AddressOfNames); - OrdinalTable = (PUSHORT)((ULONG_PTR)DllBase + - ExportDirectory->AddressOfNameOrdinals); - - /* Do a binary search */ - High = ExportDirectory->NumberOfNames - 1; - while (High >= Low) - { - /* Get new middle value */ - Mid = (Low + High) >> 1; - - /* Compare name */ - Ret = strcmp(ExportName->Buffer, (PCHAR)DllBase + NameTable[Mid]); - if (Ret < 0) - { - /* Update high */ - High = Mid - 1; - } - else if (Ret > 0) - { - /* Update low */ - Low = Mid + 1; - } - else - { - /* We got it */ - break; - } - } - - /* Check if we couldn't find it */ - if (High < Low) return NULL; - - /* Otherwise, this is the ordinal */ - Ordinal = OrdinalTable[Mid]; - - /* Resolve the address and write it */ - ExportTable = (PULONG)((ULONG_PTR)DllBase + - ExportDirectory->AddressOfFunctions); - Function = (PVOID)((ULONG_PTR)DllBase + ExportTable[Ordinal]); - - /* We found it! */ - ASSERT(!(Function > (PVOID)ExportDirectory) && - (Function < (PVOID)((ULONG_PTR)ExportDirectory + ExportSize))); - return Function; -} - PVOID NTAPI MiLocateExportName(IN PVOID DllBase, @@ -443,6 +329,197 @@ MmCallDllInitialize(IN PLDR_DATA_TABLE_ENTRY LdrEntry, return Status; } +BOOLEAN +NTAPI +MiCallDllUnloadAndUnloadDll(IN PLDR_DATA_TABLE_ENTRY LdrEntry) +{ + NTSTATUS Status; + PMM_DLL_UNLOAD Func; + PAGED_CODE(); + + /* Get the unload routine */ + Func = (PMM_DLL_UNLOAD)MiLocateExportName(LdrEntry->DllBase, "DllUnload"); + if (!Func) return FALSE; + + /* Call it and check for success */ + Status = Func(); + if (!NT_SUCCESS(Status)) return FALSE; + + /* Lie about the load count so we can unload the image */ + ASSERT(LdrEntry->LoadCount == 0); + LdrEntry->LoadCount = 1; + + /* Unload it and return true */ + MmUnloadSystemImage(LdrEntry); + return TRUE; +} + +NTSTATUS +NTAPI +MiDereferenceImports(IN PLOAD_IMPORTS ImportList) +{ + SIZE_T i; + LOAD_IMPORTS SingleEntry; + PLDR_DATA_TABLE_ENTRY LdrEntry; + PVOID CurrentImports; + PAGED_CODE(); + + /* Check if there's no imports or if we're a boot driver */ + if ((ImportList == MM_SYSLDR_NO_IMPORTS) || + (ImportList == MM_SYSLDR_BOOT_LOADED) || + (ImportList->Count == 0)) + { + /* Then there's nothing to do */ + return STATUS_SUCCESS; + } + + /* Check for single-entry */ + if ((ULONG_PTR)ImportList & MM_SYSLDR_SINGLE_ENTRY) + { + /* Set it up */ + SingleEntry.Count = 1; + SingleEntry.Entry[0] = (PVOID)((ULONG_PTR)ImportList &~ MM_SYSLDR_SINGLE_ENTRY); + + /* Use this as the import list */ + ImportList = &SingleEntry; + } + + /* Loop the import list */ + for (i = 0; (i < ImportList->Count) && (ImportList->Entry[i]); i++) + { + /* Get the entry */ + LdrEntry = ImportList->Entry[i]; + DPRINT1("%wZ <%wZ>\n", &LdrEntry->FullDllName, &LdrEntry->BaseDllName); + + /* Skip boot loaded images */ + if (LdrEntry->LoadedImports == MM_SYSLDR_BOOT_LOADED) continue; + + /* Dereference the entry */ + ASSERT(LdrEntry->LoadCount >= 1); + if (!--LdrEntry->LoadCount) + { + /* Save the import data in case unload fails */ + CurrentImports = LdrEntry->LoadedImports; + + /* This is the last entry */ + LdrEntry->LoadedImports = MM_SYSLDR_NO_IMPORTS; + if (MiCallDllUnloadAndUnloadDll(LdrEntry)) + { + /* Unloading worked, parse this DLL's imports too */ + MiDereferenceImports(CurrentImports); + + /* Check if we had valid imports */ + if ((CurrentImports != MM_SYSLDR_BOOT_LOADED) || + (CurrentImports != MM_SYSLDR_NO_IMPORTS) || + !((ULONG_PTR)LdrEntry->LoadedImports & MM_SYSLDR_SINGLE_ENTRY)) + { + /* Free them */ + ExFreePool(CurrentImports); + } + } + else + { + /* Unload failed, restore imports */ + LdrEntry->LoadedImports = CurrentImports; + } + } + } + + /* Done */ + return STATUS_SUCCESS; +} + +VOID +NTAPI +MiClearImports(IN PLDR_DATA_TABLE_ENTRY LdrEntry) +{ + PAGED_CODE(); + + /* Check if there's no imports or we're a boot driver or only one entry */ + if ((LdrEntry->LoadedImports == MM_SYSLDR_BOOT_LOADED) || + (LdrEntry->LoadedImports == MM_SYSLDR_NO_IMPORTS) || + ((ULONG_PTR)LdrEntry->LoadedImports & MM_SYSLDR_SINGLE_ENTRY)) + { + /* Nothing to do */ + return; + } + + /* Otherwise, free the import list */ + ExFreePool(LdrEntry->LoadedImports); + LdrEntry->LoadedImports = MM_SYSLDR_BOOT_LOADED; +} + +PVOID +NTAPI +MiFindExportedRoutineByName(IN PVOID DllBase, + IN PANSI_STRING ExportName) +{ + PULONG NameTable; + PUSHORT OrdinalTable; + PIMAGE_EXPORT_DIRECTORY ExportDirectory; + LONG Low = 0, Mid = 0, High, Ret; + USHORT Ordinal; + PVOID Function; + ULONG ExportSize; + PULONG ExportTable; + PAGED_CODE(); + + /* Get the export directory */ + ExportDirectory = RtlImageDirectoryEntryToData(DllBase, + TRUE, + IMAGE_DIRECTORY_ENTRY_EXPORT, + &ExportSize); + if (!ExportDirectory) return NULL; + + /* Setup name tables */ + NameTable = (PULONG)((ULONG_PTR)DllBase + + ExportDirectory->AddressOfNames); + OrdinalTable = (PUSHORT)((ULONG_PTR)DllBase + + ExportDirectory->AddressOfNameOrdinals); + + /* Do a binary search */ + High = ExportDirectory->NumberOfNames - 1; + while (High >= Low) + { + /* Get new middle value */ + Mid = (Low + High) >> 1; + + /* Compare name */ + Ret = strcmp(ExportName->Buffer, (PCHAR)DllBase + NameTable[Mid]); + if (Ret < 0) + { + /* Update high */ + High = Mid - 1; + } + else if (Ret > 0) + { + /* Update low */ + Low = Mid + 1; + } + else + { + /* We got it */ + break; + } + } + + /* Check if we couldn't find it */ + if (High < Low) return NULL; + + /* Otherwise, this is the ordinal */ + Ordinal = OrdinalTable[Mid]; + + /* Resolve the address and write it */ + ExportTable = (PULONG)((ULONG_PTR)DllBase + + ExportDirectory->AddressOfFunctions); + Function = (PVOID)((ULONG_PTR)DllBase + ExportTable[Ordinal]); + + /* We found it! */ + ASSERT(!(Function > (PVOID)ExportDirectory) && + (Function < (PVOID)((ULONG_PTR)ExportDirectory + ExportSize))); + return Function; +} + VOID NTAPI MiProcessLoaderEntry(IN PLDR_DATA_TABLE_ENTRY LdrEntry, From 8a0f9ea1b40e561f9a3e012461a19e47c0ffa36f Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Wed, 21 Apr 2010 15:12:58 +0000 Subject: [PATCH 025/131] remove svn:mergeinfo svn path=/trunk/; revision=46979 From e20b4df9ef767ba35b0a9af27ed843347c4a4dc3 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Wed, 21 Apr 2010 15:15:57 +0000 Subject: [PATCH 026/131] [WIN32K] Update text and background brush properly. Fixes wrong colors in radio buttons in Firefox. Fix by Jerome Gardou. See issue #5311 for more details. svn path=/trunk/; revision=46980 --- reactos/subsystems/win32/win32k/objects/dcobjs.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/reactos/subsystems/win32/win32k/objects/dcobjs.c b/reactos/subsystems/win32/win32k/objects/dcobjs.c index e35fa717bdd..e18eb61bbc3 100644 --- a/reactos/subsystems/win32/win32k/objects/dcobjs.c +++ b/reactos/subsystems/win32/win32k/objects/dcobjs.c @@ -110,6 +110,9 @@ DC_vUpdateTextBrush(PDC pdc) { PDC_ATTR pdcattr = pdc->pdcattr; + if(pdcattr->ulDirty_ & DIRTY_TEXT) + EBRUSHOBJ_vUpdate(&pdc->eboText, pdc->eboText.pbrush, pdc); + /* Update the eboText's solid color */ EBRUSHOBJ_vSetSolidBrushColor(&pdc->eboText, pdcattr->crForegroundClr); @@ -123,6 +126,9 @@ DC_vUpdateBackgroundBrush(PDC pdc) { PDC_ATTR pdcattr = pdc->pdcattr; + if(pdcattr->ulDirty_ & DIRTY_BACKGROUND) + EBRUSHOBJ_vUpdate(&pdc->eboBackground, pdc->eboBackground.pbrush, pdc); + /* Update the eboBackground's solid color */ EBRUSHOBJ_vSetSolidBrushColor(&pdc->eboBackground, pdcattr->crBackgroundClr); From 577625f6f8dcc2bb20a2e00a24b5ebd3a5a94dea Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Wed, 21 Apr 2010 20:35:09 +0000 Subject: [PATCH 027/131] [WINESYNC] - Sync comdlg32, crypt32, gdiplus, inetcomm, jscript, msctf, mshtml, msxml3, rsaenh, schannel, shlwapi, urlmon, usp10, wininet winetests. svn path=/trunk/; revision=46982 --- rostests/winetests/comdlg32/comdlg32.rbuild | 2 + rostests/winetests/comdlg32/filedlg.c | 766 ++++++- rostests/winetests/comdlg32/fontdlg.c | 150 ++ rostests/winetests/comdlg32/printdlg.c | 21 +- rostests/winetests/comdlg32/rsrc.rc | 25 + rostests/winetests/crypt32/chain.c | 22 +- rostests/winetests/crypt32/main.c | 6 +- rostests/winetests/crypt32/msg.c | 2 +- rostests/winetests/gdiplus/brush.c | 56 + rostests/winetests/gdiplus/font.c | 79 +- rostests/winetests/gdiplus/graphics.c | 384 +++- rostests/winetests/gdiplus/image.c | 134 +- rostests/winetests/inetcomm/mimeintl.c | 2 +- rostests/winetests/jscript/regexp.js | 40 + rostests/winetests/msctf/inputprocessor.c | 2125 +++++++++++++------ rostests/winetests/mshtml/dom.c | 14 +- rostests/winetests/mshtml/events.c | 109 +- rostests/winetests/mshtml/jstest.html | 18 + rostests/winetests/mshtml/script.c | 10 + rostests/winetests/msxml3/domdoc.c | 22 + rostests/winetests/rsaenh/rsaenh.c | 242 ++- rostests/winetests/schannel/main.c | 35 +- rostests/winetests/shlwapi/generated.c | 115 +- rostests/winetests/shlwapi/istream.c | 34 +- rostests/winetests/shlwapi/ordinal.c | 1043 ++++++++- rostests/winetests/shlwapi/path.c | 100 +- rostests/winetests/shlwapi/shlwapi.rbuild | 3 +- rostests/winetests/shlwapi/string.c | 27 + rostests/winetests/shlwapi/url.c | 73 +- rostests/winetests/urlmon/generated.c | 322 ++- rostests/winetests/urlmon/misc.c | 18 +- rostests/winetests/urlmon/sec_mgr.c | 48 +- rostests/winetests/urlmon/url.c | 2 +- rostests/winetests/usp10/usp10.c | 543 ++++- rostests/winetests/wininet/ftp.c | 120 +- rostests/winetests/wininet/generated.c | 1373 +++++++++++- rostests/winetests/wininet/http.c | 412 +++- rostests/winetests/wininet/internet.c | 303 ++- rostests/winetests/wininet/url.c | 245 ++- rostests/winetests/wininet/urlcache.c | 95 +- rostests/winetests/wininet/wininet.rbuild | 3 +- 41 files changed, 7905 insertions(+), 1238 deletions(-) create mode 100644 rostests/winetests/comdlg32/fontdlg.c diff --git a/rostests/winetests/comdlg32/comdlg32.rbuild b/rostests/winetests/comdlg32/comdlg32.rbuild index d24dc1bd3c8..2d5dec28046 100644 --- a/rostests/winetests/comdlg32/comdlg32.rbuild +++ b/rostests/winetests/comdlg32/comdlg32.rbuild @@ -5,11 +5,13 @@ . filedlg.c + fontdlg.c printdlg.c testlist.c rsrc.rc wine comdlg32 + winspool user32 gdi32 ntdll diff --git a/rostests/winetests/comdlg32/filedlg.c b/rostests/winetests/comdlg32/filedlg.c index 9714dda1fe3..71f7d2a2595 100644 --- a/rostests/winetests/comdlg32/filedlg.c +++ b/rostests/winetests/comdlg32/filedlg.c @@ -29,6 +29,32 @@ /* ##### */ +static int resizesupported = TRUE; + +static void toolbarcheck( HWND hDlg) +{ + /* test toolbar properties */ + /* bug #10532 */ + int maxtextrows; + HWND ctrl; + DWORD ret; + char classname[20]; + + for( ctrl = GetWindow( hDlg, GW_CHILD); + ctrl ; ctrl = GetWindow( ctrl, GW_HWNDNEXT)) { + GetClassName( ctrl, classname, 10); + classname[7] = '\0'; + if( !strcmp( classname, "Toolbar")) break; + } + ok( ctrl != NULL, "could not get the toolbar control\n"); + ret = SendMessage( ctrl, TB_ADDSTRING, 0, (LPARAM)"winetestwinetest\0\0"); + ok( ret == 0, "addstring returned %d (expected 0)\n", ret); + maxtextrows = SendMessage( ctrl, TB_GETTEXTROWS, 0, 0); + ok( maxtextrows == 0 || broken(maxtextrows == 1), /* Win2k and below */ + "Get(Max)TextRows returned %d (expected 0)\n", maxtextrows); +} + + static UINT_PTR CALLBACK OFNHookProc( HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) { LPNMHDR nmh; @@ -49,6 +75,7 @@ static UINT_PTR CALLBACK OFNHookProc( HWND hDlg, UINT msg, WPARAM wParam, LPARAM ok(ret > 0, "CMD_GETFOLDERIDLIST not implemented\n"); if (ret > 5) ok(buf[0] == 0x66 && buf[1] == 0x66, "CMD_GETFOLDERIDLIST: The buffer was touched on failure\n"); + toolbarcheck( GetParent(hDlg)); } } @@ -78,26 +105,26 @@ static void test_DialogCancel(void) ofn.lpstrInitialDir = szInitialDir; PrintDlgA(NULL); - ok(CDERR_INITIALIZATION == CommDlgExtendedError(), "expected %d, got %d\n", - CDERR_INITIALIZATION, CommDlgExtendedError()); + ok(CDERR_INITIALIZATION == CommDlgExtendedError(), + "expected CDERR_INITIALIZATION, got %d\n", CommDlgExtendedError()); result = GetOpenFileNameA(&ofn); - ok(0 == result, "expected %d, got %d\n", 0, result); - ok(0 == CommDlgExtendedError(), "expected %d, got %d\n", 0, + ok(0 == result, "expected 0, got %d\n", result); + ok(0 == CommDlgExtendedError(), "expected 0, got %d\n", CommDlgExtendedError()); PrintDlgA(NULL); - ok(CDERR_INITIALIZATION == CommDlgExtendedError(), "expected %d, got %d\n", - CDERR_INITIALIZATION, CommDlgExtendedError()); + ok(CDERR_INITIALIZATION == CommDlgExtendedError(), + "expected CDERR_INITIALIZATION, got %d\n", CommDlgExtendedError()); result = GetSaveFileNameA(&ofn); - ok(0 == result, "expected %d, got %d\n", 0, result); - ok(0 == CommDlgExtendedError(), "expected %d, got %d\n", 0, + ok(0 == result, "expected 0, got %d\n", result); + ok(0 == CommDlgExtendedError(), "expected 0, got %d\n", CommDlgExtendedError()); PrintDlgA(NULL); - ok(CDERR_INITIALIZATION == CommDlgExtendedError(), "expected %d, got %d\n", - CDERR_INITIALIZATION, CommDlgExtendedError()); + ok(CDERR_INITIALIZATION == CommDlgExtendedError(), + "expected CDERR_INITIALIZATION, got %d\n", CommDlgExtendedError()); /* Before passing the ofn to Unicode functions, remove the ANSI strings */ ofn.lpstrFilter = NULL; @@ -105,8 +132,8 @@ static void test_DialogCancel(void) ofn.lpstrDefExt = NULL; PrintDlgA(NULL); - ok(CDERR_INITIALIZATION == CommDlgExtendedError(), "expected %d, got %d\n", - CDERR_INITIALIZATION, CommDlgExtendedError()); + ok(CDERR_INITIALIZATION == CommDlgExtendedError(), + "expected CDERR_INITIALIZATION, got %d\n", CommDlgExtendedError()); SetLastError(0xdeadbeef); result = GetOpenFileNameW((LPOPENFILENAMEW) &ofn); @@ -114,11 +141,10 @@ static void test_DialogCancel(void) win_skip("GetOpenFileNameW is not implemented\n"); else { - ok(0 == result, "expected %d, got %d\n", 0, result); + ok(0 == result, "expected 0, got %d\n", result); ok(0 == CommDlgExtendedError() || - CDERR_INITIALIZATION == CommDlgExtendedError(), /* win9x */ - "expected %d or %d, got %d\n", 0, CDERR_INITIALIZATION, - CommDlgExtendedError()); + broken(CDERR_INITIALIZATION == CommDlgExtendedError()), /* win9x */ + "expected 0, got %d\n", CommDlgExtendedError()); } SetLastError(0xdeadbeef); @@ -127,11 +153,10 @@ static void test_DialogCancel(void) win_skip("GetSaveFileNameW is not implemented\n"); else { - ok(0 == result, "expected %d, got %d\n", 0, result); + ok(0 == result, "expected 0, got %d\n", result); ok(0 == CommDlgExtendedError() || - CDERR_INITIALIZATION == CommDlgExtendedError(), /* win9x */ - "expected %d or %d, got %d\n", 0, CDERR_INITIALIZATION, - CommDlgExtendedError()); + broken(CDERR_INITIALIZATION == CommDlgExtendedError()), /* win9x */ + "expected 0, got %d\n", CommDlgExtendedError()); } } @@ -177,12 +202,19 @@ static UINT_PTR CALLBACK create_view_window2_hook(HWND dlg, UINT msg, WPARAM wPa view_params.hwndView = NULL; hr = IShellView2_CreateViewWindow2(shell_view2, &view_params); + if (hr == E_FAIL) + { + win_skip("CreateViewWindow2 is broken on Vista/W2K8\n"); + goto cleanup; + } ok(SUCCEEDED(hr), "CreateViewWindow2 returned %#x\n", hr); if (FAILED(hr)) goto cleanup; hr = IShellView2_GetCurrentInfo(shell_view2, &folder_settings); ok(SUCCEEDED(hr), "GetCurrentInfo returned %#x\n", hr); - ok(folder_settings.ViewMode == FVM_LIST, "view mode is %d, expected %d\n", folder_settings.ViewMode, FVM_LIST); + ok(folder_settings.ViewMode == FVM_LIST, + "view mode is %d, expected FVM_LIST\n", + folder_settings.ViewMode); hr = IShellView2_DestroyViewWindow(shell_view2); ok(SUCCEEDED(hr), "DestroyViewWindow returned %#x\n", hr); @@ -201,7 +233,8 @@ static UINT_PTR CALLBACK create_view_window2_hook(HWND dlg, UINT msg, WPARAM wPa ok(SUCCEEDED(hr), "GetCurrentInfo returned %#x\n", hr); ok(folder_settings.ViewMode == FVM_DETAILS || broken(folder_settings.ViewMode == FVM_LIST), /* Win9x */ - "view mode is %d, expected %d\n", folder_settings.ViewMode, FVM_DETAILS); + "view mode is %d, expected FVM_DETAILS\n", + folder_settings.ViewMode); cleanup: if (shell_view2) IShellView2_Release(shell_view2); @@ -241,7 +274,7 @@ static void test_create_view_window2(void) ofn.lStructSize = sizeof(ofn); ofn.lpstrFile = filename; - ofn.nMaxFile = 1042; + ofn.nMaxFile = 1024; ofn.lpfnHook = create_view_window2_hook; ofn.Flags = OFN_ENABLEHOOK | OFN_EXPLORER; ret = GetOpenFileNameA(&ofn); @@ -258,7 +291,7 @@ static void test_create_view_template(void) ofn.lStructSize = sizeof(ofn); ofn.lpstrFile = filename; - ofn.nMaxFile = 1042; + ofn.nMaxFile = 1024; ofn.lpfnHook = (LPOFNHOOKPROC)template_hook; ofn.Flags = OFN_ENABLEHOOK | OFN_EXPLORER| OFN_ENABLETEMPLATE; ofn.hInstance = GetModuleHandleA(NULL); @@ -270,9 +303,694 @@ static void test_create_view_template(void) ok(!ret, "CommDlgExtendedError returned %#x\n", ret); } +/* test cases for resizing of the file dialog */ +struct { + DWORD flags; + int resize_folderchange;/* change in CDN_FOLDERCHANGE handler */ + int resize_timer1; /* change in first WM_TIMER handler */ + int resize_check; /* expected change (in second WM_TIMER handler) */ + BOOL todo; /* mark that test todo_wine */ + BOOL testcontrols; /* test resizing and moving of the controls */ +} resize_testcases[] = { + { 0 , 10, 10, 20,FALSE,FALSE}, /* 0 */ + { 0 ,-10,-10,-20,FALSE,FALSE}, + { OFN_ENABLESIZING , 0, 0, 0,FALSE,FALSE}, + { OFN_ENABLESIZING , 0,-10, 0,FALSE,FALSE}, + { OFN_ENABLESIZING , 0, 10, 10,FALSE, TRUE}, + { OFN_ENABLESIZING ,-10, 0, 10,FALSE,FALSE}, /* 5 */ + { OFN_ENABLESIZING , 10, 0, 10,FALSE,FALSE}, + { OFN_ENABLESIZING , 0, 10, 20,FALSE,FALSE}, + /* mark the end */ + { 0xffffffff } +}; + +static LONG_PTR WINAPI resize_template_hook(HWND dlg, UINT msg, WPARAM wParam, LPARAM lParam) +{ + static RECT initrc, rc; + static int index, count; + static int gotSWP_bottom, gotShowWindow; + HWND parent = GetParent( dlg); + int resize; +#define MAXNRCTRLS 30 + static RECT ctrlrcs[MAXNRCTRLS]; + static int ctrlids[MAXNRCTRLS]; + static HWND ctrls[MAXNRCTRLS]; + static int nrctrls; + + switch( msg) + { + case WM_INITDIALOG: + { + DWORD style; + + index = ((OPENFILENAME*)lParam)->lCustData; + count = 0; + gotSWP_bottom = gotShowWindow = 0; + /* test style */ + style = GetWindowLong( parent, GWL_STYLE); + if( resize_testcases[index].flags & OFN_ENABLESIZING) + if( !(style & WS_SIZEBOX)) { + win_skip( "OFN_ENABLESIZING flag not supported.\n"); + resizesupported = FALSE; + PostMessage( parent, WM_COMMAND, IDCANCEL, 0); + } else + ok( style & WS_SIZEBOX, + "testid %d: dialog should have a WS_SIZEBOX style.\n", index); + else + ok( !(style & WS_SIZEBOX), + "testid %d: dialog should not have a WS_SIZEBOX style.\n", index); + break; + } + case WM_NOTIFY: + { + if(( (LPNMHDR)lParam)->code == CDN_FOLDERCHANGE){ + GetWindowRect( parent, &initrc); + if( (resize = resize_testcases[index].resize_folderchange)){ + MoveWindow( parent, initrc.left,initrc.top, initrc.right - initrc.left + resize, + initrc.bottom - initrc.top + resize, TRUE); + } + SetTimer( dlg, 0, 100, 0); + } + break; + } + case WM_TIMER: + { + if( count == 0){ + /* store the control rectangles */ + if( resize_testcases[index].testcontrols) { + HWND ctrl; + int i; + for( i = 0, ctrl = GetWindow( parent, GW_CHILD); + i < MAXNRCTRLS && ctrl; + i++, ctrl = GetWindow( ctrl, GW_HWNDNEXT)) { + ctrlids[i] = GetDlgCtrlID( ctrl); + GetWindowRect( ctrl, &ctrlrcs[i]); + MapWindowPoints( NULL, parent, (LPPOINT) &ctrlrcs[i], 2); + ctrls[i] = ctrl; + } + nrctrls = i; + } + if( (resize = resize_testcases[index].resize_timer1)){ + GetWindowRect( parent, &rc); + MoveWindow( parent, rc.left,rc.top, rc.right - rc.left + resize, + rc.bottom - rc.top + resize, TRUE); + } + } else if( count == 1){ + resize = resize_testcases[index].resize_check; + GetWindowRect( parent, &rc); + if( resize_testcases[index].todo){ + todo_wine { + ok( resize == rc.right - rc.left - initrc.right + initrc.left, + "testid %d size-x change %d expected %d\n", index, + rc.right - rc.left - initrc.right + initrc.left, resize); + ok( resize == rc.bottom - rc.top - initrc.bottom + initrc.top, + "testid %d size-y change %d expected %d\n", index, + rc.bottom - rc.top - initrc.bottom + initrc.top, resize); + } + }else{ + ok( resize == rc.right - rc.left - initrc.right + initrc.left, + "testid %d size-x change %d expected %d\n", index, + rc.right - rc.left - initrc.right + initrc.left, resize); + ok( resize == rc.bottom - rc.top - initrc.bottom + initrc.top, + "testid %d size-y change %d expected %d\n", index, + rc.bottom - rc.top - initrc.bottom + initrc.top, resize); + } + if( resize_testcases[index].testcontrols) { + int i; + RECT rc; + for( i = 0; i < nrctrls; i++) { + GetWindowRect( ctrls[i], &rc); + MapWindowPoints( NULL, parent, (LPPOINT) &rc, 2); + switch( ctrlids[i]){ + +/* test if RECT R1, moved and sized result in R2 */ +#define TESTRECTS( R1, R2, Mx, My, Sx, Sy) \ + ((R1).left + (Mx) ==(R2).left \ + &&(R1).top + (My) ==(R2).top \ + &&(R1).right + (Mx) + (Sx) == (R2).right \ + &&(R1).bottom + (My) + (Sy) ==(R2).bottom) + + /* sized horizontal and moved vertical */ + case cmb1: + case edt1: + ok( TESTRECTS( ctrlrcs[i], rc, 0, 10, 10, 0) || + broken(TESTRECTS( ctrlrcs[i], rc, 0, 10, 0, 0)),/*win98*/ + "control id %03x should have sized horizontally and moved vertically, before %d,%d-%d,%d after %d,%d-%d,%d\n", + ctrlids[i], ctrlrcs[i].left, ctrlrcs[i].top, + ctrlrcs[i].right, ctrlrcs[i].bottom, + rc.left, rc.top, rc.right, rc.bottom); + break; + /* sized horizontal and vertical */ + case lst2: + ok( TESTRECTS( ctrlrcs[i], rc, 0, 0, 10, 10), + "control id %03x should have sized horizontally and vertically, before %d,%d-%d,%d after %d,%d-%d,%d\n", + ctrlids[i], ctrlrcs[i].left, ctrlrcs[i].top, + ctrlrcs[i].right, ctrlrcs[i].bottom, + rc.left, rc.top, rc.right, rc.bottom); + break; + /* moved horizontal and vertical */ + case IDCANCEL: + case pshHelp: + ok( TESTRECTS( ctrlrcs[i], rc, 10, 10, 0, 0) || + broken(TESTRECTS( ctrlrcs[i], rc, 0, 10, 0, 0)),/*win98*/ + "control id %03x should have moved horizontally and vertically, before %d,%d-%d,%d after %d,%d-%d,%d\n", + ctrlids[i], ctrlrcs[i].left, ctrlrcs[i].top, + ctrlrcs[i].right, ctrlrcs[i].bottom, + rc.left, rc.top, rc.right, rc.bottom); + break; + /* moved vertically */ + case chx1: + case stc2: + case stc3: + ok( TESTRECTS( ctrlrcs[i], rc, 0, 10, 0, 0), + "control id %03x should have moved vertically, before %d,%d-%d,%d after %d,%d-%d,%d\n", + ctrlids[i], ctrlrcs[i].left, ctrlrcs[i].top, + ctrlrcs[i].right, ctrlrcs[i].bottom, + rc.left, rc.top, rc.right, rc.bottom); + break; + /* resized horizontal */ + case cmb2: /* aka IDC_LOOKIN */ + ok( TESTRECTS( ctrlrcs[i], rc, 0, 0, 10, 0)|| + TESTRECTS( ctrlrcs[i], rc, 0, 0, 0, 0), /* Vista and higher */ + "control id %03x should have resized horizontally, before %d,%d-%d,%d after %d,%d-%d,%d\n", + ctrlids[i], ctrlrcs[i].left, ctrlrcs[i].top, + ctrlrcs[i].right, ctrlrcs[i].bottom, + rc.left, rc.top, rc.right, rc.bottom); + break; + /* non moving non sizing controls */ + case stc4: + ok( TESTRECTS( rc, ctrlrcs[i], 0, 0, 0, 0), + "control id %03x was moved/resized, before %d,%d-%d,%d after %d,%d-%d,%d\n", + ctrlids[i], ctrlrcs[i].left, ctrlrcs[i].top, + ctrlrcs[i].right, ctrlrcs[i].bottom, + rc.left, rc.top, rc.right, rc.bottom); + break; + /* todo_wine: non moving non sizing controls */ + case lst1: +todo_wine + ok( TESTRECTS( rc, ctrlrcs[i], 0, 0, 0, 0), + "control id %03x was moved/resized, before %d,%d-%d,%d after %d,%d-%d,%d\n", + ctrlids[i], ctrlrcs[i].left, ctrlrcs[i].top, + ctrlrcs[i].right, ctrlrcs[i].bottom, + rc.left, rc.top, rc.right, rc.bottom); + break; + /* don't test: id is not unique */ + case IDOK: + case stc1: + case 0: + case -1: + break; + default: + trace("untested control id %03x before %d,%d-%d,%d after %d,%d-%d,%d\n", + ctrlids[i], ctrlrcs[i].left, ctrlrcs[i].top, + ctrlrcs[i].right, ctrlrcs[i].bottom, + rc.left, rc.top, rc.right, rc.bottom); +#undef TESTRECTS +#undef MAXNRCTRLS + } + } + } + KillTimer( dlg, 0); + PostMessage( parent, WM_COMMAND, IDCANCEL, 0); + } + count++; + } + break; + case WM_WINDOWPOSCHANGING: + { + WINDOWPOS *pwp = (WINDOWPOS *)lParam; + if( !index && pwp->hwndInsertAfter == HWND_BOTTOM){ + gotSWP_bottom = 1; + ok( gotShowWindow == 0, "The WM_WINDOWPOSCHANGING message came after a WM_SHOWWINDOW message\n"); + } + } + break; + case WM_SHOWWINDOW: + { + if( !index){ + gotShowWindow = 1; + ok( gotSWP_bottom == 1, "No WM_WINDOWPOSCHANGING message came before a WM_SHOWWINDOW message\n"); + } + } + break; + } + return 0; +} + +static void test_resize(void) +{ + OPENFILENAME ofn = { sizeof(OPENFILENAME)}; + char filename[1024] = {0}; + DWORD ret; + int i; + + ofn.lpstrFile = filename; + ofn.nMaxFile = 1024; + ofn.lpfnHook = (LPOFNHOOKPROC) resize_template_hook; + ofn.hInstance = GetModuleHandle(NULL); + ofn.lpTemplateName = "template_sz"; + for( i = 0; resize_testcases[i].flags != 0xffffffff; i++) { + ofn.lCustData = i; + ofn.Flags = resize_testcases[i].flags | + OFN_ENABLEHOOK | OFN_EXPLORER| OFN_ENABLETEMPLATE | OFN_SHOWHELP ; + ret = GetOpenFileName(&ofn); + ok(!ret, "GetOpenFileName returned %#x\n", ret); + ret = CommDlgExtendedError(); + ok(!ret, "CommDlgExtendedError returned %#x\n", ret); + } +} + +/* test cases for control message IDOK */ +/* Show case for bug #19079 */ +static struct { + int retval; /* return code of the message handler */ + BOOL setmsgresult; /* set the result in the DWLP_MSGRESULT */ + BOOL usemsgokstr; /* use the FILEOKSTRING message instead of WM_NOTIFY:CDN_FILEOK */ + BOOL do_subclass; /* subclass the dialog hook procedure */ + BOOL expclose; /* is the dialog expected to close ? */ + BOOL actclose; /* has the dialog actually closed ? */ +} ok_testcases[] = { + { 0, FALSE, FALSE, FALSE, TRUE}, + { 0, TRUE, FALSE, FALSE, TRUE}, + { 0, FALSE, FALSE, TRUE, TRUE}, + { 0, TRUE, FALSE, TRUE, TRUE}, + { 1, FALSE, FALSE, FALSE, TRUE}, + { 1, TRUE, FALSE, FALSE, FALSE}, + { 1, FALSE, FALSE, TRUE, FALSE}, + { 1, TRUE, FALSE, TRUE, FALSE}, + /* FILEOKSTRING tests */ + { 1, TRUE, TRUE, FALSE, FALSE}, + { 1, FALSE, TRUE, TRUE, FALSE}, + /* mark the end */ + { -1 } +}; + +/* test_ok_wndproc can be used as hook procedure or a subclass + * window proc for the file dialog */ +static LONG_PTR WINAPI test_ok_wndproc(HWND dlg, UINT msg, WPARAM wParam, LPARAM lParam) +{ + HWND parent = GetParent( dlg); + static int index; + static UINT msgFILEOKSTRING; + if (msg == WM_INITDIALOG) + { + index = ((OPENFILENAME*)lParam)->lCustData; + ok_testcases[index].actclose = TRUE; + msgFILEOKSTRING = RegisterWindowMessageA( FILEOKSTRING); + } + if( msg == WM_NOTIFY) { + if(((LPNMHDR)lParam)->code == CDN_FOLDERCHANGE) { + SetTimer( dlg, 0, 100, 0); + PostMessage( parent, WM_COMMAND, IDOK, 0); + return FALSE; + } else if(((LPNMHDR)lParam)->code == CDN_FILEOK) { + if( ok_testcases[index].usemsgokstr) + return FALSE; + if( ok_testcases[index].setmsgresult) + SetWindowLongPtrA( dlg, DWLP_MSGRESULT, ok_testcases[index].retval); + return ok_testcases[index].retval; + } + } + if( msg == msgFILEOKSTRING) { + if( !ok_testcases[index].usemsgokstr) + return FALSE; + if( ok_testcases[index].setmsgresult) + SetWindowLongPtrA( dlg, DWLP_MSGRESULT, ok_testcases[index].retval); + return ok_testcases[index].retval; + } + if( msg == WM_TIMER) { + /* the dialog did not close automatically */ + ok_testcases[index].actclose = FALSE; + KillTimer( dlg, 0); + PostMessage( parent, WM_COMMAND, IDCANCEL, 0); + return FALSE; + } + if( ok_testcases[index].do_subclass) + return DefWindowProc( dlg, msg, wParam, lParam); + return FALSE; +} + +static LONG_PTR WINAPI ok_template_hook(HWND dlg, UINT msg, WPARAM wParam, LPARAM lParam) +{ + if (msg == WM_SETFONT) + SetWindowLongPtrA( dlg, GWLP_WNDPROC, (LONG_PTR) test_ok_wndproc); + return FALSE; +} + +static void test_ok(void) +{ + OPENFILENAME ofn = { sizeof(OPENFILENAME)}; + char filename[1024] = {0}; + char tmpfilename[ MAX_PATH]; + char curdir[MAX_PATH]; + int i; + DWORD ret; + + ok(GetCurrentDirectoryA(sizeof(curdir), curdir) != 0, "Failed to get current dir err %d\n", GetLastError()); + if (!GetTempFileNameA(".", "txt", 0, tmpfilename)) { + skip("Failed to create a temporary file name\n"); + return; + } + ofn.lpstrFile = filename; + ofn.nMaxFile = 1024; + ofn.hInstance = GetModuleHandle(NULL); + ofn.lpTemplateName = "template1"; + ofn.Flags = OFN_ENABLEHOOK | OFN_EXPLORER| OFN_ENABLETEMPLATE ; + for( i = 0; ok_testcases[i].retval != -1; i++) { + strcpy( filename, tmpfilename); + ofn.lCustData = i; + ofn.lpfnHook = ok_testcases[i].do_subclass + ? (LPOFNHOOKPROC) ok_template_hook + : (LPOFNHOOKPROC) test_ok_wndproc; + ret = GetOpenFileNameA(&ofn); + ok( ok_testcases[i].expclose == ok_testcases[i].actclose, + "testid %d: Open File dialog should %shave closed.\n", i, + ok_testcases[i].expclose ? "" : "NOT "); + ok(ret == ok_testcases[i].expclose, "testid %d: GetOpenFileName returned %#x\n", i, ret); + ret = CommDlgExtendedError(); + ok(!ret, "CommDlgExtendedError returned %#x\n", ret); + ok(SetCurrentDirectoryA(curdir), "Failed to restore current dir err %d\n", GetLastError()); + } + ret = DeleteFileA( tmpfilename); + ok( ret, "Failed to delete temporary file %s err %d\n", tmpfilename, GetLastError()); +} + +/* test arranging with a custom template */ +typedef struct { + int x, y; /* left, top coordinates */ + int cx, cy; /* width and height */ +} posz; +static struct { + int nrcontrols; /* 0: no controls, 1: just the stc32 control 2: with button */ + posz poszDlg; + posz poszStc32; + posz poszBtn; + DWORD ofnflags; +} arrange_tests[] = { + /* do not change the first two cases: used to get the uncustomized sizes */ + { 0, {0},{0},{0},0 }, + { 0, {0},{0},{0}, OFN_SHOWHELP}, + /* two tests with just a subdialog, no controls */ + { 0, {0, 0, 316, 76},{0},{0},0 }, + { 0, {0, 0, 100, 76},{0},{0}, OFN_SHOWHELP}, + /* now with a control with id stc32 */ + { 1, {0, 0, 316, 76} ,{0, 0, 204, 76,},{0},0 }, /* bug #17748*/ + { 1, {0, 0, 316, 76} ,{0, 0, 204, 76,},{0}, OFN_SHOWHELP}, /* bug #17748*/ + /* tests with size of the stc32 control higher or wider then the standard dialog */ + { 1, {0, 0, 316, 170} ,{0, 0, 204, 170,},{0},0 }, + { 1, {0, 0, 316, 165} ,{0, 0, 411, 165,},{0}, OFN_SHOWHELP }, + /* move the stc32 control around */ + { 1, {0, 0, 300, 100} ,{73, 17, 50, 50,},{0},0 }, + /* add control */ + { 2, {0, 0, 280, 100} ,{0, 0, 50, 50,},{300,20,30,30},0 }, + /* enable resizing should make the dialog bigger */ + { 0, {0},{0},{0}, OFN_SHOWHELP|OFN_ENABLESIZING}, + /* mark the end */ + { -1 } +}; + +static LONG_PTR WINAPI template_hook_arrange(HWND dlgChild, UINT msg, WPARAM wParam, LPARAM lParam) +{ + static int index, fixhelp; + static posz posz0[2]; + static RECT clrcParent, clrcChild, rcStc32; + static HWND hwndStc32; + HWND dlgParent; + + dlgParent = GetParent( dlgChild); + if (msg == WM_INITDIALOG) { + index = ((OPENFILENAME*)lParam)->lCustData; + /* get the positions before rearrangement */ + GetClientRect( dlgParent, &clrcParent); + GetClientRect( dlgChild, &clrcChild); + hwndStc32 = GetDlgItem( dlgChild, stc32); + if( hwndStc32) GetWindowRect( hwndStc32, &rcStc32); + } + if (msg == WM_NOTIFY && ((LPNMHDR)lParam)->code == CDN_FOLDERCHANGE) { + RECT wrcParent; + + GetWindowRect( dlgParent, &wrcParent); + /* the fist two "tests" just save the dialogs position, with and without + * help button */ + if( index == 0) { + posz0[0].x = wrcParent.left; + posz0[0].y = wrcParent.top; + posz0[0].cx = wrcParent.right - wrcParent.left; + posz0[0].cy = wrcParent.bottom - wrcParent.top; + } else if( index == 1) { + posz0[1].x = wrcParent.left; + posz0[1].y = wrcParent.top; + posz0[1].cx = wrcParent.right - wrcParent.left; + posz0[1].cy = wrcParent.bottom - wrcParent.top; + fixhelp = posz0[1].cy - posz0[0].cy; + } else { + /* the real tests */ + int withhelp; + int expectx, expecty; + DWORD style; + + withhelp = (arrange_tests[index].ofnflags & OFN_SHOWHELP) != 0; + GetWindowRect( dlgParent, &wrcParent); + if( !hwndStc32) { + /* case with no custom subitem with stc32: + * default to all custom controls below the standard */ + expecty = posz0[withhelp].cy + clrcChild.bottom; + expectx = posz0[withhelp].cx; + } else { + /* special case: there is a control with id stc32 */ + /* expected height */ + expecty = posz0[withhelp].cy; + if( rcStc32.bottom - rcStc32.top > clrcParent.bottom) { + expecty += clrcChild.bottom - clrcParent.bottom; + if( !withhelp) expecty += fixhelp; + } + else + expecty += clrcChild.bottom - ( rcStc32.bottom - rcStc32.top) ; + /* expected width */ + expectx = posz0[withhelp].cx; + if( rcStc32.right - rcStc32.left > clrcParent.right) { + expectx += clrcChild.right - clrcParent.right; + } + else + expectx += clrcChild.right - ( rcStc32.right - rcStc32.left) ; + } + style = GetWindowLong( dlgParent, GWL_STYLE); + if( !(style & WS_SIZEBOX)) { + /* without the OFN_ENABLESIZING flag */ + ok( wrcParent.bottom - wrcParent.top == expecty, + "Wrong height of dialog %d, expected %d\n", + wrcParent.bottom - wrcParent.top, expecty); + ok( wrcParent.right - wrcParent.left == expectx, + "Wrong width of dialog %d, expected %d\n", + wrcParent.right - wrcParent.left, expectx); + } else todo_wine { + /* with the OFN_ENABLESIZING flag */ + ok( wrcParent.bottom - wrcParent.top > expecty, + "Wrong height of dialog %d, expected more than %d\n", + wrcParent.bottom - wrcParent.top, expecty); + ok( wrcParent.right - wrcParent.left > expectx, + "Wrong width of dialog %d, expected more than %d\n", + wrcParent.right - wrcParent.left, expectx); + } + + } + PostMessage( dlgParent, WM_COMMAND, IDCANCEL, 0); + } + return 0; +} + +static void test_arrange(void) +{ + OPENFILENAMEA ofn = {0}; + char filename[1024] = {0}; + DWORD ret; + HRSRC hRes; + HANDLE hDlgTmpl; + LPBYTE pv; + DLGTEMPLATE *template; + DLGITEMTEMPLATE *itemtemplateStc32, *itemtemplateBtn; + int i; + + /* load subdialog template into memory */ + hRes = FindResource( GetModuleHandle(NULL), "template_stc32", (LPSTR)RT_DIALOG); + hDlgTmpl = LoadResource( GetModuleHandle(NULL), hRes ); + /* get pointers to the structures for the dialog and the controls */ + pv = LockResource( hDlgTmpl ); + template = (DLGTEMPLATE*)pv; + if( template->x != 11111) { + win_skip("could not find the dialog template\n"); + return; + } + /* skip dialog template, menu, class and title */ + pv += sizeof(DLGTEMPLATE); + pv += 3 * sizeof(WORD); + /* skip font info */ + while( *(WORD*)pv) + pv += sizeof(WORD); + pv += sizeof(WORD); + /* align on 32 bit boundaries */ + pv = (LPBYTE)(((UINT_PTR)pv + 3 ) & ~3); + itemtemplateStc32 = (DLGITEMTEMPLATE*)pv; + if( itemtemplateStc32->x != 22222) { + win_skip("could not find the first item template\n"); + return; + } + /* skip itemtemplate, class, title and creation data */ + pv += sizeof(DLGITEMTEMPLATE); + pv += 4 * sizeof(WORD); + /* align on 32 bit boundaries */ + pv = (LPBYTE)(((UINT_PTR)pv + 3 ) & ~3); + itemtemplateBtn = (DLGITEMTEMPLATE*)pv; + if( itemtemplateBtn->x != 12345) { + win_skip("could not find the second item template\n"); + return; + } + + ofn.lStructSize = sizeof(ofn); + ofn.lpstrFile = filename; + ofn.nMaxFile = 1024; + ofn.lpfnHook = (LPOFNHOOKPROC)template_hook_arrange; + ofn.hInstance = hDlgTmpl; + ofn.lpstrFilter="text\0*.txt\0All\0*\0\0"; + for( i = 0; arrange_tests[i].nrcontrols != -1; i++) { + ofn.lCustData = i; + ofn.Flags = OFN_ENABLEHOOK | OFN_EXPLORER| OFN_ENABLETEMPLATEHANDLE | OFN_HIDEREADONLY | + arrange_tests[i].ofnflags; + template->cdit = arrange_tests[i].nrcontrols; + template->x = arrange_tests[i].poszDlg.x; + template->y = arrange_tests[i].poszDlg.y; + template->cx = arrange_tests[i].poszDlg.cx; + template->cy = arrange_tests[i].poszDlg.cy; + itemtemplateStc32->x = arrange_tests[i].poszStc32.x; + itemtemplateStc32->y = arrange_tests[i].poszStc32.y; + itemtemplateStc32->cx = arrange_tests[i].poszStc32.cx; + itemtemplateStc32->cy = arrange_tests[i].poszStc32.cy; + itemtemplateBtn->x = arrange_tests[i].poszBtn.x; + itemtemplateBtn->y = arrange_tests[i].poszBtn.y; + itemtemplateBtn->cx = arrange_tests[i].poszBtn.cx; + itemtemplateBtn->cy = arrange_tests[i].poszBtn.cy; + ret = GetOpenFileNameA(&ofn); + ok(!ret, "GetOpenFileNameA returned %#x\n", ret); + ret = CommDlgExtendedError(); + ok(!ret, "CommDlgExtendedError returned %#x\n", ret); + } +} + +static CHAR SYSDIR[MAX_PATH]; + +static UINT_PTR CALLBACK path_hook_proc( HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) +{ + LPNMHDR nmh; + + if( msg == WM_NOTIFY) + { + nmh = (LPNMHDR) lParam; + if( nmh->code == CDN_INITDONE) + { + PostMessage( GetParent(hDlg), WM_COMMAND, IDCANCEL, FALSE); + } + else if ( nmh->code == CDN_FOLDERCHANGE) + { + char buf[1024]; + int ret; + + memset(buf, 0x66, sizeof(buf)); + ret = SendMessageA( GetParent(hDlg), CDM_GETFOLDERPATH, sizeof(buf), (LPARAM)buf); + ok(!lstrcmpiA(SYSDIR, buf), "Expected '%s', got '%s'\n", SYSDIR, buf); + ok(lstrlenA(SYSDIR) + 1 == ret, "Expected %d, got %d\n", lstrlenA(SYSDIR) + 1, ret); + } + } + + return 0; +} + +static void test_getfolderpath(void) +{ + OPENFILENAMEA ofn; + BOOL result; + char szFileName[MAX_PATH] = ""; + char szInitialDir[MAX_PATH]; + + /* We need to pick a different directory as the other tests because of new + * Windows 7 behavior. + */ + GetSystemDirectory(szInitialDir, MAX_PATH); + lstrcpyA(SYSDIR, szInitialDir); + + ZeroMemory(&ofn, sizeof(ofn)); + + ofn.lStructSize = sizeof(ofn); + ofn.hwndOwner = NULL; + ofn.lpstrFilter = "Text Files (*.txt)\0*.txt\0All Files (*.*)\0*.*\0"; + ofn.lpstrFile = szFileName; + ofn.nMaxFile = MAX_PATH; + ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_ENABLEHOOK; + ofn.lpstrDefExt = "txt"; + ofn.lpfnHook = path_hook_proc; + ofn.lpstrInitialDir = szInitialDir; + + result = GetOpenFileNameA(&ofn); + ok(0 == result, "expected 0, got %d\n", result); + ok(0 == CommDlgExtendedError(), "expected 0, got %d\n", + CommDlgExtendedError()); + + result = GetSaveFileNameA(&ofn); + ok(0 == result, "expected 0, got %d\n", result); + ok(0 == CommDlgExtendedError(), "expected 0, got %d\n", + CommDlgExtendedError()); +} + +static void test_resizable2(void) +{ + OPENFILENAMEA ofn = {0}; + char filename[1024] = "pls press Enter if sizable, Esc otherwise"; + DWORD ret; + + /* interactive because there is no hook function */ + if( !winetest_interactive) { + skip( "some interactive resizable dialog tests (set WINETEST_INTERACTIVE=1)\n"); + return; + } + ofn.lStructSize = sizeof(ofn); + ofn.lpstrFile = filename; + ofn.nMaxFile = 1024; + ofn.lpfnHook = NULL; + ofn.hInstance = GetModuleHandleA(NULL); + ofn.lpTemplateName = "template1"; + ofn.Flags = OFN_EXPLORER; +#define ISSIZABLE 1 + ret = GetOpenFileNameA(&ofn); + ok( ret == ISSIZABLE, "File Dialog should have been sizable\n"); + ret = CommDlgExtendedError(); + ok(!ret, "CommDlgExtendedError returned %#x\n", ret); + ofn.Flags = OFN_EXPLORER | OFN_ENABLETEMPLATE; + ret = GetOpenFileNameA(&ofn); + ok( ret != ISSIZABLE, "File Dialog should NOT have been sizable\n"); + ret = CommDlgExtendedError(); + ok(!ret, "CommDlgExtendedError returned %#x\n", ret); + ofn.Flags = OFN_EXPLORER | OFN_ENABLETEMPLATEHANDLE; + ofn.hInstance = LoadResource( GetModuleHandle(NULL), FindResource( GetModuleHandle(NULL), "template1", (LPSTR)RT_DIALOG)); + ofn.lpTemplateName = NULL; + ret = GetOpenFileNameA(&ofn); + ok( ret != ISSIZABLE, "File Dialog should NOT have been sizable\n"); + ret = CommDlgExtendedError(); + ok(!ret, "CommDlgExtendedError returned %#x\n", ret); + ofn.Flags = OFN_EXPLORER | OFN_ENABLEHOOK; + ret = GetOpenFileNameA(&ofn); + ok( ret != ISSIZABLE, "File Dialog should NOT have been sizable\n"); + ret = CommDlgExtendedError(); + ok(!ret, "CommDlgExtendedError returned %#x\n", ret); +#undef ISSIZABLE +} + START_TEST(filedlg) { test_DialogCancel(); test_create_view_window2(); test_create_view_template(); + test_arrange(); + test_resize(); + test_ok(); + test_getfolderpath(); + if( resizesupported) test_resizable2(); } diff --git a/rostests/winetests/comdlg32/fontdlg.c b/rostests/winetests/comdlg32/fontdlg.c new file mode 100644 index 00000000000..57c1d908214 --- /dev/null +++ b/rostests/winetests/comdlg32/fontdlg.c @@ -0,0 +1,150 @@ +/* + * Unit test suite for comdlg32 API functions: font dialogs + * + * Copyright 2009 Vincent Povirk for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + * + */ + +#include + +#include "windef.h" +#include "winbase.h" +#include "winerror.h" +#include "wingdi.h" +#include "winspool.h" +#include "winuser.h" +#include "objbase.h" + +#include "commdlg.h" + +#include "wine/test.h" + +static int get_dpiy(void) +{ + HDC hdc; + int result; + + hdc = GetDC(0); + result = GetDeviceCaps(hdc, LOGPIXELSY); + ReleaseDC(0, hdc); + + return result; +} + +static HDC get_printer_ic(void) +{ + PRINTER_INFO_2A *info; + DWORD info_size, num_printers=0; + BOOL ret; + HDC result=NULL; + + EnumPrintersA(PRINTER_ENUM_LOCAL, NULL, 2, NULL, 0, &info_size, &num_printers); + + if (info_size == 0) + return NULL; + + info = HeapAlloc(GetProcessHeap(), 0, info_size); + + ret = EnumPrintersA(PRINTER_ENUM_LOCAL, NULL, 2, (LPBYTE)info, info_size, &info_size, &num_printers); + + if (ret) + result = CreateICA(info->pDriverName, info->pPrinterName, NULL, NULL); + + HeapFree(GetProcessHeap(), 0, info); + + return result; +} + +static UINT_PTR CALLBACK CFHookProcOK(HWND hdlg, UINT msg, WPARAM wparam, LPARAM lparam) +{ + switch (msg) + { + case WM_INITDIALOG: + PostMessageA(hdlg, WM_COMMAND, IDOK, FALSE); + return 0; + default: + return 0; + } +} + +static void test_ChooseFontA(void) +{ + LOGFONTA lfa; + CHOOSEFONTA cfa; + BOOL ret; + int dpiy = get_dpiy(); + int expected_pointsize, expected_lfheight; + HDC printer_ic; + + memset(&lfa, 0, sizeof(LOGFONTA)); + lfa.lfHeight = -16; + lfa.lfWeight = FW_NORMAL; + strcpy(lfa.lfFaceName, "Symbol"); + + memset(&cfa, 0, sizeof(CHOOSEFONTA)); + cfa.lStructSize = sizeof(cfa); + cfa.lpLogFont = &lfa; + cfa.Flags = CF_ENABLEHOOK|CF_INITTOLOGFONTSTRUCT|CF_SCREENFONTS; + cfa.lpfnHook = CFHookProcOK; + + ret = ChooseFontA(&cfa); + + expected_pointsize = MulDiv(16, 72, dpiy) * 10; + expected_lfheight = -MulDiv(expected_pointsize, dpiy, 720); + + ok(ret == TRUE, "ChooseFontA returned FALSE\n"); + ok(cfa.iPointSize == expected_pointsize, "Expected %i, got %i\n", expected_pointsize, cfa.iPointSize); + ok(lfa.lfHeight == expected_lfheight, "Expected %i, got %i\n", expected_lfheight, lfa.lfHeight); + ok(lfa.lfWeight == FW_NORMAL, "Expected FW_NORMAL, got %i\n", lfa.lfWeight); + ok(strcmp(lfa.lfFaceName, "Symbol") == 0, "Expected Symbol, got %s\n", lfa.lfFaceName); + + printer_ic = get_printer_ic(); + if (!printer_ic) + skip("can't get a DC for a local printer\n"); + else + { + memset(&lfa, 0, sizeof(LOGFONTA)); + lfa.lfHeight = -16; + lfa.lfWeight = FW_NORMAL; + strcpy(lfa.lfFaceName, "Symbol"); + + memset(&cfa, 0, sizeof(CHOOSEFONTA)); + cfa.lStructSize = sizeof(cfa); + cfa.lpLogFont = &lfa; + cfa.Flags = CF_ENABLEHOOK|CF_INITTOLOGFONTSTRUCT|CF_PRINTERFONTS; + cfa.hDC = printer_ic; + cfa.lpfnHook = CFHookProcOK; + + ret = ChooseFontA(&cfa); + + expected_pointsize = MulDiv(16, 72, dpiy) * 10; + expected_lfheight = -MulDiv(expected_pointsize, dpiy, 720); + + ok(ret == TRUE, "ChooseFontA returned FALSE\n"); + ok(cfa.iPointSize == expected_pointsize, "Expected %i, got %i\n", expected_pointsize, cfa.iPointSize); + ok(lfa.lfHeight == expected_lfheight, "Expected %i, got %i\n", expected_lfheight, lfa.lfHeight); + ok(lfa.lfWeight == FW_NORMAL, "Expected FW_NORMAL, got %i\n", lfa.lfWeight); + ok(strcmp(lfa.lfFaceName, "Symbol") == 0, "Expected Symbol, got %s\n", lfa.lfFaceName); + + DeleteDC(printer_ic); + } +} + +START_TEST(fontdlg) +{ + test_ChooseFontA(); +} diff --git a/rostests/winetests/comdlg32/printdlg.c b/rostests/winetests/comdlg32/printdlg.c index ec63da9a6c7..f021b019299 100644 --- a/rostests/winetests/comdlg32/printdlg.c +++ b/rostests/winetests/comdlg32/printdlg.c @@ -246,6 +246,11 @@ static void test_PrintDlgExW(void) PrintDlg(NULL); SetLastError(0xdeadbeef); res = pPrintDlgExW(NULL); + if(res == E_NOTIMPL) + { + win_skip("PrintDlgExW returns not implemented\n"); + return; + } ok( (res == E_INVALIDARG), "got 0x%x with %u and %u (expected 'E_INVALIDARG')\n", res, GetLastError(), CommDlgExtendedError()); @@ -318,6 +323,8 @@ static void test_abort_proc(void) ok(DeleteFileA(filename), "Failed to delete temporary file\n"); return; } + GlobalFree(pd.hDevMode); + GlobalFree(pd.hDevNames); ok(pd.hDC != NULL, "PrintDlg didn't return a DC.\n"); if (!(print_dc = pd.hDC)) @@ -346,25 +353,19 @@ static void test_abort_proc(void) goto end; } - ok(abort_proc_called, "AbortProc didn't get called by StartDoc.\n"); - abort_proc_called = FALSE; + /* StartDoc may or may not call abort proc */ + abort_proc_called = FALSE; ok(StartPage(print_dc) > 0, "StartPage failed\n"); ok(!abort_proc_called, "AbortProc got called unexpectedly by StartPage.\n"); abort_proc_called = FALSE; + /* following functions sometimes call abort proc too */ ok(FillRect(print_dc, &rect, (HBRUSH)(COLOR_BACKGROUND + 1)), "FillRect failed\n"); - ok(!abort_proc_called, "AbortProc got called unexpectedly by StretchBlt.\n"); - abort_proc_called = FALSE; - ok(EndPage(print_dc) > 0, "EndPage failed\n"); - ok(!abort_proc_called, "AbortProc got called unexpectedly by EndPage.\n"); - abort_proc_called = FALSE; - ok(EndDoc(print_dc) > 0, "EndDoc failed\n"); - ok(!abort_proc_called, "AbortProc got called unexpectedly by EndDoc.\n"); - abort_proc_called = FALSE; + abort_proc_called = FALSE; ok(DeleteDC(print_dc), "DeleteDC failed\n"); ok(!abort_proc_called, "AbortProc got called unexpectedly by DeleteDC.\n"); abort_proc_called = FALSE; diff --git a/rostests/winetests/comdlg32/rsrc.rc b/rostests/winetests/comdlg32/rsrc.rc index 51415fddb26..65e7972ffa4 100644 --- a/rostests/winetests/comdlg32/rsrc.rc +++ b/rostests/winetests/comdlg32/rsrc.rc @@ -32,3 +32,28 @@ FONT 8, "MS Shell Dlg" LTEXT "",-1,28,16,204,31 EDITTEXT 56,65,2,200,12,ES_AUTOHSCROLL } + +/* Used by the resize file dialog tests. + * Keep this template small or get failures + * resizing on small desk tops. + * This will work with 640x480 pixels + */ +TEMPLATE_SZ DIALOG LOADONCALL MOVEABLE DISCARDABLE 5, 43, 300, 40 +STYLE WS_CHILD | WS_CLIPSIBLINGS +FONT 8, "MS Shell Dlg" +{ + LTEXT "Path:",-1,28,4,36,8 + LTEXT "Text1",-1,4,16,20,40 + LTEXT "Text2",-1,232,20,65,8 + LTEXT "",-1,28,16,204,31 + EDITTEXT 56,65,2,200,12,ES_AUTOHSCROLL +} + +/* note: the test program will modify coordinates and nr of controls in this template */ +TEMPLATE_STC32 DIALOG LOADONCALL MOVEABLE DISCARDABLE 11111, 0, 316, 76 +STYLE WS_CHILD | WS_CLIPSIBLINGS +FONT 8, "MS Shell Dlg" +{ + LTEXT "", 1119, 22222, 0, 204, 76 + PUSHBUTTON "TEST", -1, 12345, 0, 20, 20 +} diff --git a/rostests/winetests/crypt32/chain.c b/rostests/winetests/crypt32/chain.c index a626b82c4fe..f9ccaed78b1 100644 --- a/rostests/winetests/crypt32/chain.c +++ b/rostests/winetests/crypt32/chain.c @@ -58,6 +58,8 @@ static VOID (WINAPI *pCertFreeCertificateChain)(PCCERT_CHAIN_CONTEXT); static VOID (WINAPI *pCertFreeCertificateChainEngine)(HCERTCHAINENGINE); static BOOL (WINAPI *pCertVerifyCertificateChainPolicy)(LPCSTR,PCCERT_CHAIN_CONTEXT,PCERT_CHAIN_POLICY_PARA,PCERT_CHAIN_POLICY_STATUS); +#define IS_INTOID(x) (((ULONG_PTR)(x) >> 16) == 0) + static void testCreateCertChainEngine(void) { @@ -3883,19 +3885,19 @@ static void checkChainPolicyStatus(LPCSTR policy, const ChainPolicyCheck *check, if (check->todo & TODO_POLICY) todo_wine ok(ret, "%s[%d]: CertVerifyCertificateChainPolicy failed: %08x\n", - HIWORD(policy) ? policy : num_to_str(LOWORD(policy)), + IS_INTOID(policy) ? num_to_str(LOWORD(policy)) : policy, testIndex, GetLastError()); else { if (!ret && GetLastError() == ERROR_FILE_NOT_FOUND) { skip("%d: missing policy %s, skipping test\n", testIndex, - HIWORD(policy) ? policy : num_to_str(LOWORD(policy))); + IS_INTOID(policy) ? num_to_str(LOWORD(policy)) : policy); pCertFreeCertificateChain(chain); return; } ok(ret, "%s[%d]: CertVerifyCertificateChainPolicy failed: %08x\n", - HIWORD(policy) ? policy : num_to_str(LOWORD(policy)), testIndex, + IS_INTOID(policy) ? num_to_str(LOWORD(policy)) : policy, testIndex, GetLastError()); } if (ret) @@ -3906,7 +3908,7 @@ static void checkChainPolicyStatus(LPCSTR policy, const ChainPolicyCheck *check, (check->brokenStatus && broken(policyStatus.dwError == check->brokenStatus->dwError)), "%s[%d]: expected %08x, got %08x\n", - HIWORD(policy) ? policy : num_to_str(LOWORD(policy)), + IS_INTOID(policy) ? num_to_str(LOWORD(policy)) : policy, testIndex, check->status.dwError, policyStatus.dwError); else ok(policyStatus.dwError == check->status.dwError || @@ -3914,12 +3916,12 @@ static void checkChainPolicyStatus(LPCSTR policy, const ChainPolicyCheck *check, (check->brokenStatus && broken(policyStatus.dwError == check->brokenStatus->dwError)), "%s[%d]: expected %08x, got %08x\n", - HIWORD(policy) ? policy : num_to_str(LOWORD(policy)), + IS_INTOID(policy) ? num_to_str(LOWORD(policy)) : policy, testIndex, check->status.dwError, policyStatus.dwError); if (policyStatus.dwError != check->status.dwError) { skip("%s[%d]: error %08x doesn't match expected %08x, not checking indexes\n", - HIWORD(policy) ? policy : num_to_str(LOWORD(policy)), + IS_INTOID(policy) ? num_to_str(LOWORD(policy)) : policy, testIndex, policyStatus.dwError, check->status.dwError); pCertFreeCertificateChain(chain); return; @@ -3930,7 +3932,7 @@ static void checkChainPolicyStatus(LPCSTR policy, const ChainPolicyCheck *check, (check->brokenStatus && broken(policyStatus.lChainIndex == check->brokenStatus->lChainIndex)), "%s[%d]: expected %d, got %d\n", - HIWORD(policy) ? policy : num_to_str(LOWORD(policy)), + IS_INTOID(policy) ? num_to_str(LOWORD(policy)) : policy, testIndex, check->status.lChainIndex, policyStatus.lChainIndex); else @@ -3938,7 +3940,7 @@ static void checkChainPolicyStatus(LPCSTR policy, const ChainPolicyCheck *check, (check->brokenStatus && broken(policyStatus.lChainIndex == check->brokenStatus->lChainIndex)), "%s[%d]: expected %d, got %d\n", - HIWORD(policy) ? policy : num_to_str(LOWORD(policy)), + IS_INTOID(policy) ? num_to_str(LOWORD(policy)) : policy, testIndex, check->status.lChainIndex, policyStatus.lChainIndex); if (check->todo & TODO_ELEMENTS) @@ -3947,7 +3949,7 @@ static void checkChainPolicyStatus(LPCSTR policy, const ChainPolicyCheck *check, (check->brokenStatus && broken(policyStatus.lElementIndex == check->brokenStatus->lElementIndex)), "%s[%d]: expected %d, got %d\n", - HIWORD(policy) ? policy : num_to_str(LOWORD(policy)), + IS_INTOID(policy) ? num_to_str(LOWORD(policy)) : policy, testIndex, check->status.lElementIndex, policyStatus.lElementIndex); else @@ -3955,7 +3957,7 @@ static void checkChainPolicyStatus(LPCSTR policy, const ChainPolicyCheck *check, (check->brokenStatus && broken(policyStatus.lElementIndex == check->brokenStatus->lElementIndex)), "%s[%d]: expected %d, got %d\n", - HIWORD(policy) ? policy : num_to_str(LOWORD(policy)), + IS_INTOID(policy) ? num_to_str(LOWORD(policy)) : policy, testIndex, check->status.lElementIndex, policyStatus.lElementIndex); } diff --git a/rostests/winetests/crypt32/main.c b/rostests/winetests/crypt32/main.c index 9b622bbbd08..7c11e8e2ee3 100644 --- a/rostests/winetests/crypt32/main.c +++ b/rostests/winetests/crypt32/main.c @@ -254,10 +254,8 @@ static void test_cryptTls(void) ret = pI_CryptFreeTls(index, 0); ok(ret, "I_CryptFreeTls failed: %08x\n", GetLastError()); ret = pI_CryptFreeTls(index, 0); - /* Not sure if this fails because TlsFree should fail, so leave as - * todo for now. - */ - todo_wine ok(!ret && GetLastError() == E_INVALIDARG, + ok(!ret, "I_CryptFreeTls succeeded\n"); + ok(GetLastError() == E_INVALIDARG, "Expected E_INVALIDARG, got %08x\n", GetLastError()); } /* Similar pass, check I_CryptDetachTls */ diff --git a/rostests/winetests/crypt32/msg.c b/rostests/winetests/crypt32/msg.c index 8ab5625fd8e..39662ebe8f2 100644 --- a/rostests/winetests/crypt32/msg.c +++ b/rostests/winetests/crypt32/msg.c @@ -2572,8 +2572,8 @@ static void test_decode_msg_get_param(void) sizeof(signedKeyIdEmptyContent), TRUE); if (!ret && GetLastError() == OSS_DATA_ERROR) { - /* Subsequent tests crashes on some Win9x, so bail out */ CryptMsgClose(msg); + win_skip("Subsequent tests crash on some Win9x\n"); return; } ok(ret, "CryptMsgUpdate failed: %08x\n", GetLastError()); diff --git a/rostests/winetests/gdiplus/brush.c b/rostests/winetests/gdiplus/brush.c index 0ee4dd485a2..0effcf40fd6 100644 --- a/rostests/winetests/gdiplus/brush.c +++ b/rostests/winetests/gdiplus/brush.c @@ -646,6 +646,61 @@ static void test_linelinearblend(void) expect(Ok, status); } +static void test_gradientsurroundcolorcount(void) +{ + GpStatus status; + GpPathGradient *grad; + ARGB *color; + INT count = 3; + + status = GdipCreatePathGradient(blendcount_ptf, 2, WrapModeClamp, &grad); + expect(Ok, status); + + color = GdipAlloc(sizeof(ARGB[3])); + + status = GdipSetPathGradientSurroundColorsWithCount(grad, color, &count); + expect(InvalidParameter, status); + GdipFree(color); + + count = 2; + + color = GdipAlloc(sizeof(ARGB[2])); + + color[0] = 0x00ff0000; + color[1] = 0x0000ff00; + + status = GdipSetPathGradientSurroundColorsWithCount(NULL, color, &count); + expect(InvalidParameter, status); + + status = GdipSetPathGradientSurroundColorsWithCount(grad, NULL, &count); + expect(InvalidParameter, status); + + /* WinXP crashes on this test */ + if(0) + { + status = GdipSetPathGradientSurroundColorsWithCount(grad, color, NULL); + expect(InvalidParameter, status); + } + + status = GdipSetPathGradientSurroundColorsWithCount(grad, color, &count); + todo_wine expect(Ok, status); + expect(2, count); + + status = GdipGetPathGradientSurroundColorCount(NULL, &count); + expect(InvalidParameter, status); + + status = GdipGetPathGradientSurroundColorCount(grad, NULL); + expect(InvalidParameter, status); + + count = 0; + status = GdipGetPathGradientSurroundColorCount(grad, &count); + todo_wine expect(Ok, status); + todo_wine expect(2, count); + + GdipFree(color); + GdipDeleteBrush((GpBrush*)grad); +} + START_TEST(brush) { struct GdiplusStartupInput gdiplusStartupInput; @@ -669,6 +724,7 @@ START_TEST(brush) test_gradientgetrect(); test_lineblend(); test_linelinearblend(); + test_gradientsurroundcolorcount(); GdiplusShutdown(gdiplusToken); } diff --git a/rostests/winetests/gdiplus/font.c b/rostests/winetests/gdiplus/font.c index 7b95d4c55ab..80f11bc0032 100644 --- a/rostests/winetests/gdiplus/font.c +++ b/rostests/winetests/gdiplus/font.c @@ -18,11 +18,14 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include + #include "windows.h" #include "gdiplus.h" #include "wine/test.h" #define expect(expected, got) ok(got == expected, "Expected %.8x, got %.8x\n", expected, got) +#define expectf(expected, got) ok(fabs(expected - got) < 0.0001, "Expected %.2f, got %.2f\n", expected, got) static const WCHAR arial[] = {'A','r','i','a','l','\0'}; static const WCHAR nonexistent[] = {'T','h','i','s','F','o','n','t','s','h','o','u','l','d','N','o','t','E','x','i','s','t','\0'}; @@ -189,12 +192,9 @@ static void test_fontfamily (void) expect (FontFamilyNotFound, stat); /* Bitmap fonts are not found */ -todo_wine -{ stat = GdipCreateFontFamilyFromName (MSSansSerif, NULL, &family); expect (FontFamilyNotFound, stat); if(stat == Ok) GdipDeleteFontFamily(family); -} stat = GdipCreateFontFamilyFromName (arial, NULL, &family); if(stat == FontFamilyNotFound) @@ -345,6 +345,78 @@ static void test_installedfonts (void) ok (collection != NULL, "got NULL font collection\n"); } +static void test_heightgivendpi(void) +{ + GpStatus stat; + GpFont* font = NULL; + GpFontFamily* fontfamily = NULL; + REAL height; + + stat = GdipCreateFontFamilyFromName(arial, NULL, &fontfamily); + if(stat == FontFamilyNotFound) + { + skip("Arial not installed\n"); + return; + } + expect(Ok, stat); + + stat = GdipCreateFont(fontfamily, 30, FontStyleRegular, UnitPixel, &font); + expect(Ok, stat); + + stat = GdipGetFontHeightGivenDPI(NULL, 96, &height); + expect(InvalidParameter, stat); + + stat = GdipGetFontHeightGivenDPI(font, 96, NULL); + expect(InvalidParameter, stat); + + stat = GdipGetFontHeightGivenDPI(font, 96, &height); + expect(Ok, stat); + expectf((REAL)34.497070, height); + GdipDeleteFont(font); + + height = 12345; + stat = GdipCreateFont(fontfamily, 30, FontStyleRegular, UnitWorld, &font); + expect(Ok, stat); + stat = GdipGetFontHeightGivenDPI(font, 96, &height); + expect(Ok, stat); + expectf((REAL)34.497070, height); + GdipDeleteFont(font); + + height = 12345; + stat = GdipCreateFont(fontfamily, 30, FontStyleRegular, UnitPoint, &font); + expect(Ok, stat); + stat = GdipGetFontHeightGivenDPI(font, 96, &height); + expect(Ok, stat); + expectf((REAL)45.996094, height); + GdipDeleteFont(font); + + height = 12345; + stat = GdipCreateFont(fontfamily, 30, FontStyleRegular, UnitInch, &font); + expect(Ok, stat); + stat = GdipGetFontHeightGivenDPI(font, 96, &height); + expect(Ok, stat); + expectf((REAL)3311.718750, height); + GdipDeleteFont(font); + + height = 12345; + stat = GdipCreateFont(fontfamily, 30, FontStyleRegular, UnitDocument, &font); + expect(Ok, stat); + stat = GdipGetFontHeightGivenDPI(font, 96, &height); + expect(Ok, stat); + expectf((REAL)11.039062, height); + GdipDeleteFont(font); + + height = 12345; + stat = GdipCreateFont(fontfamily, 30, FontStyleRegular, UnitMillimeter, &font); + expect(Ok, stat); + stat = GdipGetFontHeightGivenDPI(font, 96, &height); + expect(Ok, stat); + expectf((REAL)130.382614, height); + GdipDeleteFont(font); + + GdipDeleteFontFamily(fontfamily); +} + START_TEST(font) { struct GdiplusStartupInput gdiplusStartupInput; @@ -363,6 +435,7 @@ START_TEST(font) test_fontfamily_properties(); test_getgenerics(); test_installedfonts(); + test_heightgivendpi(); GdiplusShutdown(gdiplusToken); } diff --git a/rostests/winetests/gdiplus/graphics.c b/rostests/winetests/gdiplus/graphics.c index b2dc9b299fb..57ce638093c 100644 --- a/rostests/winetests/gdiplus/graphics.c +++ b/rostests/winetests/gdiplus/graphics.c @@ -25,14 +25,17 @@ #include #define expect(expected, got) ok(got == expected, "Expected %.8x, got %.8x\n", expected, got) -#define expectf(expected, got) ok(fabs(expected - got) < 0.0001, "Expected %.2f, got %.2f\n", expected, got) +#define expectf_(expected, got, precision) ok(fabs(expected - got) < precision, "Expected %.2f, got %.2f\n", expected, got) +#define expectf(expected, got) expectf_(expected, got, 0.0001) #define TABLE_LEN (23) +static HWND hwnd; + static void test_constructor_destructor(void) { GpStatus stat; GpGraphics *graphics = NULL; - HDC hdc = GetDC(0); + HDC hdc = GetDC( hwnd ); stat = GdipCreateFromHDC(NULL, &graphics); expect(OutOfMemory, stat); @@ -56,7 +59,7 @@ static void test_constructor_destructor(void) stat = GdipDeleteGraphics(NULL); expect(InvalidParameter, stat); - ReleaseDC(0, hdc); + ReleaseDC(hwnd, hdc); } typedef struct node{ @@ -115,7 +118,7 @@ static void test_save_restore(void) InterpolationMode mode; GpGraphics *graphics1, *graphics2; node * state_log = NULL; - HDC hdc = GetDC(0); + HDC hdc = GetDC( hwnd ); state_a = state_b = state_c = 0xdeadbeef; /* Invalid saving. */ @@ -224,7 +227,7 @@ static void test_save_restore(void) todo_wine check_no_duplicates(state_log); - ReleaseDC(0, hdc); + ReleaseDC(hwnd, hdc); } static void test_GdipDrawArc(void) @@ -232,7 +235,7 @@ static void test_GdipDrawArc(void) GpStatus status; GpGraphics *graphics = NULL; GpPen *pen = NULL; - HDC hdc = GetDC(0); + HDC hdc = GetDC( hwnd ); /* make a graphics object and pen object */ ok(hdc != NULL, "Expected HDC to be initialized\n"); @@ -268,7 +271,7 @@ static void test_GdipDrawArc(void) GdipDeletePen(pen); GdipDeleteGraphics(graphics); - ReleaseDC(0, hdc); + ReleaseDC(hwnd, hdc); } static void test_GdipDrawArcI(void) @@ -276,7 +279,7 @@ static void test_GdipDrawArcI(void) GpStatus status; GpGraphics *graphics = NULL; GpPen *pen = NULL; - HDC hdc = GetDC(0); + HDC hdc = GetDC( hwnd ); /* make a graphics object and pen object */ ok(hdc != NULL, "Expected HDC to be initialized\n"); @@ -312,7 +315,7 @@ static void test_GdipDrawArcI(void) GdipDeletePen(pen); GdipDeleteGraphics(graphics); - ReleaseDC(0, hdc); + ReleaseDC(hwnd, hdc); } static void test_BeginContainer2(void) @@ -334,7 +337,7 @@ static void test_BeginContainer2(void) GpStatus status; GpGraphics *graphics = NULL; - HDC hdc = GetDC(0); + HDC hdc = GetDC( hwnd ); ok(hdc != NULL, "Expected HDC to be initialized\n"); @@ -497,7 +500,7 @@ static void test_BeginContainer2(void) expect(Ok, status); GdipDeleteGraphics(graphics); - ReleaseDC(0, hdc); + ReleaseDC(hwnd, hdc); } static void test_GdipDrawBezierI(void) @@ -505,7 +508,7 @@ static void test_GdipDrawBezierI(void) GpStatus status; GpGraphics *graphics = NULL; GpPen *pen = NULL; - HDC hdc = GetDC(0); + HDC hdc = GetDC( hwnd ); /* make a graphics object and pen object */ ok(hdc != NULL, "Expected HDC to be initialized\n"); @@ -535,7 +538,7 @@ static void test_GdipDrawBezierI(void) GdipDeletePen(pen); GdipDeleteGraphics(graphics); - ReleaseDC(0, hdc); + ReleaseDC(hwnd, hdc); } static void test_GdipDrawCurve3(void) @@ -543,7 +546,7 @@ static void test_GdipDrawCurve3(void) GpStatus status; GpGraphics *graphics = NULL; GpPen *pen = NULL; - HDC hdc = GetDC(0); + HDC hdc = GetDC( hwnd ); GpPointF points[3]; points[0].X = 0; @@ -615,7 +618,7 @@ static void test_GdipDrawCurve3(void) GdipDeletePen(pen); GdipDeleteGraphics(graphics); - ReleaseDC(0, hdc); + ReleaseDC(hwnd, hdc); } static void test_GdipDrawCurve3I(void) @@ -623,7 +626,7 @@ static void test_GdipDrawCurve3I(void) GpStatus status; GpGraphics *graphics = NULL; GpPen *pen = NULL; - HDC hdc = GetDC(0); + HDC hdc = GetDC( hwnd ); GpPoint points[3]; points[0].X = 0; @@ -695,7 +698,7 @@ static void test_GdipDrawCurve3I(void) GdipDeletePen(pen); GdipDeleteGraphics(graphics); - ReleaseDC(0, hdc); + ReleaseDC(hwnd, hdc); } static void test_GdipDrawCurve2(void) @@ -703,7 +706,7 @@ static void test_GdipDrawCurve2(void) GpStatus status; GpGraphics *graphics = NULL; GpPen *pen = NULL; - HDC hdc = GetDC(0); + HDC hdc = GetDC( hwnd ); GpPointF points[3]; points[0].X = 0; @@ -762,7 +765,7 @@ static void test_GdipDrawCurve2(void) GdipDeletePen(pen); GdipDeleteGraphics(graphics); - ReleaseDC(0, hdc); + ReleaseDC(hwnd, hdc); } static void test_GdipDrawCurve2I(void) @@ -770,7 +773,7 @@ static void test_GdipDrawCurve2I(void) GpStatus status; GpGraphics *graphics = NULL; GpPen *pen = NULL; - HDC hdc = GetDC(0); + HDC hdc = GetDC( hwnd ); GpPoint points[3]; points[0].X = 0; @@ -829,7 +832,7 @@ static void test_GdipDrawCurve2I(void) GdipDeletePen(pen); GdipDeleteGraphics(graphics); - ReleaseDC(0, hdc); + ReleaseDC(hwnd, hdc); } static void test_GdipDrawCurve(void) @@ -837,7 +840,7 @@ static void test_GdipDrawCurve(void) GpStatus status; GpGraphics *graphics = NULL; GpPen *pen = NULL; - HDC hdc = GetDC(0); + HDC hdc = GetDC( hwnd ); GpPointF points[3]; points[0].X = 0; @@ -890,7 +893,7 @@ static void test_GdipDrawCurve(void) GdipDeletePen(pen); GdipDeleteGraphics(graphics); - ReleaseDC(0, hdc); + ReleaseDC(hwnd, hdc); } static void test_GdipDrawCurveI(void) @@ -898,7 +901,7 @@ static void test_GdipDrawCurveI(void) GpStatus status; GpGraphics *graphics = NULL; GpPen *pen = NULL; - HDC hdc = GetDC(0); + HDC hdc = GetDC( hwnd ); GpPoint points[3]; points[0].X = 0; @@ -951,7 +954,7 @@ static void test_GdipDrawCurveI(void) GdipDeletePen(pen); GdipDeleteGraphics(graphics); - ReleaseDC(0, hdc); + ReleaseDC(hwnd, hdc); } static void test_GdipDrawLineI(void) @@ -959,7 +962,7 @@ static void test_GdipDrawLineI(void) GpStatus status; GpGraphics *graphics = NULL; GpPen *pen = NULL; - HDC hdc = GetDC(0); + HDC hdc = GetDC( hwnd ); /* make a graphics object and pen object */ ok(hdc != NULL, "Expected HDC to be initialized\n"); @@ -989,7 +992,7 @@ static void test_GdipDrawLineI(void) GdipDeletePen(pen); GdipDeleteGraphics(graphics); - ReleaseDC(0, hdc); + ReleaseDC(hwnd, hdc); } static void test_GdipDrawLinesI(void) @@ -998,7 +1001,7 @@ static void test_GdipDrawLinesI(void) GpGraphics *graphics = NULL; GpPen *pen = NULL; GpPoint *ptf = NULL; - HDC hdc = GetDC(0); + HDC hdc = GetDC( hwnd ); /* make a graphics object and pen object */ ok(hdc != NULL, "Expected HDC to be initialized\n"); @@ -1041,7 +1044,7 @@ static void test_GdipDrawLinesI(void) GdipDeletePen(pen); GdipDeleteGraphics(graphics); - ReleaseDC(0, hdc); + ReleaseDC(hwnd, hdc); } static void test_Get_Release_DC(void) @@ -1051,7 +1054,7 @@ static void test_Get_Release_DC(void) GpPen *pen; GpSolidFill *brush; GpPath *path; - HDC hdc = GetDC(0); + HDC hdc = GetDC( hwnd ); HDC retdc; REAL r; CompositingQuality quality; @@ -1345,14 +1348,14 @@ static void test_Get_Release_DC(void) GdipDeleteMatrix(m); DeleteObject(hrgn); - ReleaseDC(0, hdc); + ReleaseDC(hwnd, hdc); } static void test_transformpoints(void) { GpStatus status; GpGraphics *graphics = NULL; - HDC hdc = GetDC(0); + HDC hdc = GetDC( hwnd ); GpPointF ptf[2]; GpPoint pt[2]; @@ -1465,14 +1468,14 @@ static void test_transformpoints(void) expect(18, pt[1].Y); GdipDeleteGraphics(graphics); - ReleaseDC(0, hdc); + ReleaseDC(hwnd, hdc); } static void test_get_set_clip(void) { GpStatus status; GpGraphics *graphics = NULL; - HDC hdc = GetDC(0); + HDC hdc = GetDC( hwnd ); GpRegion *clip; GpRectF rect; BOOL res; @@ -1544,14 +1547,14 @@ static void test_get_set_clip(void) GdipDeleteRegion(clip); GdipDeleteGraphics(graphics); - ReleaseDC(0, hdc); + ReleaseDC(hwnd, hdc); } static void test_isempty(void) { GpStatus status; GpGraphics *graphics = NULL; - HDC hdc = GetDC(0); + HDC hdc = GetDC( hwnd ); GpRegion *clip; BOOL res; @@ -1578,7 +1581,7 @@ static void test_isempty(void) GdipDeleteRegion(clip); GdipDeleteGraphics(graphics); - ReleaseDC(0, hdc); + ReleaseDC(hwnd, hdc); } static void test_clear(void) @@ -1592,7 +1595,7 @@ static void test_clear(void) static void test_textcontrast(void) { GpStatus status; - HDC hdc = GetDC(0); + HDC hdc = GetDC( hwnd ); GpGraphics *graphics; UINT contrast; @@ -1608,7 +1611,7 @@ static void test_textcontrast(void) expect(4, contrast); GdipDeleteGraphics(graphics); - ReleaseDC(0, hdc); + ReleaseDC(hwnd, hdc); } static void test_GdipDrawString(void) @@ -1620,7 +1623,7 @@ static void test_GdipDrawString(void) GpStringFormat *format; GpBrush *brush; LOGFONTA logfont; - HDC hdc = GetDC(0); + HDC hdc = GetDC( hwnd ); static const WCHAR string[] = {'T','e','s','t',0}; memset(&logfont,0,sizeof(logfont)); @@ -1658,7 +1661,7 @@ static void test_GdipDrawString(void) GdipDeleteFont(fnt); GdipDeleteStringFormat(format); - ReleaseDC(0, hdc); + ReleaseDC(hwnd, hdc); } static void test_GdipGetVisibleClipBounds_screen(void) @@ -1758,36 +1761,10 @@ static void test_GdipGetVisibleClipBounds_window(void) GpGraphics *graphics = NULL; GpRectF rectf, window, exp, clipr; GpRect recti; - HWND hwnd; - WNDCLASSA class; HDC hdc; PAINTSTRUCT ps; - HINSTANCE hInstance = GetModuleHandle(NULL); RECT wnd_rect; - window.X = 0; - window.Y = 0; - window.Width = 200; - window.Height = 300; - - class.lpszClassName = "ClipBoundsTestClass"; - class.style = CS_HREDRAW | CS_VREDRAW; - class.lpfnWndProc = DefWindowProcA; - class.hInstance = hInstance; - class.hIcon = LoadIcon(0, IDI_APPLICATION); - class.hCursor = LoadCursor(NULL, IDC_ARROW); - class.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); - class.lpszMenuName = 0; - class.cbClsExtra = 0; - class.cbWndExtra = 0; - RegisterClass(&class); - - hwnd = CreateWindow(class.lpszClassName, "ClipboundsTest", - WS_OVERLAPPEDWINDOW, window.X, window.Y, window.Width, window.Height, - NULL, NULL, hInstance, NULL); - - ok(hwnd != NULL, "Expected window to be created\n"); - /* get client area size */ ok(GetClientRect(hwnd, &wnd_rect), "GetClientRect should have succeeded\n"); window.X = wnd_rect.left; @@ -1870,7 +1847,6 @@ static void test_GdipGetVisibleClipBounds_window(void) GdipDeleteGraphics(graphics); EndPaint(hwnd, &ps); - DestroyWindow(hwnd); } static void test_GdipGetVisibleClipBounds(void) @@ -1878,7 +1854,7 @@ static void test_GdipGetVisibleClipBounds(void) GpGraphics* graphics = NULL; GpRectF rectf; GpRect rect; - HDC hdc = GetDC(0); + HDC hdc = GetDC( hwnd ); GpStatus status; status = GdipCreateFromHDC(hdc, &graphics); @@ -1899,7 +1875,7 @@ static void test_GdipGetVisibleClipBounds(void) expect(InvalidParameter, status); GdipDeleteGraphics(graphics); - ReleaseDC(0, hdc); + ReleaseDC(hwnd, hdc); test_GdipGetVisibleClipBounds_screen(); test_GdipGetVisibleClipBounds_window(); @@ -1933,7 +1909,7 @@ static void test_GdipIsVisiblePoint(void) { GpStatus status; GpGraphics *graphics = NULL; - HDC hdc = GetDC(0); + HDC hdc = GetDC( hwnd ); REAL x, y; BOOL val; @@ -2105,14 +2081,14 @@ static void test_GdipIsVisiblePoint(void) ok(val == FALSE, "After clipping, expected (%.2f, %.2f) not to be visible\n", x, y); GdipDeleteGraphics(graphics); - ReleaseDC(0, hdc); + ReleaseDC(hwnd, hdc); } static void test_GdipIsVisibleRect(void) { GpStatus status; GpGraphics *graphics = NULL; - HDC hdc = GetDC(0); + HDC hdc = GetDC( hwnd ); REAL x, y, width, height; BOOL val; @@ -2267,7 +2243,7 @@ static void test_GdipIsVisibleRect(void) ok(val == TRUE, "Expected (%.2f, %.2f, %.2f, %.2f) to be visible\n", x, y, width, height); GdipDeleteGraphics(graphics); - ReleaseDC(0, hdc); + ReleaseDC(hwnd, hdc); } static void test_GdipGetNearestColor(void) @@ -2276,7 +2252,7 @@ static void test_GdipGetNearestColor(void) GpGraphics *graphics; GpBitmap *bitmap; ARGB color = 0xdeadbeef; - HDC hdc = GetDC(0); + HDC hdc = GetDC( hwnd ); /* create a graphics object */ ok(hdc != NULL, "Expected HDC to be initialized\n"); @@ -2415,17 +2391,269 @@ static void test_GdipGetNearestColor(void) expect(Ok, status); status = GdipGetNearestColor(graphics, &color); expect(Ok, status); - todo_wine expect(0xffa8b8e8, color); + todo_wine + ok(color == 0xffa8b8e8 || + broken(color == 0xffa0b8e0), /* Win98/WinMe */ + "Expected ffa8b8e8, got %.8x\n", color); GdipDeleteGraphics(graphics); GdipDisposeImage((GpImage*)bitmap); - ReleaseDC(0, hdc); + ReleaseDC(hwnd, hdc); +} + +static void test_string_functions(void) +{ + GpStatus status; + GpGraphics *graphics; + GpFontFamily *family; + GpFont *font; + RectF rc, char_bounds, bounds; + GpBrush *brush; + ARGB color = 0xff000000; + HDC hdc = GetDC( hwnd ); + const WCHAR fontname[] = {'C','o','u','r','i','e','r',' ','N','e','w',0}; + const WCHAR fontname2[] = {'C','o','u','r','i','e','r',0}; + const WCHAR teststring[] = {'o','o',' ','o','\n','o',0}; + REAL char_width, char_height; + INT codepointsfitted, linesfilled; + GpStringFormat *format; + CharacterRange ranges[3] = {{0, 1}, {1, 3}, {5, 1}}; + GpRegion *regions[4] = {0}; + BOOL region_isempty[4]; + int i; + + ok(hdc != NULL, "Expected HDC to be initialized\n"); + status = GdipCreateFromHDC(hdc, &graphics); + expect(Ok, status); + ok(graphics != NULL, "Expected graphics to be initialized\n"); + + status = GdipCreateFontFamilyFromName(fontname, NULL, &family); + + if (status != Ok) + { + /* Wine doesn't have Courier New? */ + todo_wine expect(Ok, status); + status = GdipCreateFontFamilyFromName(fontname2, NULL, &family); + } + + expect(Ok, status); + + status = GdipCreateFont(family, 10.0, FontStyleRegular, UnitPixel, &font); + expect(Ok, status); + + status = GdipCreateSolidFill(color, (GpSolidFill**)&brush); + expect(Ok, status); + + status = GdipCreateStringFormat(0, LANG_NEUTRAL, &format); + expect(Ok, status); + + rc.X = 0; + rc.Y = 0; + rc.Width = 100.0; + rc.Height = 100.0; + + status = GdipDrawString(NULL, teststring, 6, font, &rc, NULL, brush); + expect(InvalidParameter, status); + + status = GdipDrawString(graphics, NULL, 6, font, &rc, NULL, brush); + expect(InvalidParameter, status); + + status = GdipDrawString(graphics, teststring, 6, NULL, &rc, NULL, brush); + expect(InvalidParameter, status); + + status = GdipDrawString(graphics, teststring, 6, font, NULL, NULL, brush); + expect(InvalidParameter, status); + + status = GdipDrawString(graphics, teststring, 6, font, &rc, NULL, NULL); + expect(InvalidParameter, status); + + status = GdipDrawString(graphics, teststring, 6, font, &rc, NULL, brush); + expect(Ok, status); + + status = GdipMeasureString(NULL, teststring, 6, font, &rc, NULL, &bounds, &codepointsfitted, &linesfilled); + expect(InvalidParameter, status); + + status = GdipMeasureString(graphics, NULL, 6, font, &rc, NULL, &bounds, &codepointsfitted, &linesfilled); + expect(InvalidParameter, status); + + status = GdipMeasureString(graphics, teststring, 6, NULL, &rc, NULL, &bounds, &codepointsfitted, &linesfilled); + expect(InvalidParameter, status); + + status = GdipMeasureString(graphics, teststring, 6, font, NULL, NULL, &bounds, &codepointsfitted, &linesfilled); + expect(InvalidParameter, status); + + status = GdipMeasureString(graphics, teststring, 6, font, &rc, NULL, NULL, &codepointsfitted, &linesfilled); + expect(InvalidParameter, status); + + status = GdipMeasureString(graphics, teststring, 6, font, &rc, NULL, &bounds, NULL, &linesfilled); + expect(Ok, status); + + status = GdipMeasureString(graphics, teststring, 6, font, &rc, NULL, &bounds, &codepointsfitted, NULL); + expect(Ok, status); + + status = GdipMeasureString(graphics, teststring, 1, font, &rc, NULL, &char_bounds, &codepointsfitted, &linesfilled); + expect(Ok, status); + expectf(0.0, char_bounds.X); + expectf(0.0, char_bounds.Y); + ok(char_bounds.Width > 0, "got %0.2f\n", bounds.Width); + ok(char_bounds.Height > 0, "got %0.2f\n", bounds.Height); + expect(1, codepointsfitted); + expect(1, linesfilled); + + status = GdipMeasureString(graphics, teststring, 2, font, &rc, NULL, &bounds, &codepointsfitted, &linesfilled); + expect(Ok, status); + expectf(0.0, bounds.X); + expectf(0.0, bounds.Y); + ok(bounds.Width > char_bounds.Width, "got %0.2f, expected at least %0.2f\n", bounds.Width, char_bounds.Width); + expectf(char_bounds.Height, bounds.Height); + expect(2, codepointsfitted); + expect(1, linesfilled); + char_width = bounds.Width - char_bounds.Width; + + status = GdipMeasureString(graphics, teststring, 6, font, &rc, NULL, &bounds, &codepointsfitted, &linesfilled); + expect(Ok, status); + expectf(0.0, bounds.X); + expectf(0.0, bounds.Y); + expectf_(char_bounds.Width + char_width * 3, bounds.Width, 0.01); + ok(bounds.Height > char_bounds.Height, "got %0.2f, expected at least %0.2f\n", bounds.Height, char_bounds.Height); + expect(6, codepointsfitted); + expect(2, linesfilled); + char_height = bounds.Height - char_bounds.Height; + + /* Cut off everything after the first space. */ + rc.Width = char_bounds.Width + char_width * 2.5; + + status = GdipMeasureString(graphics, teststring, 6, font, &rc, NULL, &bounds, &codepointsfitted, &linesfilled); + expect(Ok, status); + expectf(0.0, bounds.X); + expectf(0.0, bounds.Y); + expectf_(char_bounds.Width + char_width, bounds.Width, 0.01); + expectf_(char_bounds.Height + char_height * 2, bounds.Height, 0.01); + expect(6, codepointsfitted); + expect(3, linesfilled); + + /* Cut off everything including the first space. */ + rc.Width = char_bounds.Width + char_width * 1.5; + + status = GdipMeasureString(graphics, teststring, 6, font, &rc, NULL, &bounds, &codepointsfitted, &linesfilled); + expect(Ok, status); + expectf(0.0, bounds.X); + expectf(0.0, bounds.Y); + expectf_(char_bounds.Width + char_width, bounds.Width, 0.01); + expectf_(char_bounds.Height + char_height * 2, bounds.Height, 0.01); + expect(6, codepointsfitted); + expect(3, linesfilled); + + /* Cut off everything after the first character. */ + rc.Width = char_bounds.Width + char_width * 0.5; + + status = GdipMeasureString(graphics, teststring, 6, font, &rc, NULL, &bounds, &codepointsfitted, &linesfilled); + expect(Ok, status); + expectf(0.0, bounds.X); + expectf(0.0, bounds.Y); + expectf_(char_bounds.Width, bounds.Width, 0.01); + todo_wine expectf_(char_bounds.Height + char_height * 3, bounds.Height, 0.05); + expect(6, codepointsfitted); + todo_wine expect(4, linesfilled); + + status = GdipSetStringFormatMeasurableCharacterRanges(format, 3, ranges); + expect(Ok, status); + + rc.Width = 100.0; + + for (i=0; i<4; i++) + { + status = GdipCreateRegion(®ions[i]); + expect(Ok, status); + } + + status = GdipMeasureCharacterRanges(NULL, teststring, 6, font, &rc, format, 3, regions); + expect(InvalidParameter, status); + + status = GdipMeasureCharacterRanges(graphics, NULL, 6, font, &rc, format, 3, regions); + expect(InvalidParameter, status); + + status = GdipMeasureCharacterRanges(graphics, teststring, 6, NULL, &rc, format, 3, regions); + expect(InvalidParameter, status); + + status = GdipMeasureCharacterRanges(graphics, teststring, 6, font, NULL, format, 3, regions); + expect(InvalidParameter, status); + + if (0) + { + /* Crashes on Windows XP */ + status = GdipMeasureCharacterRanges(graphics, teststring, 6, font, &rc, NULL, 3, regions); + expect(InvalidParameter, status); + } + + status = GdipMeasureCharacterRanges(graphics, teststring, 6, font, &rc, format, 3, NULL); + expect(InvalidParameter, status); + + status = GdipMeasureCharacterRanges(graphics, teststring, 6, font, &rc, format, 2, regions); + expect(InvalidParameter, status); + + status = GdipMeasureCharacterRanges(graphics, teststring, 6, font, &rc, format, 4, regions); + expect(Ok, status); + + for (i=0; i<4; i++) + { + status = GdipIsEmptyRegion(regions[i], graphics, ®ion_isempty[i]); + expect(Ok, status); + } + + ok(!region_isempty[0], "region shouldn't be empty\n"); + ok(!region_isempty[1], "region shouldn't be empty\n"); + ok(!region_isempty[2], "region shouldn't be empty\n"); + ok(!region_isempty[3], "region shouldn't be empty\n"); + + /* Cut off everything after the first space, and the second line. */ + rc.Width = char_bounds.Width + char_width * 2.5; + rc.Height = char_bounds.Height + char_height * 0.5; + + status = GdipMeasureCharacterRanges(graphics, teststring, 6, font, &rc, format, 3, regions); + expect(Ok, status); + + for (i=0; i<4; i++) + { + status = GdipIsEmptyRegion(regions[i], graphics, ®ion_isempty[i]); + expect(Ok, status); + } + + ok(!region_isempty[0], "region shouldn't be empty\n"); + ok(!region_isempty[1], "region shouldn't be empty\n"); + ok(region_isempty[2], "region should be empty\n"); + ok(!region_isempty[3], "region shouldn't be empty\n"); + + for (i=0; i<4; i++) + GdipDeleteRegion(regions[i]); + + GdipDeleteStringFormat(format); + GdipDeleteBrush(brush); + GdipDeleteFont(font); + GdipDeleteFontFamily(family); + GdipDeleteGraphics(graphics); + + ReleaseDC(hwnd, hdc); } START_TEST(graphics) { struct GdiplusStartupInput gdiplusStartupInput; ULONG_PTR gdiplusToken; + WNDCLASSA class; + + memset( &class, 0, sizeof(class) ); + class.lpszClassName = "gdiplus_test"; + class.style = CS_HREDRAW | CS_VREDRAW; + class.lpfnWndProc = DefWindowProcA; + class.hInstance = GetModuleHandleA(0); + class.hIcon = LoadIcon(0, IDI_APPLICATION); + class.hCursor = LoadCursor(NULL, IDC_ARROW); + class.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); + RegisterClassA( &class ); + hwnd = CreateWindowA( "gdiplus_test", "graphics test", WS_OVERLAPPEDWINDOW | WS_VISIBLE, + CW_USEDEFAULT, CW_USEDEFAULT, 200, 200, 0, 0, GetModuleHandleA(0), 0 ); + ok(hwnd != NULL, "Expected window to be created\n"); gdiplusStartupInput.GdiplusVersion = 1; gdiplusStartupInput.DebugEventCallback = NULL; @@ -2460,6 +2688,8 @@ START_TEST(graphics) test_clear(); test_textcontrast(); test_fromMemoryBitmap(); + test_string_functions(); GdiplusShutdown(gdiplusToken); + DestroyWindow( hwnd ); } diff --git a/rostests/winetests/gdiplus/image.c b/rostests/winetests/gdiplus/image.c index 9085ef2cf2d..74e6ee1db23 100644 --- a/rostests/winetests/gdiplus/image.c +++ b/rostests/winetests/gdiplus/image.c @@ -226,10 +226,23 @@ static void test_GdipImageGetFrameDimensionsCount(void) stat = GdipImageGetFrameDimensionsList((GpImage*)bm, &dimension, 0); expect(InvalidParameter, stat); + stat = GdipImageGetFrameCount(NULL, &dimension, &count); + expect(InvalidParameter, stat); + + /* WinXP crashes on this test */ + if(0) + { + stat = GdipImageGetFrameCount((GpImage*)bm, &dimension, NULL); + expect(InvalidParameter, stat); + } + + stat = GdipImageGetFrameCount((GpImage*)bm, NULL, &count); + expect(Ok, stat); + count = 12345; stat = GdipImageGetFrameCount((GpImage*)bm, &dimension, &count); - todo_wine expect(Ok, stat); - todo_wine expect(1, count); + expect(Ok, stat); + expect(1, count); GdipBitmapSetPixel(bm, 0, 0, 0xffffffff); @@ -793,6 +806,26 @@ static const unsigned char jpgimage[285] = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xda,0x00,0x0c,0x03,0x01, 0x00,0x02,0x11,0x03,0x11,0x00,0x3f,0x00,0xb2,0xc0,0x07,0xff,0xd9 }; +/* 1x1 pixel tiff */ +static const unsigned char tiffimage[] = { +0x49,0x49,0x2a,0x00,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0xfe,0x00, +0x04,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x00,0x01,0x00, +0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x01,0x03,0x00,0x01,0x00,0x00,0x00,0x01,0x00, +0x00,0x00,0x02,0x01,0x03,0x00,0x03,0x00,0x00,0x00,0xd2,0x00,0x00,0x00,0x03,0x01, +0x03,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x06,0x01,0x03,0x00,0x01,0x00, +0x00,0x00,0x02,0x00,0x00,0x00,0x0d,0x01,0x02,0x00,0x1b,0x00,0x00,0x00,0xd8,0x00, +0x00,0x00,0x11,0x01,0x04,0x00,0x01,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x12,0x01, +0x03,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x15,0x01,0x03,0x00,0x01,0x00, +0x00,0x00,0x03,0x00,0x00,0x00,0x16,0x01,0x03,0x00,0x01,0x00,0x00,0x00,0x40,0x00, +0x00,0x00,0x17,0x01,0x04,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x1a,0x01, +0x05,0x00,0x01,0x00,0x00,0x00,0xf4,0x00,0x00,0x00,0x1b,0x01,0x05,0x00,0x01,0x00, +0x00,0x00,0xfc,0x00,0x00,0x00,0x1c,0x01,0x03,0x00,0x01,0x00,0x00,0x00,0x01,0x00, +0x00,0x00,0x28,0x01,0x03,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x2f,0x68,0x6f,0x6d,0x65,0x2f,0x6d,0x65, +0x68,0x2f,0x44,0x65,0x73,0x6b,0x74,0x6f,0x70,0x2f,0x74,0x65,0x73,0x74,0x2e,0x74, +0x69,0x66,0x00,0x00,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x48, +0x00,0x00,0x00,0x01 +}; /* 320x320 twip wmf */ static const unsigned char wmfimage[180] = { 0xd7,0xcd,0xc6,0x9a,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x01,0x40,0x01,0xa0,0x05, @@ -814,6 +847,7 @@ static void test_getrawformat(void) test_bufferrawformat((void*)gifimage, sizeof(gifimage), &ImageFormatGIF, __LINE__, FALSE); test_bufferrawformat((void*)bmpimage, sizeof(bmpimage), &ImageFormatBMP, __LINE__, FALSE); test_bufferrawformat((void*)jpgimage, sizeof(jpgimage), &ImageFormatJPEG, __LINE__, FALSE); + test_bufferrawformat((void*)tiffimage, sizeof(tiffimage), &ImageFormatTIFF, __LINE__, FALSE); test_bufferrawformat((void*)wmfimage, sizeof(wmfimage), &ImageFormatWMF, __LINE__, FALSE); } @@ -828,6 +862,7 @@ static void test_loadwmf(void) GpRectF bounds; GpUnit unit; REAL res = 12345.0; + MetafileHeader header; hglob = GlobalAlloc (0, sizeof(wmfimage)); data = GlobalLock (hglob); @@ -863,6 +898,27 @@ static void test_loadwmf(void) expect(Ok, stat); todo_wine expectf(1440.0, res); + memset(&header, 0, sizeof(header)); + stat = GdipGetMetafileHeaderFromMetafile((GpMetafile*)img, &header); + expect(Ok, stat); + if (stat == Ok) + { + todo_wine expect(MetafileTypeWmfPlaceable, header.Type); + todo_wine expect(sizeof(wmfimage)-sizeof(WmfPlaceableFileHeader), header.Size); + todo_wine expect(0x300, header.Version); + expect(0, header.EmfPlusFlags); + todo_wine expectf(1440.0, header.DpiX); + todo_wine expectf(1440.0, header.DpiY); + expect(0, header.X); + expect(0, header.Y); + todo_wine expect(320, header.Width); + todo_wine expect(320, header.Height); + todo_wine expect(1, U(header).WmfHeader.mtType); + expect(0, header.EmfPlusHeaderSize); + expect(0, header.LogicalDpiX); + expect(0, header.LogicalDpiY); + } + GdipDisposeImage(img); } @@ -874,6 +930,7 @@ static void test_createfromwmf(void) GpRectF bounds; GpUnit unit; REAL res = 12345.0; + MetafileHeader header; hwmf = SetMetaFileBitsEx(sizeof(wmfimage)-sizeof(WmfPlaceableFileHeader), wmfimage+sizeof(WmfPlaceableFileHeader)); @@ -885,11 +942,11 @@ static void test_createfromwmf(void) stat = GdipGetImageBounds(img, &bounds, &unit); expect(Ok, stat); - todo_wine expect(UnitPixel, unit); + expect(UnitPixel, unit); expectf(0.0, bounds.X); expectf(0.0, bounds.Y); - todo_wine expectf(320.0, bounds.Width); - todo_wine expectf(320.0, bounds.Height); + expectf(320.0, bounds.Width); + expectf(320.0, bounds.Height); stat = GdipGetImageHorizontalResolution(img, &res); expect(Ok, stat); @@ -899,6 +956,27 @@ static void test_createfromwmf(void) expect(Ok, stat); expectf(1440.0, res); + memset(&header, 0, sizeof(header)); + stat = GdipGetMetafileHeaderFromMetafile((GpMetafile*)img, &header); + expect(Ok, stat); + if (stat == Ok) + { + todo_wine expect(MetafileTypeWmfPlaceable, header.Type); + todo_wine expect(sizeof(wmfimage)-sizeof(WmfPlaceableFileHeader), header.Size); + todo_wine expect(0x300, header.Version); + expect(0, header.EmfPlusFlags); + todo_wine expectf(1440.0, header.DpiX); + todo_wine expectf(1440.0, header.DpiY); + expect(0, header.X); + expect(0, header.Y); + todo_wine expect(320, header.Width); + todo_wine expect(320, header.Height); + todo_wine expect(1, U(header).WmfHeader.mtType); + expect(0, header.EmfPlusHeaderSize); + expect(0, header.LogicalDpiX); + expect(0, header.LogicalDpiY); + } + GdipDisposeImage(img); } @@ -1544,7 +1622,7 @@ static void test_multiframegif(void) count = 12345; stat = GdipImageGetFrameCount((GpImage*)bmp, &dimension, &count); - todo_wine expect(Ok, stat); + expect(Ok, stat); todo_wine expect(2, count); /* SelectActiveFrame overwrites our current data */ @@ -1618,8 +1696,8 @@ static void test_multiframegif(void) count = 12345; stat = GdipImageGetFrameCount((GpImage*)bmp, &dimension, &count); - todo_wine expect(Ok, stat); - todo_wine expect(1, count); + expect(Ok, stat); + expect(1, count); GdipDisposeImage((GpImage*)bmp); IStream_Release(stream); @@ -1641,30 +1719,30 @@ static void test_rotateflip(void) expect(Ok, stat); stat = GdipImageRotateFlip(bitmap, Rotate90FlipNone); - todo_wine expect(Ok, stat); + expect(Ok, stat); stat = GdipGetImageWidth(bitmap, &width); expect(Ok, stat); stat = GdipGetImageHeight(bitmap, &height); expect(Ok, stat); - todo_wine expect(2, width); - todo_wine expect(3, height); + expect(2, width); + expect(3, height); stat = GdipBitmapGetPixel((GpBitmap*)bitmap, 0, 0, &color); expect(Ok, stat); - todo_wine expect(0xff00ffff, color); + expect(0xff00ffff, color); stat = GdipBitmapGetPixel((GpBitmap*)bitmap, 1, 0, &color); expect(Ok, stat); - todo_wine expect(0xffff0000, color); + expect(0xffff0000, color); stat = GdipBitmapGetPixel((GpBitmap*)bitmap, 0, 2, &color); - todo_wine expect(Ok, stat); - todo_wine expect(0xffffff00, color); + expect(Ok, stat); + expect(0xffffff00, color); stat = GdipBitmapGetPixel((GpBitmap*)bitmap, 1, 2, &color); - todo_wine expect(Ok, stat); - todo_wine expect(0xff0000ff, color); + expect(Ok, stat); + expect(0xff0000ff, color); expect(0, bits[0]); expect(0, bits[1]); @@ -1677,7 +1755,7 @@ static void test_rotateflip(void) expect(Ok, stat); stat = GdipImageRotateFlip(bitmap, RotateNoneFlipX); - todo_wine expect(Ok, stat); + expect(Ok, stat); stat = GdipGetImageWidth(bitmap, &width); expect(Ok, stat); @@ -1688,19 +1766,19 @@ static void test_rotateflip(void) stat = GdipBitmapGetPixel((GpBitmap*)bitmap, 0, 0, &color); expect(Ok, stat); - todo_wine expect(0xff0000ff, color); + expect(0xff0000ff, color); stat = GdipBitmapGetPixel((GpBitmap*)bitmap, 2, 0, &color); expect(Ok, stat); - todo_wine expect(0xffff0000, color); + expect(0xffff0000, color); stat = GdipBitmapGetPixel((GpBitmap*)bitmap, 0, 1, &color); expect(Ok, stat); - todo_wine expect(0xffffff00, color); + expect(0xffffff00, color); stat = GdipBitmapGetPixel((GpBitmap*)bitmap, 2, 1, &color); expect(Ok, stat); - todo_wine expect(0xff00ffff, color); + expect(0xff00ffff, color); expect(0, bits[0]); expect(0, bits[1]); @@ -1713,7 +1791,7 @@ static void test_rotateflip(void) expect(Ok, stat); stat = GdipImageRotateFlip(bitmap, RotateNoneFlipY); - todo_wine expect(Ok, stat); + expect(Ok, stat); stat = GdipGetImageWidth(bitmap, &width); expect(Ok, stat); @@ -1724,19 +1802,19 @@ static void test_rotateflip(void) stat = GdipBitmapGetPixel((GpBitmap*)bitmap, 0, 0, &color); expect(Ok, stat); - todo_wine expect(0xff00ffff, color); + expect(0xff00ffff, color); stat = GdipBitmapGetPixel((GpBitmap*)bitmap, 2, 0, &color); expect(Ok, stat); - todo_wine expect(0xffffff00, color); + expect(0xffffff00, color); stat = GdipBitmapGetPixel((GpBitmap*)bitmap, 0, 1, &color); expect(Ok, stat); - todo_wine expect(0xffff0000, color); + expect(0xffff0000, color); stat = GdipBitmapGetPixel((GpBitmap*)bitmap, 2, 1, &color); expect(Ok, stat); - todo_wine expect(0xff0000ff, color); + expect(0xff0000ff, color); expect(0, bits[0]); expect(0, bits[1]); @@ -1801,7 +1879,7 @@ static void test_remaptable(void) stat = GdipBitmapGetPixel(bitmap2, 0, 0, &color); expect(Ok, stat); - todo_wine ok(color_match(0xffff00ff, color, 1), "Expected ffff00ff, got %.8x\n", color); + ok(color_match(0xffff00ff, color, 1), "Expected ffff00ff, got %.8x\n", color); GdipDeleteGraphics(graphics); GdipDisposeImage((GpImage*)bitmap1); diff --git a/rostests/winetests/inetcomm/mimeintl.c b/rostests/winetests/inetcomm/mimeintl.c index 563943f663b..f64d7d93d23 100644 --- a/rostests/winetests/inetcomm/mimeintl.c +++ b/rostests/winetests/inetcomm/mimeintl.c @@ -156,7 +156,7 @@ static void test_charset(void) hr = MimeOleGetInternat(&internat); ok(hr == S_OK, "ret %08x\n", hr); - hr = IMimeInternational_FindCharset(internat, "non-existent", &hcs); + hr = IMimeInternational_FindCharset(internat, "nonexistent", &hcs); ok(hr == MIME_E_NOT_FOUND, "got %08x\n", hr); hr = IMimeInternational_FindCharset(internat, "windows-1252", &hcs_windows_1252); diff --git a/rostests/winetests/jscript/regexp.js b/rostests/winetests/jscript/regexp.js index fac111227fe..7b74cb11421 100644 --- a/rostests/winetests/jscript/regexp.js +++ b/rostests/winetests/jscript/regexp.js @@ -113,6 +113,7 @@ ok(typeof(m) === "object", "typeof m is not object"); ok(m.length === 2, "m.length is not 2"); ok(m["0"] === "ab", "m[0] is not \"ab\""); ok(m["1"] === "ab", "m[1] is not \"ab\""); +/* ok(m.input === "abcabc", "m.input = " + m.input); */ m = "abcabc".match(/Ab/g); ok(typeof(m) === "object", "typeof m is not object"); @@ -167,6 +168,32 @@ ok(m["0"] === "ab", "m[0] is not \"ab\""); m = "abcabc".match(); ok(m === null, "m is not null"); +m = "abcabc".match(/(a)(b)cabc/); +ok(typeof(m) === "object", "typeof m is not object"); +ok(m.length === 3, "m.length is not 3"); +ok(m[0] === "abcabc", "m[0] is not \"abc\""); +ok(m[1] === "a", "m[1] is not \"a\""); +ok(m[2] === "b", "m[2] is not \"b\""); + +re = /(a)bcabc/; +re.lastIndex = -3; +m = "abcabc".match(re); +ok(typeof(m) === "object", "typeof m is not object"); +ok(m.length === 2, "m.length = " + m.length + "expected 3"); +ok(m[0] === "abcabc", "m[0] is not \"abc\""); +ok(m[1] === "a", "m[1] is not \"a\""); +ok(re.lastIndex === 6, "re.lastIndex = " + re.lastIndex); + +re = /(a)bcabc/; +re.lastIndex = 2; +m = "abcabcxxx".match(re); +ok(typeof(m) === "object", "typeof m is not object"); +ok(m.length === 2, "m.length = " + m.length + "expected 3"); +ok(m[0] === "abcabc", "m[0] is not \"abc\""); +ok(m[1] === "a", "m[1] is not \"a\""); +ok(m.input === "abcabcxxx", "m.input = " + m.input); +ok(re.lastIndex === 6, "re.lastIndex = " + re.lastIndex); + r = "- [test] -".replace(re = /\[([^\[]+)\]/g, "success"); ok(r === "- success -", "r = " + r + " expected '- success -'"); ok(re.lastIndex === 8, "re.lastIndex = " + re.lastIndex); @@ -410,6 +437,19 @@ m = re.exec(" "); ok(re.lastIndex === 0, "re.lastIndex = " + re.lastIndex + " expected 0"); ok(m === null, "m = " + m + " expected null"); +re = /a/; +re.lastIndex = -3; +ok(re.lastIndex === -3, "re.lastIndex = " + re.lastIndex + " expected -3"); +m = re.exec(" a a "); +ok(re.lastIndex === 2, "re.lastIndex = " + re.lastIndex + " expected 0"); +ok(m.index === 1, "m = " + m + " expected 1"); + +re.lastIndex = -1; +ok(re.lastIndex === -1, "re.lastIndex = " + re.lastIndex + " expected -1"); +m = re.exec(" "); +ok(re.lastIndex === 0, "re.lastIndex = " + re.lastIndex + " expected 0"); +ok(m === null, "m = " + m + " expected null"); + re = /aa/g; i = 'baacd'.search(re); ok(i === 1, "'baacd'.search(re) = " + i); diff --git a/rostests/winetests/msctf/inputprocessor.c b/rostests/winetests/msctf/inputprocessor.c index 7ba9140573a..c445b41b01e 100644 --- a/rostests/winetests/msctf/inputprocessor.c +++ b/rostests/winetests/msctf/inputprocessor.c @@ -38,15 +38,28 @@ static ITfDocumentMgr *g_dm = NULL; static TfClientId cid = 0; static TfClientId tid = 0; +static ITextStoreACPSink *ACPSink; + #define SINK_UNEXPECTED 0 #define SINK_EXPECTED 1 #define SINK_FIRED 2 +#define SINK_IGNORE 3 +#define SINK_OPTIONAL 4 + +#define SINK_ACTION_MASK 0xff +#define SINK_OPTION_MASK 0xff00 +#define SINK_EXPECTED_COUNT_MASK 0xff0000 + +#define SINK_OPTION_TODO 0x0100 + +#define FOCUS_IGNORE (ITfDocumentMgr*)0xffffffff static BOOL test_ShouldActivate = FALSE; static BOOL test_ShouldDeactivate = FALSE; static DWORD tmSinkCookie; static DWORD tmSinkRefCount; +static DWORD documentStatus; static ITfDocumentMgr *test_CurrentFocus = NULL; static ITfDocumentMgr *test_PrevFocus = NULL; static INT test_OnSetFocus = SINK_UNEXPECTED; @@ -54,671 +67,81 @@ static INT test_OnInitDocumentMgr = SINK_UNEXPECTED; static INT test_OnPushContext = SINK_UNEXPECTED; static INT test_OnPopContext = SINK_UNEXPECTED; static INT test_KEV_OnSetFocus = SINK_UNEXPECTED; - -HRESULT RegisterTextService(REFCLSID rclsid); -HRESULT UnregisterTextService(); -HRESULT ThreadMgrEventSink_Constructor(IUnknown **ppOut); -HRESULT TextStoreACP_Constructor(IUnknown **ppOut); - -DEFINE_GUID(CLSID_FakeService, 0xEDE1A7AD,0x66DE,0x47E0,0xB6,0x20,0x3E,0x92,0xF8,0x24,0x6B,0xF3); -DEFINE_GUID(CLSID_TF_InputProcessorProfiles, 0x33c53a50,0xf456,0x4884,0xb0,0x49,0x85,0xfd,0x64,0x3e,0xcf,0xed); -DEFINE_GUID(CLSID_TF_CategoryMgr, 0xA4B544A1,0x438D,0x4B41,0x93,0x25,0x86,0x95,0x23,0xE2,0xD6,0xC7); -DEFINE_GUID(GUID_TFCAT_TIP_KEYBOARD, 0x34745c63,0xb2f0,0x4784,0x8b,0x67,0x5e,0x12,0xc8,0x70,0x1a,0x31); -DEFINE_GUID(GUID_TFCAT_TIP_SPEECH, 0xB5A73CD1,0x8355,0x426B,0xA1,0x61,0x25,0x98,0x08,0xF2,0x6B,0x14); -DEFINE_GUID(GUID_TFCAT_TIP_HANDWRITING, 0x246ecb87,0xc2f2,0x4abe,0x90,0x5b,0xc8,0xb3,0x8a,0xdd,0x2c,0x43); -DEFINE_GUID (GUID_TFCAT_DISPLAYATTRIBUTEPROVIDER, 0x046B8C80,0x1647,0x40F7,0x9B,0x21,0xB9,0x3B,0x81,0xAA,0xBC,0x1B); -DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0); -DEFINE_GUID(CLSID_TF_ThreadMgr, 0x529a9e6b,0x6587,0x4f23,0xab,0x9e,0x9c,0x7d,0x68,0x3e,0x3c,0x50); -DEFINE_GUID(CLSID_PreservedKey, 0xA0ED8E55,0xCD3B,0x4274,0xB2,0x95,0xF6,0xC9,0xBA,0x2B,0x84,0x72); +static INT test_ACP_AdviseSink = SINK_UNEXPECTED; +static INT test_ACP_GetStatus = SINK_UNEXPECTED; +static INT test_ACP_RequestLock = SINK_UNEXPECTED; +static INT test_ACP_GetEndACP = SINK_UNEXPECTED; +static INT test_ACP_GetSelection = SINK_UNEXPECTED; +static INT test_DoEditSession = SINK_UNEXPECTED; +static INT test_ACP_InsertTextAtSelection = SINK_UNEXPECTED; +static INT test_ACP_SetSelection = SINK_UNEXPECTED; +static INT test_OnEndEdit = SINK_UNEXPECTED; -static HRESULT initialize(void) +static inline int expected_count(int *sink) { - HRESULT hr; - CoInitialize(NULL); - hr = CoCreateInstance (&CLSID_TF_InputProcessorProfiles, NULL, - CLSCTX_INPROC_SERVER, &IID_ITfInputProcessorProfiles, (void**)&g_ipp); - if (SUCCEEDED(hr)) - hr = CoCreateInstance (&CLSID_TF_CategoryMgr, NULL, - CLSCTX_INPROC_SERVER, &IID_ITfCategoryMgr, (void**)&g_cm); - if (SUCCEEDED(hr)) - hr = CoCreateInstance (&CLSID_TF_ThreadMgr, NULL, - CLSCTX_INPROC_SERVER, &IID_ITfThreadMgr, (void**)&g_tm); - return hr; + return (*sink & SINK_EXPECTED_COUNT_MASK)>>16; } -static void cleanup(void) +static inline void _sink_fire_ok(INT *sink, const CHAR* name) { - if (g_ipp) - ITfInputProcessorProfiles_Release(g_ipp); - if (g_cm) - ITfCategoryMgr_Release(g_cm); - if (g_tm) - ITfThreadMgr_Release(g_tm); - CoUninitialize(); -} + int count; + int todo = *sink & SINK_OPTION_TODO; + int action = *sink & SINK_ACTION_MASK; -static void test_Register(void) -{ - HRESULT hr; + if (winetest_interactive) + winetest_trace("firing %s\n",name); - static const WCHAR szDesc[] = {'F','a','k','e',' ','W','i','n','e',' ','S','e','r','v','i','c','e',0}; - static const WCHAR szFile[] = {'F','a','k','e',' ','W','i','n','e',' ','S','e','r','v','i','c','e',' ','F','i','l','e',0}; - - hr = ITfInputProcessorProfiles_GetCurrentLanguage(g_ipp,&gLangid); - ok(SUCCEEDED(hr),"Unable to get current language id\n"); - trace("Current Language %x\n",gLangid); - - hr = RegisterTextService(&CLSID_FakeService); - ok(SUCCEEDED(hr),"Unable to register COM for TextService\n"); - hr = ITfInputProcessorProfiles_Register(g_ipp, &CLSID_FakeService); - ok(SUCCEEDED(hr),"Unable to register text service(%x)\n",hr); - hr = ITfInputProcessorProfiles_AddLanguageProfile(g_ipp, &CLSID_FakeService, gLangid, &CLSID_FakeService, szDesc, sizeof(szDesc)/sizeof(WCHAR), szFile, sizeof(szFile)/sizeof(WCHAR), 1); - ok(SUCCEEDED(hr),"Unable to add Language Profile (%x)\n",hr); -} - -static void test_Unregister(void) -{ - HRESULT hr; - hr = ITfInputProcessorProfiles_Unregister(g_ipp, &CLSID_FakeService); - ok(SUCCEEDED(hr),"Unable to unregister text service(%x)\n",hr); - UnregisterTextService(); -} - -static void test_EnumInputProcessorInfo(void) -{ - IEnumGUID *ppEnum; - BOOL found = FALSE; - - if (SUCCEEDED(ITfInputProcessorProfiles_EnumInputProcessorInfo(g_ipp, &ppEnum))) + switch (action) { - ULONG fetched; - GUID g; - while (IEnumGUID_Next(ppEnum, 1, &g, &fetched) == S_OK) - { - if(IsEqualGUID(&g,&CLSID_FakeService)) - found = TRUE; - } - } - ok(found,"Did not find registered text service\n"); -} - -static void test_EnumLanguageProfiles(void) -{ - BOOL found = FALSE; - IEnumTfLanguageProfiles *ppEnum; - if (SUCCEEDED(ITfInputProcessorProfiles_EnumLanguageProfiles(g_ipp,gLangid,&ppEnum))) - { - TF_LANGUAGEPROFILE profile; - while (IEnumTfLanguageProfiles_Next(ppEnum,1,&profile,NULL)==S_OK) - { - if (IsEqualGUID(&profile.clsid,&CLSID_FakeService)) + case SINK_OPTIONAL: + case SINK_EXPECTED: + count = expected_count(sink); + if (count > 1) { - found = TRUE; - ok(profile.langid == gLangid, "LangId Incorrect\n"); - ok(IsEqualGUID(&profile.catid,&GUID_TFCAT_TIP_KEYBOARD), "CatId Incorrect\n"); - ok(IsEqualGUID(&profile.guidProfile,&CLSID_FakeService), "guidProfile Incorrect\n"); + count --; + *sink = (*sink & ~SINK_EXPECTED_COUNT_MASK) + (count << 16); + return; } - } + break; + case SINK_IGNORE: + winetest_trace("Ignoring %s\n",name); + return; + default: + if (todo) + todo_wine winetest_ok(0, "Unexpected %s sink\n",name); + else + winetest_ok(0, "Unexpected %s sink\n",name); } - ok(found,"Registered text service not found\n"); + *sink = SINK_FIRED; } -static void test_RegisterCategory(void) +#define sink_fire_ok(a,b) (winetest_set_location(__FILE__,__LINE__), 0) ? 0 : _sink_fire_ok(a,b) + +static inline void _sink_check_ok(INT *sink, const CHAR* name) { - HRESULT hr; - hr = ITfCategoryMgr_RegisterCategory(g_cm, &CLSID_FakeService, &GUID_TFCAT_TIP_KEYBOARD, &CLSID_FakeService); - ok(SUCCEEDED(hr),"ITfCategoryMgr_RegisterCategory failed\n"); - hr = ITfCategoryMgr_RegisterCategory(g_cm, &CLSID_FakeService, &GUID_TFCAT_DISPLAYATTRIBUTEPROVIDER, &CLSID_FakeService); - ok(SUCCEEDED(hr),"ITfCategoryMgr_RegisterCategory failed\n"); -} + int action = *sink & SINK_ACTION_MASK; + int todo = *sink & SINK_OPTION_TODO; -static void test_UnregisterCategory(void) -{ - HRESULT hr; - hr = ITfCategoryMgr_UnregisterCategory(g_cm, &CLSID_FakeService, &GUID_TFCAT_TIP_KEYBOARD, &CLSID_FakeService); - ok(SUCCEEDED(hr),"ITfCategoryMgr_UnregisterCategory failed\n"); - hr = ITfCategoryMgr_UnregisterCategory(g_cm, &CLSID_FakeService, &GUID_TFCAT_DISPLAYATTRIBUTEPROVIDER, &CLSID_FakeService); - ok(SUCCEEDED(hr),"ITfCategoryMgr_UnregisterCategory failed\n"); -} - -static void test_FindClosestCategory(void) -{ - GUID output; - HRESULT hr; - const GUID *list[3] = {&GUID_TFCAT_TIP_SPEECH, &GUID_TFCAT_TIP_KEYBOARD, &GUID_TFCAT_TIP_HANDWRITING}; - - hr = ITfCategoryMgr_FindClosestCategory(g_cm, &CLSID_FakeService, &output, NULL, 0); - ok(SUCCEEDED(hr),"ITfCategoryMgr_FindClosestCategory failed (%x)\n",hr); - ok(IsEqualGUID(&output,&GUID_TFCAT_DISPLAYATTRIBUTEPROVIDER),"Wrong GUID\n"); - - hr = ITfCategoryMgr_FindClosestCategory(g_cm, &CLSID_FakeService, &output, list, 1); - ok(SUCCEEDED(hr),"ITfCategoryMgr_FindClosestCategory failed (%x)\n",hr); - ok(IsEqualGUID(&output,&GUID_NULL),"Wrong GUID\n"); - - hr = ITfCategoryMgr_FindClosestCategory(g_cm, &CLSID_FakeService, &output, list, 3); - ok(SUCCEEDED(hr),"ITfCategoryMgr_FindClosestCategory failed (%x)\n",hr); - ok(IsEqualGUID(&output,&GUID_TFCAT_TIP_KEYBOARD),"Wrong GUID\n"); -} - -static void test_Enable(void) -{ - HRESULT hr; - BOOL enabled = FALSE; - - hr = ITfInputProcessorProfiles_EnableLanguageProfile(g_ipp,&CLSID_FakeService, gLangid, &CLSID_FakeService, TRUE); - ok(SUCCEEDED(hr),"Failed to enable text service\n"); - hr = ITfInputProcessorProfiles_IsEnabledLanguageProfile(g_ipp,&CLSID_FakeService, gLangid, &CLSID_FakeService, &enabled); - ok(SUCCEEDED(hr),"Failed to get enabled state\n"); - ok(enabled == TRUE,"enabled state incorrect\n"); -} - -static void test_Disable(void) -{ - HRESULT hr; - - trace("Disabling\n"); - hr = ITfInputProcessorProfiles_EnableLanguageProfile(g_ipp,&CLSID_FakeService, gLangid, &CLSID_FakeService, FALSE); - ok(SUCCEEDED(hr),"Failed to disable text service\n"); -} - -static void test_ThreadMgrAdviseSinks(void) -{ - ITfSource *source = NULL; - HRESULT hr; - IUnknown *sink; - - hr = ITfThreadMgr_QueryInterface(g_tm, &IID_ITfSource, (LPVOID*)&source); - ok(SUCCEEDED(hr),"Failed to get IID_ITfSource for ThreadMgr\n"); - if (!source) - return; - - ThreadMgrEventSink_Constructor(&sink); - - tmSinkRefCount = 1; - tmSinkCookie = 0; - hr = ITfSource_AdviseSink(source,&IID_ITfThreadMgrEventSink, sink, &tmSinkCookie); - ok(SUCCEEDED(hr),"Failed to Advise Sink\n"); - ok(tmSinkCookie!=0,"Failed to get sink cookie\n"); - - /* Advising the sink adds a ref, Relesing here lets the object be deleted - when unadvised */ - tmSinkRefCount = 2; - IUnknown_Release(sink); - ITfSource_Release(source); -} - -static void test_ThreadMgrUnadviseSinks(void) -{ - ITfSource *source = NULL; - HRESULT hr; - - hr = ITfThreadMgr_QueryInterface(g_tm, &IID_ITfSource, (LPVOID*)&source); - ok(SUCCEEDED(hr),"Failed to get IID_ITfSource for ThreadMgr\n"); - if (!source) - return; - - tmSinkRefCount = 1; - hr = ITfSource_UnadviseSink(source, tmSinkCookie); - ok(SUCCEEDED(hr),"Failed to unadvise Sink\n"); - ITfSource_Release(source); -} - -/********************************************************************** - * ITfKeyEventSink - **********************************************************************/ -typedef struct tagKeyEventSink -{ - const ITfKeyEventSinkVtbl *KeyEventSinkVtbl; - LONG refCount; -} KeyEventSink; - -static void KeyEventSink_Destructor(KeyEventSink *This) -{ - HeapFree(GetProcessHeap(),0,This); -} - -static HRESULT WINAPI KeyEventSink_QueryInterface(ITfKeyEventSink *iface, REFIID iid, LPVOID *ppvOut) -{ - KeyEventSink *This = (KeyEventSink *)iface; - *ppvOut = NULL; - - if (IsEqualIID(iid, &IID_IUnknown) || IsEqualIID(iid, &IID_ITfKeyEventSink)) + switch (action) { - *ppvOut = This; + case SINK_OPTIONAL: + if (winetest_interactive) + winetest_trace("optional sink %s not fired\n",name); + case SINK_FIRED: + break; + case SINK_IGNORE: + return; + default: + if (todo) + todo_wine winetest_ok(0, "%s not fired as expected, in state %x\n",name,*sink); + else + winetest_ok(0, "%s not fired as expected, in state %x\n",name,*sink); } - - if (*ppvOut) - { - IUnknown_AddRef(iface); - return S_OK; - } - - return E_NOINTERFACE; + *sink = SINK_UNEXPECTED; } -static ULONG WINAPI KeyEventSink_AddRef(ITfKeyEventSink *iface) -{ - KeyEventSink *This = (KeyEventSink *)iface; - return InterlockedIncrement(&This->refCount); -} - -static ULONG WINAPI KeyEventSink_Release(ITfKeyEventSink *iface) -{ - KeyEventSink *This = (KeyEventSink *)iface; - ULONG ret; - - ret = InterlockedDecrement(&This->refCount); - if (ret == 0) - KeyEventSink_Destructor(This); - return ret; -} - -static HRESULT WINAPI KeyEventSink_OnSetFocus(ITfKeyEventSink *iface, - BOOL fForeground) -{ - ok(test_KEV_OnSetFocus == SINK_EXPECTED,"Unexpected KeyEventSink_OnSetFocus\n"); - test_KEV_OnSetFocus = SINK_FIRED; - return S_OK; -} - -static HRESULT WINAPI KeyEventSink_OnTestKeyDown(ITfKeyEventSink *iface, - ITfContext *pic, WPARAM wParam, LPARAM lParam, BOOL *pfEaten) -{ - trace("\n"); - return S_OK; -} - -static HRESULT WINAPI KeyEventSink_OnTestKeyUp(ITfKeyEventSink *iface, - ITfContext *pic, WPARAM wParam, LPARAM lParam, BOOL *pfEaten) -{ - trace("\n"); - return S_OK; -} - -static HRESULT WINAPI KeyEventSink_OnKeyDown(ITfKeyEventSink *iface, - ITfContext *pic, WPARAM wParam, LPARAM lParam, BOOL *pfEaten) -{ - trace("\n"); - return S_OK; -} - -static HRESULT WINAPI KeyEventSink_OnKeyUp(ITfKeyEventSink *iface, - ITfContext *pic, WPARAM wParam, LPARAM lParam, BOOL *pfEaten) -{ - trace("\n"); - return S_OK; -} - -static HRESULT WINAPI KeyEventSink_OnPreservedKey(ITfKeyEventSink *iface, - ITfContext *pic, REFGUID rguid, BOOL *pfEaten) -{ - trace("\n"); - return S_OK; -} - -static const ITfKeyEventSinkVtbl KeyEventSink_KeyEventSinkVtbl = -{ - KeyEventSink_QueryInterface, - KeyEventSink_AddRef, - KeyEventSink_Release, - - KeyEventSink_OnSetFocus, - KeyEventSink_OnTestKeyDown, - KeyEventSink_OnTestKeyUp, - KeyEventSink_OnKeyDown, - KeyEventSink_OnKeyUp, - KeyEventSink_OnPreservedKey -}; - -HRESULT KeyEventSink_Constructor(ITfKeyEventSink **ppOut) -{ - KeyEventSink *This; - - This = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(KeyEventSink)); - if (This == NULL) - return E_OUTOFMEMORY; - - This->KeyEventSinkVtbl = &KeyEventSink_KeyEventSinkVtbl; - This->refCount = 1; - - *ppOut = (ITfKeyEventSink*)This; - return S_OK; -} - - -static void test_KeystrokeMgr(void) -{ - ITfKeystrokeMgr *keymgr= NULL; - HRESULT hr; - TF_PRESERVEDKEY tfpk; - BOOL preserved; - ITfKeyEventSink *sink; - - KeyEventSink_Constructor(&sink); - - hr = ITfThreadMgr_QueryInterface(g_tm, &IID_ITfKeystrokeMgr, (LPVOID*)&keymgr); - ok(SUCCEEDED(hr),"Failed to get IID_ITfKeystrokeMgr for ThreadMgr\n"); - - tfpk.uVKey = 'A'; - tfpk.uModifiers = TF_MOD_SHIFT; - - test_KEV_OnSetFocus = SINK_EXPECTED; - hr = ITfKeystrokeMgr_AdviseKeyEventSink(keymgr,tid,sink,TRUE); - todo_wine ok(SUCCEEDED(hr),"ITfKeystrokeMgr_AdviseKeyEventSink failed\n"); - todo_wine ok(test_KEV_OnSetFocus == SINK_FIRED, "KeyEventSink_OnSetFocus not fired as expected\n"); - - hr =ITfKeystrokeMgr_PreserveKey(keymgr, 0, &CLSID_PreservedKey, &tfpk, NULL, 0); - ok(hr==E_INVALIDARG,"ITfKeystrokeMgr_PreserveKey inproperly succeeded\n"); - - hr =ITfKeystrokeMgr_PreserveKey(keymgr, tid, &CLSID_PreservedKey, &tfpk, NULL, 0); - ok(SUCCEEDED(hr),"ITfKeystrokeMgr_PreserveKey failed\n"); - - hr =ITfKeystrokeMgr_PreserveKey(keymgr, tid, &CLSID_PreservedKey, &tfpk, NULL, 0); - ok(hr == TF_E_ALREADY_EXISTS,"ITfKeystrokeMgr_PreserveKey inproperly succeeded\n"); - - preserved = FALSE; - hr = ITfKeystrokeMgr_IsPreservedKey(keymgr, &CLSID_PreservedKey, &tfpk, &preserved); - ok(hr == S_OK, "ITfKeystrokeMgr_IsPreservedKey failed\n"); - if (hr == S_OK) ok(preserved == TRUE,"misreporting preserved key\n"); - - hr = ITfKeystrokeMgr_UnpreserveKey(keymgr, &CLSID_PreservedKey,&tfpk); - ok(SUCCEEDED(hr),"ITfKeystrokeMgr_UnpreserveKey failed\n"); - - hr = ITfKeystrokeMgr_IsPreservedKey(keymgr, &CLSID_PreservedKey, &tfpk, &preserved); - ok(hr == S_FALSE, "ITfKeystrokeMgr_IsPreservedKey failed\n"); - if (hr == S_FALSE) ok(preserved == FALSE,"misreporting preserved key\n"); - - hr = ITfKeystrokeMgr_UnpreserveKey(keymgr, &CLSID_PreservedKey,&tfpk); - ok(hr==CONNECT_E_NOCONNECTION,"ITfKeystrokeMgr_UnpreserveKey inproperly succeeded\n"); - - hr = ITfKeystrokeMgr_UnadviseKeyEventSink(keymgr,tid); - todo_wine ok(SUCCEEDED(hr),"ITfKeystrokeMgr_UnadviseKeyEventSink failed\n"); - - ITfKeystrokeMgr_Release(keymgr); - ITfKeyEventSink_Release(sink); -} - -static void test_Activate(void) -{ - HRESULT hr; - - hr = ITfInputProcessorProfiles_ActivateLanguageProfile(g_ipp,&CLSID_FakeService,gLangid,&CLSID_FakeService); - ok(SUCCEEDED(hr),"Failed to Activate text service\n"); -} - -static inline int check_context_refcount(ITfContext *iface) -{ - IUnknown_AddRef(iface); - return IUnknown_Release(iface); -} - -static void test_startSession(void) -{ - HRESULT hr; - DWORD cnt; - DWORD editCookie; - ITfDocumentMgr *dmtest; - ITfContext *cxt,*cxt2,*cxt3,*cxtTest; - ITextStoreACP *ts; - TfClientId cid2 = 0; - - hr = ITfThreadMgr_Deactivate(g_tm); - ok(hr == E_UNEXPECTED,"Deactivate should have failed with E_UNEXPECTED\n"); - - test_ShouldActivate = TRUE; - hr = ITfThreadMgr_Activate(g_tm,&cid); - ok(SUCCEEDED(hr),"Failed to Activate\n"); - ok(cid != tid,"TextService id mistakenly matches Client id\n"); - - test_ShouldActivate = FALSE; - hr = ITfThreadMgr_Activate(g_tm,&cid2); - ok(SUCCEEDED(hr),"Failed to Activate\n"); - ok (cid == cid2, "Second activate client ID does not match\n"); - - hr = ITfThreadMgr_Deactivate(g_tm); - ok(SUCCEEDED(hr),"Failed to Deactivate\n"); - - hr = ITfThreadMgr_CreateDocumentMgr(g_tm,&g_dm); - ok(SUCCEEDED(hr),"CreateDocumentMgr failed\n"); - - hr = ITfThreadMgr_GetFocus(g_tm,&dmtest); - ok(SUCCEEDED(hr),"GetFocus Failed\n"); - ok(dmtest == NULL,"Initial focus not null\n"); - - test_CurrentFocus = g_dm; - test_PrevFocus = NULL; - test_OnSetFocus = SINK_EXPECTED; - hr = ITfThreadMgr_SetFocus(g_tm,g_dm); - ok(SUCCEEDED(hr),"SetFocus Failed\n"); - ok(test_OnSetFocus == SINK_FIRED, "OnSetFocus sink not called\n"); - test_OnSetFocus = SINK_UNEXPECTED; - - hr = ITfThreadMgr_GetFocus(g_tm,&dmtest); - ok(SUCCEEDED(hr),"GetFocus Failed\n"); - ok(g_dm == dmtest,"Expected DocumentMgr not focused\n"); - - cnt = ITfDocumentMgr_Release(g_dm); - ok(cnt == 2,"DocumentMgr refcount not expected (2 vs %i)\n",cnt); - - hr = ITfThreadMgr_GetFocus(g_tm,&dmtest); - ok(SUCCEEDED(hr),"GetFocus Failed\n"); - ok(g_dm == dmtest,"Expected DocumentMgr not focused\n"); - - TextStoreACP_Constructor((IUnknown**)&ts); - - hr = ITfDocumentMgr_CreateContext(g_dm, cid, 0, (IUnknown*)ts, &cxt, &editCookie); - ok(SUCCEEDED(hr),"CreateContext Failed\n"); - - hr = ITfDocumentMgr_CreateContext(g_dm, cid, 0, NULL, &cxt2, &editCookie); - ok(SUCCEEDED(hr),"CreateContext Failed\n"); - - hr = ITfDocumentMgr_CreateContext(g_dm, cid, 0, NULL, &cxt3, &editCookie); - ok(SUCCEEDED(hr),"CreateContext Failed\n"); - - cnt = check_context_refcount(cxt); - test_OnPushContext = SINK_EXPECTED; - test_OnInitDocumentMgr = SINK_EXPECTED; - hr = ITfDocumentMgr_Push(g_dm, cxt); - ok(SUCCEEDED(hr),"Push Failed\n"); - ok(check_context_refcount(cxt) > cnt, "Ref count did not increase\n"); - ok(test_OnPushContext == SINK_FIRED, "OnPushContext sink not fired\n"); - ok(test_OnInitDocumentMgr == SINK_FIRED, "OnInitDocumentMgr sink not fired\n"); - - hr = ITfDocumentMgr_GetTop(g_dm, &cxtTest); - ok(SUCCEEDED(hr),"GetTop Failed\n"); - ok(cxtTest == cxt, "Wrong context on top\n"); - ok(check_context_refcount(cxt) > cnt, "Ref count did not increase\n"); - cnt = ITfContext_Release(cxtTest); - - hr = ITfDocumentMgr_GetBase(g_dm, &cxtTest); - ok(SUCCEEDED(hr),"GetBase Failed\n"); - ok(cxtTest == cxt, "Wrong context on Base\n"); - ok(check_context_refcount(cxt) > cnt, "Ref count did not increase\n"); - ITfContext_Release(cxtTest); - - check_context_refcount(cxt2); - test_OnPushContext = SINK_EXPECTED; - hr = ITfDocumentMgr_Push(g_dm, cxt2); - ok(SUCCEEDED(hr),"Push Failed\n"); - ok(test_OnPushContext == SINK_FIRED, "OnPushContext sink not fired\n"); - - cnt = check_context_refcount(cxt2); - hr = ITfDocumentMgr_GetTop(g_dm, &cxtTest); - ok(SUCCEEDED(hr),"GetTop Failed\n"); - ok(cxtTest == cxt2, "Wrong context on top\n"); - ok(check_context_refcount(cxt2) > cnt, "Ref count did not increase\n"); - ITfContext_Release(cxtTest); - - cnt = check_context_refcount(cxt); - hr = ITfDocumentMgr_GetBase(g_dm, &cxtTest); - ok(SUCCEEDED(hr),"GetBase Failed\n"); - ok(cxtTest == cxt, "Wrong context on Base\n"); - ok(check_context_refcount(cxt) > cnt, "Ref count did not increase\n"); - ITfContext_Release(cxtTest); - - cnt = check_context_refcount(cxt3); - hr = ITfDocumentMgr_Push(g_dm, cxt3); - ok(!SUCCEEDED(hr),"Push Succeeded\n"); - ok(check_context_refcount(cxt3) == cnt, "Ref changed\n"); - - cnt = check_context_refcount(cxt2); - hr = ITfDocumentMgr_GetTop(g_dm, &cxtTest); - ok(SUCCEEDED(hr),"GetTop Failed\n"); - ok(cxtTest == cxt2, "Wrong context on top\n"); - ok(check_context_refcount(cxt2) > cnt, "Ref count did not increase\n"); - ITfContext_Release(cxtTest); - - cnt = check_context_refcount(cxt); - hr = ITfDocumentMgr_GetBase(g_dm, &cxtTest); - ok(SUCCEEDED(hr),"GetBase Failed\n"); - ok(cxtTest == cxt, "Wrong context on Base\n"); - ok(check_context_refcount(cxt) > cnt, "Ref count did not increase\n"); - ITfContext_Release(cxtTest); - - cnt = check_context_refcount(cxt2); - test_OnPopContext = SINK_EXPECTED; - hr = ITfDocumentMgr_Pop(g_dm, 0); - ok(SUCCEEDED(hr),"Pop Failed\n"); - ok(check_context_refcount(cxt2) < cnt, "Ref count did not decrease\n"); - ok(test_OnPopContext == SINK_FIRED, "OnPopContext sink not fired\n"); - - hr = ITfDocumentMgr_GetTop(g_dm, &cxtTest); - ok(SUCCEEDED(hr),"GetTop Failed\n"); - ok(cxtTest == cxt, "Wrong context on top\n"); - ITfContext_Release(cxtTest); - - hr = ITfDocumentMgr_GetBase(g_dm, &cxtTest); - ok(SUCCEEDED(hr),"GetBase Failed\n"); - ok(cxtTest == cxt, "Wrong context on base\n"); - ITfContext_Release(cxtTest); - - hr = ITfDocumentMgr_Pop(g_dm, 0); - ok(!SUCCEEDED(hr),"Pop Succeeded\n"); - - hr = ITfDocumentMgr_GetTop(g_dm, &cxtTest); - ok(SUCCEEDED(hr),"GetTop Failed\n"); - ok(cxtTest == cxt, "Wrong context on top\n"); - ITfContext_Release(cxtTest); - - hr = ITfDocumentMgr_GetBase(g_dm, &cxtTest); - ok(SUCCEEDED(hr),"GetBase Failed\n"); - ok(cxtTest == cxt, "Wrong context on base\n"); - ITfContext_Release(cxtTest); - - ITfContext_Release(cxt); - ITfContext_Release(cxt2); - ITfContext_Release(cxt3); -} - -static void test_endSession(void) -{ - HRESULT hr; - test_ShouldDeactivate = TRUE; - test_CurrentFocus = NULL; - test_PrevFocus = g_dm; - test_OnSetFocus = SINK_EXPECTED; - hr = ITfThreadMgr_Deactivate(g_tm); - ok(SUCCEEDED(hr),"Failed to Deactivate\n"); - ok(test_OnSetFocus == SINK_FIRED, "OnSetFocus sink not called\n"); - test_OnSetFocus = SINK_UNEXPECTED; -} - -static void test_TfGuidAtom(void) -{ - GUID gtest,g1; - HRESULT hr; - TfGuidAtom atom1,atom2; - BOOL equal; - - CoCreateGuid(>est); - - /* msdn reports this should return E_INVALIDARG. However my test show it crashing (winxp)*/ - /* - hr = ITfCategoryMgr_RegisterGUID(g_cm,>est,NULL); - ok(hr==E_INVALIDARG,"ITfCategoryMgr_RegisterGUID should have failed\n"); - */ - hr = ITfCategoryMgr_RegisterGUID(g_cm,>est,&atom1); - ok(SUCCEEDED(hr),"ITfCategoryMgr_RegisterGUID failed\n"); - hr = ITfCategoryMgr_RegisterGUID(g_cm,>est,&atom2); - ok(SUCCEEDED(hr),"ITfCategoryMgr_RegisterGUID failed\n"); - ok(atom1 == atom2,"atoms do not match\n"); - hr = ITfCategoryMgr_GetGUID(g_cm,atom2,NULL); - ok(hr==E_INVALIDARG,"ITfCategoryMgr_GetGUID should have failed\n"); - hr = ITfCategoryMgr_GetGUID(g_cm,atom2,&g1); - ok(SUCCEEDED(hr),"ITfCategoryMgr_GetGUID failed\n"); - ok(IsEqualGUID(&g1,>est),"guids do not match\n"); - hr = ITfCategoryMgr_IsEqualTfGuidAtom(g_cm,atom1,>est,NULL); - ok(hr==E_INVALIDARG,"ITfCategoryMgr_IsEqualTfGuidAtom should have failed\n"); - hr = ITfCategoryMgr_IsEqualTfGuidAtom(g_cm,atom1,>est,&equal); - ok(SUCCEEDED(hr),"ITfCategoryMgr_IsEqualTfGuidAtom failed\n"); - ok(equal == TRUE,"Equal value invalid\n"); - - /* show that cid and tid TfClientIds are also TfGuidAtoms */ - hr = ITfCategoryMgr_IsEqualTfGuidAtom(g_cm,tid,&CLSID_FakeService,&equal); - ok(SUCCEEDED(hr),"ITfCategoryMgr_IsEqualTfGuidAtom failed\n"); - ok(equal == TRUE,"Equal value invalid\n"); - hr = ITfCategoryMgr_GetGUID(g_cm,cid,&g1); - ok(SUCCEEDED(hr),"ITfCategoryMgr_GetGUID failed\n"); - ok(!IsEqualGUID(&g1,&GUID_NULL),"guid should not be NULL\n"); -} - -static void test_ClientId(void) -{ - ITfClientId *pcid; - TfClientId id1,id2; - HRESULT hr; - GUID g2; - - hr = ITfThreadMgr_QueryInterface(g_tm, &IID_ITfClientId, (LPVOID*)&pcid); - ok(SUCCEEDED(hr),"Unable to aquire ITfClientId interface\n"); - - CoCreateGuid(&g2); - - hr = ITfClientId_GetClientId(pcid,&GUID_NULL,&id1); - ok(SUCCEEDED(hr),"GetClientId failed\n"); - hr = ITfClientId_GetClientId(pcid,&GUID_NULL,&id2); - ok(SUCCEEDED(hr),"GetClientId failed\n"); - ok(id1==id2,"Id's for GUID_NULL do not match\n"); - hr = ITfClientId_GetClientId(pcid,&CLSID_FakeService,&id2); - ok(SUCCEEDED(hr),"GetClientId failed\n"); - ok(id2!=id1,"Id matches GUID_NULL\n"); - ok(id2==tid,"Id for CLSID_FakeService not matching tid\n"); - ok(id2!=cid,"Id for CLSID_FakeService matching cid\n"); - hr = ITfClientId_GetClientId(pcid,&g2,&id2); - ok(SUCCEEDED(hr),"GetClientId failed\n"); - ok(id2!=id1,"Id matches GUID_NULL\n"); - ok(id2!=tid,"Id for random guid matching tid\n"); - ok(id2!=cid,"Id for random guid matching cid\n"); - ITfClientId_Release(pcid); -} - -START_TEST(inputprocessor) -{ - if (SUCCEEDED(initialize())) - { - test_Register(); - test_RegisterCategory(); - test_EnumInputProcessorInfo(); - test_Enable(); - test_ThreadMgrAdviseSinks(); - test_Activate(); - test_startSession(); - test_TfGuidAtom(); - test_ClientId(); - test_KeystrokeMgr(); - test_endSession(); - test_EnumLanguageProfiles(); - test_FindClosestCategory(); - test_Disable(); - test_ThreadMgrUnadviseSinks(); - test_UnregisterCategory(); - test_Unregister(); - } - else - skip("Unable to create InputProcessor\n"); - cleanup(); -} +#define sink_check_ok(a,b) (winetest_set_location(__FILE__,__LINE__), 0) ? 0 : _sink_check_ok(a,b) /********************************************************************** * ITextStoreACP @@ -727,6 +150,7 @@ typedef struct tagTextStoreACP { const ITextStoreACPVtbl *TextStoreACPVtbl; LONG refCount; + } TextStoreACP; static void TextStoreACP_Destructor(TextStoreACP *This) @@ -773,7 +197,12 @@ static ULONG WINAPI TextStoreACP_Release(ITextStoreACP *iface) static HRESULT WINAPI TextStoreACP_AdviseSink(ITextStoreACP *iface, REFIID riid, IUnknown *punk, DWORD dwMask) { - trace("\n"); + HRESULT hr; + + sink_fire_ok(&test_ACP_AdviseSink,"TextStoreACP_AdviseSink"); + + hr = IUnknown_QueryInterface(punk, &IID_ITextStoreACPSink,(LPVOID*)(&ACPSink)); + ok(SUCCEEDED(hr),"Unable to QueryInterface on sink\n"); return S_OK; } @@ -783,16 +212,19 @@ static HRESULT WINAPI TextStoreACP_UnadviseSink(ITextStoreACP *iface, trace("\n"); return S_OK; } + static HRESULT WINAPI TextStoreACP_RequestLock(ITextStoreACP *iface, DWORD dwLockFlags, HRESULT *phrSession) { - trace("\n"); + sink_fire_ok(&test_ACP_RequestLock,"TextStoreACP_RequestLock"); + *phrSession = ITextStoreACPSink_OnLockGranted(ACPSink, dwLockFlags); return S_OK; } static HRESULT WINAPI TextStoreACP_GetStatus(ITextStoreACP *iface, TS_STATUS *pdcs) { - trace("\n"); + sink_fire_ok(&test_ACP_GetStatus,"TextStoreACP_GetStatus"); + pdcs->dwDynamicFlags = documentStatus; return S_OK; } static HRESULT WINAPI TextStoreACP_QueryInsert(ITextStoreACP *iface, @@ -805,13 +237,20 @@ static HRESULT WINAPI TextStoreACP_QueryInsert(ITextStoreACP *iface, static HRESULT WINAPI TextStoreACP_GetSelection(ITextStoreACP *iface, ULONG ulIndex, ULONG ulCount, TS_SELECTION_ACP *pSelection, ULONG *pcFetched) { - trace("\n"); + sink_fire_ok(&test_ACP_GetSelection,"TextStoreACP_GetSelection"); + + pSelection->acpStart = 10; + pSelection->acpEnd = 20; + pSelection->style.fInterimChar = 0; + pSelection->style.ase = TS_AE_NONE; + *pcFetched = 1; + return S_OK; } static HRESULT WINAPI TextStoreACP_SetSelection(ITextStoreACP *iface, ULONG ulCount, const TS_SELECTION_ACP *pSelection) { - trace("\n"); + sink_fire_ok(&test_ACP_SetSelection,"TextStoreACP_SetSelection"); return S_OK; } static HRESULT WINAPI TextStoreACP_GetText(ITextStoreACP *iface, @@ -858,7 +297,7 @@ static HRESULT WINAPI TextStoreACP_InsertTextAtSelection(ITextStoreACP *iface, DWORD dwFlags, const WCHAR *pchText, ULONG cch, LONG *pacpStart, LONG *pacpEnd, TS_TEXTCHANGE *pChange) { - trace("\n"); + sink_fire_ok(&test_ACP_InsertTextAtSelection,"TextStoreACP_InsertTextAtSelection"); return S_OK; } static HRESULT WINAPI TextStoreACP_InsertEmbeddedAtSelection(ITextStoreACP *iface, @@ -904,7 +343,7 @@ static HRESULT WINAPI TextStoreACP_RetrieveRequestedAttrs(ITextStoreACP *iface, static HRESULT WINAPI TextStoreACP_GetEndACP(ITextStoreACP *iface, LONG *pacp) { - trace("\n"); + sink_fire_ok(&test_ACP_GetEndACP,"TextStoreACP_GetEndACP"); return S_OK; } static HRESULT WINAPI TextStoreACP_GetActiveView(ITextStoreACP *iface, @@ -974,7 +413,7 @@ static const ITextStoreACPVtbl TextStoreACP_TextStoreACPVtbl = TextStoreACP_GetWnd }; -HRESULT TextStoreACP_Constructor(IUnknown **ppOut) +static HRESULT TextStoreACP_Constructor(IUnknown **ppOut) { TextStoreACP *This; @@ -1044,8 +483,7 @@ static ULONG WINAPI ThreadMgrEventSink_Release(ITfThreadMgrEventSink *iface) static HRESULT WINAPI ThreadMgrEventSink_OnInitDocumentMgr(ITfThreadMgrEventSink *iface, ITfDocumentMgr *pdim) { - ok(test_OnInitDocumentMgr == SINK_EXPECTED, "Unexpected OnInitDocumentMgr sink\n"); - test_OnInitDocumentMgr = SINK_FIRED; + sink_fire_ok(&test_OnInitDocumentMgr,"ThreadMgrEventSink_OnInitDocumentMgr"); return S_OK; } @@ -1059,26 +497,53 @@ ITfDocumentMgr *pdim) static HRESULT WINAPI ThreadMgrEventSink_OnSetFocus(ITfThreadMgrEventSink *iface, ITfDocumentMgr *pdimFocus, ITfDocumentMgr *pdimPrevFocus) { - ok(test_OnSetFocus == SINK_EXPECTED, "Unexpected OnSetFocus sink\n"); - ok(pdimFocus == test_CurrentFocus,"Sink reports wrong focus\n"); - ok(pdimPrevFocus == test_PrevFocus,"Sink reports wrong previous focus\n"); - test_OnSetFocus = SINK_FIRED; + sink_fire_ok(&test_OnSetFocus,"ThreadMgrEventSink_OnSetFocus"); + if (test_CurrentFocus != FOCUS_IGNORE) + ok(pdimFocus == test_CurrentFocus,"Sink reports wrong focus\n"); + if (test_PrevFocus != FOCUS_IGNORE) + ok(pdimPrevFocus == test_PrevFocus,"Sink reports wrong previous focus\n"); return S_OK; } static HRESULT WINAPI ThreadMgrEventSink_OnPushContext(ITfThreadMgrEventSink *iface, ITfContext *pic) { - ok(test_OnPushContext == SINK_EXPECTED, "Unexpected OnPushContext sink\n"); - test_OnPushContext = SINK_FIRED; + HRESULT hr; + ITfDocumentMgr *docmgr; + ITfContext *test; + + hr = ITfContext_GetDocumentMgr(pic,&docmgr); + ok(SUCCEEDED(hr),"GetDocumenMgr failed\n"); + test = (ITfContext*)0xdeadbeef; + ITfDocumentMgr_Release(docmgr); + hr = ITfDocumentMgr_GetTop(docmgr,&test); + ok(SUCCEEDED(hr),"GetTop failed\n"); + ok(test == pic, "Wrong context is on top\n"); + if (test) + ITfContext_Release(test); + + sink_fire_ok(&test_OnPushContext,"ThreadMgrEventSink_OnPushContext"); return S_OK; } static HRESULT WINAPI ThreadMgrEventSink_OnPopContext(ITfThreadMgrEventSink *iface, ITfContext *pic) { - ok(test_OnPopContext == SINK_EXPECTED, "Unexpected OnPopContext sink\n"); - test_OnPopContext = SINK_FIRED; + HRESULT hr; + ITfDocumentMgr *docmgr; + ITfContext *test; + + hr = ITfContext_GetDocumentMgr(pic,&docmgr); + ok(SUCCEEDED(hr),"GetDocumenMgr failed\n"); + ITfDocumentMgr_Release(docmgr); + test = (ITfContext*)0xdeadbeef; + hr = ITfDocumentMgr_GetTop(docmgr,&test); + ok(SUCCEEDED(hr),"GetTop failed\n"); + ok(test == pic, "Wrong context is on top\n"); + if (test) + ITfContext_Release(test); + + sink_fire_ok(&test_OnPopContext,"ThreadMgrEventSink_OnPopContext"); return S_OK; } @@ -1095,7 +560,7 @@ static const ITfThreadMgrEventSinkVtbl ThreadMgrEventSink_ThreadMgrEventSinkVtbl ThreadMgrEventSink_OnPopContext }; -HRESULT ThreadMgrEventSink_Constructor(IUnknown **ppOut) +static HRESULT ThreadMgrEventSink_Constructor(IUnknown **ppOut) { ThreadMgrEventSink *This; @@ -1282,7 +747,7 @@ static const ITfTextInputProcessorVtbl TextService_TextInputProcessorVtbl= TextService_Deactivate }; -HRESULT TextService_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut) +static HRESULT TextService_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut) { TextService *This; if (pUnkOuter) @@ -1299,13 +764,1339 @@ HRESULT TextService_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut) return S_OK; } -HRESULT RegisterTextService(REFCLSID rclsid) +static HRESULT RegisterTextService(REFCLSID rclsid) { ClassFactory_Constructor( TextService_Constructor ,(LPVOID*)&cf); return CoRegisterClassObject(rclsid, (IUnknown*) cf, CLSCTX_INPROC_SERVER, REGCLS_MULTIPLEUSE, ®id); } -HRESULT UnregisterTextService() +static HRESULT UnregisterTextService(void) { return CoRevokeClassObject(regid); } + +/* + * The tests + */ + +DEFINE_GUID(CLSID_FakeService, 0xEDE1A7AD,0x66DE,0x47E0,0xB6,0x20,0x3E,0x92,0xF8,0x24,0x6B,0xF3); +DEFINE_GUID(CLSID_TF_InputProcessorProfiles, 0x33c53a50,0xf456,0x4884,0xb0,0x49,0x85,0xfd,0x64,0x3e,0xcf,0xed); +DEFINE_GUID(CLSID_TF_CategoryMgr, 0xA4B544A1,0x438D,0x4B41,0x93,0x25,0x86,0x95,0x23,0xE2,0xD6,0xC7); +DEFINE_GUID(GUID_TFCAT_TIP_KEYBOARD, 0x34745c63,0xb2f0,0x4784,0x8b,0x67,0x5e,0x12,0xc8,0x70,0x1a,0x31); +DEFINE_GUID(GUID_TFCAT_TIP_SPEECH, 0xB5A73CD1,0x8355,0x426B,0xA1,0x61,0x25,0x98,0x08,0xF2,0x6B,0x14); +DEFINE_GUID(GUID_TFCAT_TIP_HANDWRITING, 0x246ecb87,0xc2f2,0x4abe,0x90,0x5b,0xc8,0xb3,0x8a,0xdd,0x2c,0x43); +DEFINE_GUID (GUID_TFCAT_DISPLAYATTRIBUTEPROVIDER, 0x046B8C80,0x1647,0x40F7,0x9B,0x21,0xB9,0x3B,0x81,0xAA,0xBC,0x1B); +DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0); +DEFINE_GUID(CLSID_TF_ThreadMgr, 0x529a9e6b,0x6587,0x4f23,0xab,0x9e,0x9c,0x7d,0x68,0x3e,0x3c,0x50); +DEFINE_GUID(CLSID_PreservedKey, 0xA0ED8E55,0xCD3B,0x4274,0xB2,0x95,0xF6,0xC9,0xBA,0x2B,0x84,0x72); +DEFINE_GUID(GUID_COMPARTMENT_KEYBOARD_DISABLED, 0x71a5b253,0x1951,0x466b,0x9f,0xbc,0x9c,0x88,0x08,0xfa,0x84,0xf2); +DEFINE_GUID(GUID_COMPARTMENT_KEYBOARD_OPENCLOSE, 0x58273aad,0x01bb,0x4164,0x95,0xc6,0x75,0x5b,0xa0,0xb5,0x16,0x2d); +DEFINE_GUID(GUID_COMPARTMENT_HANDWRITING_OPENCLOSE, 0xf9ae2c6b,0x1866,0x4361,0xaf,0x72,0x7a,0xa3,0x09,0x48,0x89,0x0e); +DEFINE_GUID(GUID_COMPARTMENT_SPEECH_DISABLED, 0x56c5c607,0x0703,0x4e59,0x8e,0x52,0xcb,0xc8,0x4e,0x8b,0xbe,0x35); +DEFINE_GUID(GUID_COMPARTMENT_SPEECH_OPENCLOSE, 0x544d6a63,0xe2e8,0x4752,0xbb,0xd1,0x00,0x09,0x60,0xbc,0xa0,0x83); +DEFINE_GUID(GUID_COMPARTMENT_SPEECH_GLOBALSTATE, 0x2a54fe8e,0x0d08,0x460c,0xa7,0x5d,0x87,0x03,0x5f,0xf4,0x36,0xc5); +DEFINE_GUID(GUID_COMPARTMENT_PERSISTMENUENABLED, 0x575f3783,0x70c8,0x47c8,0xae,0x5d,0x91,0xa0,0x1a,0x1f,0x75,0x92); +DEFINE_GUID(GUID_COMPARTMENT_EMPTYCONTEXT, 0xd7487dbf,0x804e,0x41c5,0x89,0x4d,0xad,0x96,0xfd,0x4e,0xea,0x13); +DEFINE_GUID(GUID_COMPARTMENT_TIPUISTATUS, 0x148ca3ec,0x0366,0x401c,0x8d,0x75,0xed,0x97,0x8d,0x85,0xfb,0xc9); + +static HRESULT initialize(void) +{ + HRESULT hr; + CoInitialize(NULL); + hr = CoCreateInstance (&CLSID_TF_InputProcessorProfiles, NULL, + CLSCTX_INPROC_SERVER, &IID_ITfInputProcessorProfiles, (void**)&g_ipp); + if (SUCCEEDED(hr)) + hr = CoCreateInstance (&CLSID_TF_CategoryMgr, NULL, + CLSCTX_INPROC_SERVER, &IID_ITfCategoryMgr, (void**)&g_cm); + if (SUCCEEDED(hr)) + hr = CoCreateInstance (&CLSID_TF_ThreadMgr, NULL, + CLSCTX_INPROC_SERVER, &IID_ITfThreadMgr, (void**)&g_tm); + return hr; +} + +static void cleanup(void) +{ + if (g_ipp) + ITfInputProcessorProfiles_Release(g_ipp); + if (g_cm) + ITfCategoryMgr_Release(g_cm); + if (g_tm) + ITfThreadMgr_Release(g_tm); + CoUninitialize(); +} + +static void test_Register(void) +{ + HRESULT hr; + + static const WCHAR szDesc[] = {'F','a','k','e',' ','W','i','n','e',' ','S','e','r','v','i','c','e',0}; + static const WCHAR szFile[] = {'F','a','k','e',' ','W','i','n','e',' ','S','e','r','v','i','c','e',' ','F','i','l','e',0}; + + hr = ITfInputProcessorProfiles_GetCurrentLanguage(g_ipp,&gLangid); + ok(SUCCEEDED(hr),"Unable to get current language id\n"); + trace("Current Language %x\n",gLangid); + + hr = RegisterTextService(&CLSID_FakeService); + ok(SUCCEEDED(hr),"Unable to register COM for TextService\n"); + hr = ITfInputProcessorProfiles_Register(g_ipp, &CLSID_FakeService); + ok(SUCCEEDED(hr),"Unable to register text service(%x)\n",hr); + hr = ITfInputProcessorProfiles_AddLanguageProfile(g_ipp, &CLSID_FakeService, gLangid, &CLSID_FakeService, szDesc, sizeof(szDesc)/sizeof(WCHAR), szFile, sizeof(szFile)/sizeof(WCHAR), 1); + ok(SUCCEEDED(hr),"Unable to add Language Profile (%x)\n",hr); +} + +static void test_Unregister(void) +{ + HRESULT hr; + hr = ITfInputProcessorProfiles_Unregister(g_ipp, &CLSID_FakeService); + ok(SUCCEEDED(hr),"Unable to unregister text service(%x)\n",hr); + UnregisterTextService(); +} + +static void test_EnumInputProcessorInfo(void) +{ + IEnumGUID *ppEnum; + BOOL found = FALSE; + + if (SUCCEEDED(ITfInputProcessorProfiles_EnumInputProcessorInfo(g_ipp, &ppEnum))) + { + ULONG fetched; + GUID g; + while (IEnumGUID_Next(ppEnum, 1, &g, &fetched) == S_OK) + { + if(IsEqualGUID(&g,&CLSID_FakeService)) + found = TRUE; + } + } + ok(found,"Did not find registered text service\n"); +} + +static void test_EnumLanguageProfiles(void) +{ + BOOL found = FALSE; + IEnumTfLanguageProfiles *ppEnum; + if (SUCCEEDED(ITfInputProcessorProfiles_EnumLanguageProfiles(g_ipp,gLangid,&ppEnum))) + { + TF_LANGUAGEPROFILE profile; + while (IEnumTfLanguageProfiles_Next(ppEnum,1,&profile,NULL)==S_OK) + { + if (IsEqualGUID(&profile.clsid,&CLSID_FakeService)) + { + found = TRUE; + ok(profile.langid == gLangid, "LangId Incorrect\n"); + ok(IsEqualGUID(&profile.catid,&GUID_TFCAT_TIP_KEYBOARD), "CatId Incorrect\n"); + ok(IsEqualGUID(&profile.guidProfile,&CLSID_FakeService), "guidProfile Incorrect\n"); + } + } + } + ok(found,"Registered text service not found\n"); +} + +static void test_RegisterCategory(void) +{ + HRESULT hr; + hr = ITfCategoryMgr_RegisterCategory(g_cm, &CLSID_FakeService, &GUID_TFCAT_TIP_KEYBOARD, &CLSID_FakeService); + ok(SUCCEEDED(hr),"ITfCategoryMgr_RegisterCategory failed\n"); + hr = ITfCategoryMgr_RegisterCategory(g_cm, &CLSID_FakeService, &GUID_TFCAT_DISPLAYATTRIBUTEPROVIDER, &CLSID_FakeService); + ok(SUCCEEDED(hr),"ITfCategoryMgr_RegisterCategory failed\n"); +} + +static void test_UnregisterCategory(void) +{ + HRESULT hr; + hr = ITfCategoryMgr_UnregisterCategory(g_cm, &CLSID_FakeService, &GUID_TFCAT_TIP_KEYBOARD, &CLSID_FakeService); + ok(SUCCEEDED(hr),"ITfCategoryMgr_UnregisterCategory failed\n"); + hr = ITfCategoryMgr_UnregisterCategory(g_cm, &CLSID_FakeService, &GUID_TFCAT_DISPLAYATTRIBUTEPROVIDER, &CLSID_FakeService); + ok(SUCCEEDED(hr),"ITfCategoryMgr_UnregisterCategory failed\n"); +} + +static void test_FindClosestCategory(void) +{ + GUID output; + HRESULT hr; + const GUID *list[3] = {&GUID_TFCAT_TIP_SPEECH, &GUID_TFCAT_TIP_KEYBOARD, &GUID_TFCAT_TIP_HANDWRITING}; + + hr = ITfCategoryMgr_FindClosestCategory(g_cm, &CLSID_FakeService, &output, NULL, 0); + ok(SUCCEEDED(hr),"ITfCategoryMgr_FindClosestCategory failed (%x)\n",hr); + ok(IsEqualGUID(&output,&GUID_TFCAT_DISPLAYATTRIBUTEPROVIDER),"Wrong GUID\n"); + + hr = ITfCategoryMgr_FindClosestCategory(g_cm, &CLSID_FakeService, &output, list, 1); + ok(SUCCEEDED(hr),"ITfCategoryMgr_FindClosestCategory failed (%x)\n",hr); + ok(IsEqualGUID(&output,&GUID_NULL),"Wrong GUID\n"); + + hr = ITfCategoryMgr_FindClosestCategory(g_cm, &CLSID_FakeService, &output, list, 3); + ok(SUCCEEDED(hr),"ITfCategoryMgr_FindClosestCategory failed (%x)\n",hr); + ok(IsEqualGUID(&output,&GUID_TFCAT_TIP_KEYBOARD),"Wrong GUID\n"); +} + +static void test_Enable(void) +{ + HRESULT hr; + BOOL enabled = FALSE; + + hr = ITfInputProcessorProfiles_EnableLanguageProfile(g_ipp,&CLSID_FakeService, gLangid, &CLSID_FakeService, TRUE); + ok(SUCCEEDED(hr),"Failed to enable text service\n"); + hr = ITfInputProcessorProfiles_IsEnabledLanguageProfile(g_ipp,&CLSID_FakeService, gLangid, &CLSID_FakeService, &enabled); + ok(SUCCEEDED(hr),"Failed to get enabled state\n"); + ok(enabled == TRUE,"enabled state incorrect\n"); +} + +static void test_Disable(void) +{ + HRESULT hr; + + trace("Disabling\n"); + hr = ITfInputProcessorProfiles_EnableLanguageProfile(g_ipp,&CLSID_FakeService, gLangid, &CLSID_FakeService, FALSE); + ok(SUCCEEDED(hr),"Failed to disable text service\n"); +} + +static void test_ThreadMgrAdviseSinks(void) +{ + ITfSource *source = NULL; + HRESULT hr; + IUnknown *sink; + + hr = ITfThreadMgr_QueryInterface(g_tm, &IID_ITfSource, (LPVOID*)&source); + ok(SUCCEEDED(hr),"Failed to get IID_ITfSource for ThreadMgr\n"); + if (!source) + return; + + hr = ThreadMgrEventSink_Constructor(&sink); + ok(hr == S_OK, "got %08x\n", hr); + if(FAILED(hr)) return; + + tmSinkRefCount = 1; + tmSinkCookie = 0; + hr = ITfSource_AdviseSink(source,&IID_ITfThreadMgrEventSink, sink, &tmSinkCookie); + ok(SUCCEEDED(hr),"Failed to Advise Sink\n"); + ok(tmSinkCookie!=0,"Failed to get sink cookie\n"); + + /* Advising the sink adds a ref, Relesing here lets the object be deleted + when unadvised */ + tmSinkRefCount = 2; + IUnknown_Release(sink); + ITfSource_Release(source); +} + +static void test_ThreadMgrUnadviseSinks(void) +{ + ITfSource *source = NULL; + HRESULT hr; + + hr = ITfThreadMgr_QueryInterface(g_tm, &IID_ITfSource, (LPVOID*)&source); + ok(SUCCEEDED(hr),"Failed to get IID_ITfSource for ThreadMgr\n"); + if (!source) + return; + + tmSinkRefCount = 1; + hr = ITfSource_UnadviseSink(source, tmSinkCookie); + ok(SUCCEEDED(hr),"Failed to unadvise Sink\n"); + ITfSource_Release(source); +} + +/********************************************************************** + * ITfKeyEventSink + **********************************************************************/ +typedef struct tagKeyEventSink +{ + const ITfKeyEventSinkVtbl *KeyEventSinkVtbl; + LONG refCount; +} KeyEventSink; + +static void KeyEventSink_Destructor(KeyEventSink *This) +{ + HeapFree(GetProcessHeap(),0,This); +} + +static HRESULT WINAPI KeyEventSink_QueryInterface(ITfKeyEventSink *iface, REFIID iid, LPVOID *ppvOut) +{ + KeyEventSink *This = (KeyEventSink *)iface; + *ppvOut = NULL; + + if (IsEqualIID(iid, &IID_IUnknown) || IsEqualIID(iid, &IID_ITfKeyEventSink)) + { + *ppvOut = This; + } + + if (*ppvOut) + { + IUnknown_AddRef(iface); + return S_OK; + } + + return E_NOINTERFACE; +} + +static ULONG WINAPI KeyEventSink_AddRef(ITfKeyEventSink *iface) +{ + KeyEventSink *This = (KeyEventSink *)iface; + return InterlockedIncrement(&This->refCount); +} + +static ULONG WINAPI KeyEventSink_Release(ITfKeyEventSink *iface) +{ + KeyEventSink *This = (KeyEventSink *)iface; + ULONG ret; + + ret = InterlockedDecrement(&This->refCount); + if (ret == 0) + KeyEventSink_Destructor(This); + return ret; +} + +static HRESULT WINAPI KeyEventSink_OnSetFocus(ITfKeyEventSink *iface, + BOOL fForeground) +{ + sink_fire_ok(&test_KEV_OnSetFocus,"KeyEventSink_OnSetFocus"); + return S_OK; +} + +static HRESULT WINAPI KeyEventSink_OnTestKeyDown(ITfKeyEventSink *iface, + ITfContext *pic, WPARAM wParam, LPARAM lParam, BOOL *pfEaten) +{ + trace("\n"); + return S_OK; +} + +static HRESULT WINAPI KeyEventSink_OnTestKeyUp(ITfKeyEventSink *iface, + ITfContext *pic, WPARAM wParam, LPARAM lParam, BOOL *pfEaten) +{ + trace("\n"); + return S_OK; +} + +static HRESULT WINAPI KeyEventSink_OnKeyDown(ITfKeyEventSink *iface, + ITfContext *pic, WPARAM wParam, LPARAM lParam, BOOL *pfEaten) +{ + trace("\n"); + return S_OK; +} + +static HRESULT WINAPI KeyEventSink_OnKeyUp(ITfKeyEventSink *iface, + ITfContext *pic, WPARAM wParam, LPARAM lParam, BOOL *pfEaten) +{ + trace("\n"); + return S_OK; +} + +static HRESULT WINAPI KeyEventSink_OnPreservedKey(ITfKeyEventSink *iface, + ITfContext *pic, REFGUID rguid, BOOL *pfEaten) +{ + trace("\n"); + return S_OK; +} + +static const ITfKeyEventSinkVtbl KeyEventSink_KeyEventSinkVtbl = +{ + KeyEventSink_QueryInterface, + KeyEventSink_AddRef, + KeyEventSink_Release, + + KeyEventSink_OnSetFocus, + KeyEventSink_OnTestKeyDown, + KeyEventSink_OnTestKeyUp, + KeyEventSink_OnKeyDown, + KeyEventSink_OnKeyUp, + KeyEventSink_OnPreservedKey +}; + +static HRESULT KeyEventSink_Constructor(ITfKeyEventSink **ppOut) +{ + KeyEventSink *This; + + This = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(KeyEventSink)); + if (This == NULL) + return E_OUTOFMEMORY; + + This->KeyEventSinkVtbl = &KeyEventSink_KeyEventSinkVtbl; + This->refCount = 1; + + *ppOut = (ITfKeyEventSink*)This; + return S_OK; +} + + +static void test_KeystrokeMgr(void) +{ + ITfKeystrokeMgr *keymgr= NULL; + HRESULT hr; + TF_PRESERVEDKEY tfpk; + BOOL preserved; + ITfKeyEventSink *sink = NULL; + + KeyEventSink_Constructor(&sink); + + hr = ITfThreadMgr_QueryInterface(g_tm, &IID_ITfKeystrokeMgr, (LPVOID*)&keymgr); + ok(SUCCEEDED(hr),"Failed to get IID_ITfKeystrokeMgr for ThreadMgr\n"); + + tfpk.uVKey = 'A'; + tfpk.uModifiers = TF_MOD_SHIFT; + + test_KEV_OnSetFocus = SINK_EXPECTED; + hr = ITfKeystrokeMgr_AdviseKeyEventSink(keymgr,tid,sink,TRUE); + ok(SUCCEEDED(hr),"ITfKeystrokeMgr_AdviseKeyEventSink failed\n"); + sink_check_ok(&test_KEV_OnSetFocus,"KeyEventSink_OnSetFocus"); + hr = ITfKeystrokeMgr_AdviseKeyEventSink(keymgr,tid,sink,TRUE); + ok(hr == CONNECT_E_ADVISELIMIT,"Wrong return, expected CONNECT_E_ADVISELIMIT\n"); + hr = ITfKeystrokeMgr_AdviseKeyEventSink(keymgr,cid,sink,TRUE); + ok(hr == E_INVALIDARG,"Wrong return, expected E_INVALIDARG\n"); + + hr =ITfKeystrokeMgr_PreserveKey(keymgr, 0, &CLSID_PreservedKey, &tfpk, NULL, 0); + ok(hr==E_INVALIDARG,"ITfKeystrokeMgr_PreserveKey inproperly succeeded\n"); + + hr =ITfKeystrokeMgr_PreserveKey(keymgr, tid, &CLSID_PreservedKey, &tfpk, NULL, 0); + ok(SUCCEEDED(hr),"ITfKeystrokeMgr_PreserveKey failed\n"); + + hr =ITfKeystrokeMgr_PreserveKey(keymgr, tid, &CLSID_PreservedKey, &tfpk, NULL, 0); + ok(hr == TF_E_ALREADY_EXISTS,"ITfKeystrokeMgr_PreserveKey inproperly succeeded\n"); + + preserved = FALSE; + hr = ITfKeystrokeMgr_IsPreservedKey(keymgr, &CLSID_PreservedKey, &tfpk, &preserved); + ok(hr == S_OK, "ITfKeystrokeMgr_IsPreservedKey failed\n"); + if (hr == S_OK) ok(preserved == TRUE,"misreporting preserved key\n"); + + hr = ITfKeystrokeMgr_UnpreserveKey(keymgr, &CLSID_PreservedKey,&tfpk); + ok(SUCCEEDED(hr),"ITfKeystrokeMgr_UnpreserveKey failed\n"); + + hr = ITfKeystrokeMgr_IsPreservedKey(keymgr, &CLSID_PreservedKey, &tfpk, &preserved); + ok(hr == S_FALSE, "ITfKeystrokeMgr_IsPreservedKey failed\n"); + if (hr == S_FALSE) ok(preserved == FALSE,"misreporting preserved key\n"); + + hr = ITfKeystrokeMgr_UnpreserveKey(keymgr, &CLSID_PreservedKey,&tfpk); + ok(hr==CONNECT_E_NOCONNECTION,"ITfKeystrokeMgr_UnpreserveKey inproperly succeeded\n"); + + hr = ITfKeystrokeMgr_UnadviseKeyEventSink(keymgr,tid); + ok(SUCCEEDED(hr),"ITfKeystrokeMgr_UnadviseKeyEventSink failed\n"); + + ITfKeystrokeMgr_Release(keymgr); + ITfKeyEventSink_Release(sink); +} + +static void test_Activate(void) +{ + HRESULT hr; + + hr = ITfInputProcessorProfiles_ActivateLanguageProfile(g_ipp,&CLSID_FakeService,gLangid,&CLSID_FakeService); + ok(SUCCEEDED(hr),"Failed to Activate text service\n"); +} + + +static void test_EnumContexts(ITfDocumentMgr *dm, ITfContext *search) +{ + HRESULT hr; + IEnumTfContexts* pEnum; + BOOL found = FALSE; + + hr = ITfDocumentMgr_EnumContexts(dm,&pEnum); + ok(SUCCEEDED(hr),"EnumContexts failed\n"); + if (SUCCEEDED(hr)) + { + ULONG fetched; + ITfContext *cxt; + while (IEnumTfContexts_Next(pEnum, 1, &cxt, &fetched) == S_OK) + { + if (!search) + found = TRUE; + else if (search == cxt) + found = TRUE; + ITfContext_Release(cxt); + } + IEnumTfContexts_Release(pEnum); + } + if (search) + ok(found,"Did not find proper ITfContext\n"); + else + ok(!found,"Found an ITfContext we should should not have\n"); +} + +static void test_EnumDocumentMgr(ITfThreadMgr *tm, ITfDocumentMgr *search, ITfDocumentMgr *absent) +{ + HRESULT hr; + IEnumTfDocumentMgrs* pEnum; + BOOL found = FALSE; + BOOL notfound = TRUE; + + hr = ITfThreadMgr_EnumDocumentMgrs(tm,&pEnum); + ok(SUCCEEDED(hr),"EnumDocumentMgrs failed\n"); + if (SUCCEEDED(hr)) + { + ULONG fetched; + ITfDocumentMgr *dm; + while (IEnumTfDocumentMgrs_Next(pEnum, 1, &dm, &fetched) == S_OK) + { + if (!search) + found = TRUE; + else if (search == dm) + found = TRUE; + if (absent && dm == absent) + notfound = FALSE; + ITfDocumentMgr_Release(dm); + } + IEnumTfDocumentMgrs_Release(pEnum); + } + if (search) + ok(found,"Did not find proper ITfDocumentMgr\n"); + else + ok(!found,"Found an ITfDocumentMgr we should should not have\n"); + if (absent) + ok(notfound,"Found an ITfDocumentMgr we believe should be absent\n"); +} + +static inline int check_context_refcount(ITfContext *iface) +{ + IUnknown_AddRef(iface); + return IUnknown_Release(iface); +} + + +/********************************************************************** + * ITfTextEditSink + **********************************************************************/ +typedef struct tagTextEditSink +{ + const ITfTextEditSinkVtbl *TextEditSinkVtbl; + LONG refCount; +} TextEditSink; + +static void TextEditSink_Destructor(TextEditSink *This) +{ + HeapFree(GetProcessHeap(),0,This); +} + +static HRESULT WINAPI TextEditSink_QueryInterface(ITfTextEditSink *iface, REFIID iid, LPVOID *ppvOut) +{ + TextEditSink *This = (TextEditSink *)iface; + *ppvOut = NULL; + + if (IsEqualIID(iid, &IID_IUnknown) || IsEqualIID(iid, &IID_ITfTextEditSink)) + { + *ppvOut = This; + } + + if (*ppvOut) + { + IUnknown_AddRef(iface); + return S_OK; + } + + return E_NOINTERFACE; +} + +static ULONG WINAPI TextEditSink_AddRef(ITfTextEditSink *iface) +{ + TextEditSink *This = (TextEditSink *)iface; + return InterlockedIncrement(&This->refCount); +} + +static ULONG WINAPI TextEditSink_Release(ITfTextEditSink *iface) +{ + TextEditSink *This = (TextEditSink *)iface; + ULONG ret; + + ret = InterlockedDecrement(&This->refCount); + if (ret == 0) + TextEditSink_Destructor(This); + return ret; +} + +static HRESULT WINAPI TextEditSink_OnEndEdit(ITfTextEditSink *iface, + ITfContext *pic, TfEditCookie ecReadOnly, ITfEditRecord *pEditRecord) +{ + sink_fire_ok(&test_OnEndEdit,"TextEditSink_OnEndEdit"); + return S_OK; +} + +static const ITfTextEditSinkVtbl TextEditSink_TextEditSinkVtbl = +{ + TextEditSink_QueryInterface, + TextEditSink_AddRef, + TextEditSink_Release, + + TextEditSink_OnEndEdit +}; + +static HRESULT TextEditSink_Constructor(ITfTextEditSink **ppOut) +{ + TextEditSink *This; + + *ppOut = NULL; + This = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(TextEditSink)); + if (This == NULL) + return E_OUTOFMEMORY; + + This->TextEditSinkVtbl = &TextEditSink_TextEditSinkVtbl; + This->refCount = 1; + + *ppOut = (ITfTextEditSink*)This; + return S_OK; +} + +static void test_startSession(void) +{ + HRESULT hr; + DWORD cnt; + DWORD editCookie; + ITfDocumentMgr *dmtest; + ITfContext *cxt,*cxt2,*cxt3,*cxtTest; + ITextStoreACP *ts; + TfClientId cid2 = 0; + + hr = ITfThreadMgr_Deactivate(g_tm); + ok(hr == E_UNEXPECTED,"Deactivate should have failed with E_UNEXPECTED\n"); + + test_ShouldActivate = TRUE; + hr = ITfThreadMgr_Activate(g_tm,&cid); + ok(SUCCEEDED(hr),"Failed to Activate\n"); + ok(cid != tid,"TextService id mistakenly matches Client id\n"); + + test_ShouldActivate = FALSE; + hr = ITfThreadMgr_Activate(g_tm,&cid2); + ok(SUCCEEDED(hr),"Failed to Activate\n"); + ok (cid == cid2, "Second activate client ID does not match\n"); + + hr = ITfThreadMgr_Deactivate(g_tm); + ok(SUCCEEDED(hr),"Failed to Deactivate\n"); + + test_EnumDocumentMgr(g_tm,NULL,NULL); + + hr = ITfThreadMgr_CreateDocumentMgr(g_tm,&g_dm); + ok(SUCCEEDED(hr),"CreateDocumentMgr failed\n"); + + test_EnumDocumentMgr(g_tm,g_dm,NULL); + + hr = ITfThreadMgr_CreateDocumentMgr(g_tm,&dmtest); + ok(SUCCEEDED(hr),"CreateDocumentMgr failed\n"); + + test_EnumDocumentMgr(g_tm,dmtest,NULL); + + ITfDocumentMgr_Release(dmtest); + test_EnumDocumentMgr(g_tm,g_dm,dmtest); + + hr = ITfThreadMgr_GetFocus(g_tm,&dmtest); + ok(SUCCEEDED(hr),"GetFocus Failed\n"); + ok(dmtest == NULL,"Initial focus not null\n"); + + test_CurrentFocus = g_dm; + test_PrevFocus = NULL; + test_OnSetFocus = SINK_EXPECTED; + hr = ITfThreadMgr_SetFocus(g_tm,g_dm); + ok(SUCCEEDED(hr),"SetFocus Failed\n"); + sink_check_ok(&test_OnSetFocus,"OnSetFocus"); + + hr = ITfThreadMgr_GetFocus(g_tm,&dmtest); + ok(SUCCEEDED(hr),"GetFocus Failed\n"); + ok(g_dm == dmtest,"Expected DocumentMgr not focused\n"); + + cnt = ITfDocumentMgr_Release(g_dm); + ok(cnt == 2,"DocumentMgr refcount not expected (2 vs %i)\n",cnt); + + hr = ITfThreadMgr_GetFocus(g_tm,&dmtest); + ok(SUCCEEDED(hr),"GetFocus Failed\n"); + ok(g_dm == dmtest,"Expected DocumentMgr not focused\n"); + ITfDocumentMgr_Release(dmtest); + + TextStoreACP_Constructor((IUnknown**)&ts); + + hr = ITfDocumentMgr_CreateContext(g_dm, cid, 0, (IUnknown*)ts, &cxt, &editCookie); + ok(SUCCEEDED(hr),"CreateContext Failed\n"); + + hr = ITfDocumentMgr_CreateContext(g_dm, cid, 0, NULL, &cxt2, &editCookie); + ok(SUCCEEDED(hr),"CreateContext Failed\n"); + + hr = ITfDocumentMgr_CreateContext(g_dm, cid, 0, NULL, &cxt3, &editCookie); + ok(SUCCEEDED(hr),"CreateContext Failed\n"); + + test_EnumContexts(g_dm, NULL); + + hr = ITfContext_GetDocumentMgr(cxt,&dmtest); + ok(hr == S_OK, "ITfContext_GetDocumentMgr failed with %x\n",hr); + ok(dmtest == g_dm, "Wrong documentmgr\n"); + ITfDocumentMgr_Release(dmtest); + + cnt = check_context_refcount(cxt); + test_OnPushContext = SINK_EXPECTED; + test_ACP_AdviseSink = SINK_EXPECTED; + test_OnInitDocumentMgr = SINK_EXPECTED; + hr = ITfDocumentMgr_Push(g_dm, cxt); + ok(SUCCEEDED(hr),"Push Failed\n"); + ok(check_context_refcount(cxt) > cnt, "Ref count did not increase\n"); + sink_check_ok(&test_OnPushContext,"OnPushContext"); + sink_check_ok(&test_OnInitDocumentMgr,"OnInitDocumentMgr"); + sink_check_ok(&test_ACP_AdviseSink,"TextStoreACP_AdviseSink"); + + test_EnumContexts(g_dm, cxt); + + hr = ITfDocumentMgr_GetTop(g_dm, &cxtTest); + ok(SUCCEEDED(hr),"GetTop Failed\n"); + ok(cxtTest == cxt, "Wrong context on top\n"); + ok(check_context_refcount(cxt) > cnt, "Ref count did not increase\n"); + cnt = ITfContext_Release(cxtTest); + + hr = ITfDocumentMgr_GetBase(g_dm, &cxtTest); + ok(SUCCEEDED(hr),"GetBase Failed\n"); + ok(cxtTest == cxt, "Wrong context on Base\n"); + ok(check_context_refcount(cxt) > cnt, "Ref count did not increase\n"); + ITfContext_Release(cxtTest); + + check_context_refcount(cxt2); + test_OnPushContext = SINK_EXPECTED; + hr = ITfDocumentMgr_Push(g_dm, cxt2); + ok(SUCCEEDED(hr),"Push Failed\n"); + sink_check_ok(&test_OnPushContext,"OnPushContext"); + + cnt = check_context_refcount(cxt2); + hr = ITfDocumentMgr_GetTop(g_dm, &cxtTest); + ok(SUCCEEDED(hr),"GetTop Failed\n"); + ok(cxtTest == cxt2, "Wrong context on top\n"); + ok(check_context_refcount(cxt2) > cnt, "Ref count did not increase\n"); + ITfContext_Release(cxtTest); + + cnt = check_context_refcount(cxt); + hr = ITfDocumentMgr_GetBase(g_dm, &cxtTest); + ok(SUCCEEDED(hr),"GetBase Failed\n"); + ok(cxtTest == cxt, "Wrong context on Base\n"); + ok(check_context_refcount(cxt) > cnt, "Ref count did not increase\n"); + ITfContext_Release(cxtTest); + + cnt = check_context_refcount(cxt3); + hr = ITfDocumentMgr_Push(g_dm, cxt3); + ok(FAILED(hr),"Push Succeeded\n"); + ok(check_context_refcount(cxt3) == cnt, "Ref changed\n"); + + cnt = check_context_refcount(cxt2); + hr = ITfDocumentMgr_GetTop(g_dm, &cxtTest); + ok(SUCCEEDED(hr),"GetTop Failed\n"); + ok(cxtTest == cxt2, "Wrong context on top\n"); + ok(check_context_refcount(cxt2) > cnt, "Ref count did not increase\n"); + ITfContext_Release(cxtTest); + + cnt = check_context_refcount(cxt); + hr = ITfDocumentMgr_GetBase(g_dm, &cxtTest); + ok(SUCCEEDED(hr),"GetBase Failed\n"); + ok(cxtTest == cxt, "Wrong context on Base\n"); + ok(check_context_refcount(cxt) > cnt, "Ref count did not increase\n"); + ITfContext_Release(cxtTest); + + cnt = check_context_refcount(cxt2); + test_OnPopContext = SINK_EXPECTED; + hr = ITfDocumentMgr_Pop(g_dm, 0); + ok(SUCCEEDED(hr),"Pop Failed\n"); + ok(check_context_refcount(cxt2) < cnt, "Ref count did not decrease\n"); + sink_check_ok(&test_OnPopContext,"OnPopContext"); + + dmtest = (void *)0xfeedface; + hr = ITfContext_GetDocumentMgr(cxt2,&dmtest); + ok(hr == S_FALSE, "ITfContext_GetDocumentMgr wrong rc %x\n",hr); + ok(dmtest == NULL,"returned documentmgr should be null\n"); + + hr = ITfDocumentMgr_GetTop(g_dm, &cxtTest); + ok(SUCCEEDED(hr),"GetTop Failed\n"); + ok(cxtTest == cxt, "Wrong context on top\n"); + ITfContext_Release(cxtTest); + + hr = ITfDocumentMgr_GetBase(g_dm, &cxtTest); + ok(SUCCEEDED(hr),"GetBase Failed\n"); + ok(cxtTest == cxt, "Wrong context on base\n"); + ITfContext_Release(cxtTest); + + hr = ITfDocumentMgr_Pop(g_dm, 0); + ok(FAILED(hr),"Pop Succeeded\n"); + + hr = ITfDocumentMgr_GetTop(g_dm, &cxtTest); + ok(SUCCEEDED(hr),"GetTop Failed\n"); + ok(cxtTest == cxt, "Wrong context on top\n"); + ITfContext_Release(cxtTest); + + hr = ITfDocumentMgr_GetBase(g_dm, &cxtTest); + ok(SUCCEEDED(hr),"GetBase Failed\n"); + ok(cxtTest == cxt, "Wrong context on base\n"); + ITfContext_Release(cxtTest); + + ITfContext_Release(cxt); + ITfContext_Release(cxt2); + ITfContext_Release(cxt3); +} + +static void test_endSession(void) +{ + HRESULT hr; + test_ShouldDeactivate = TRUE; + test_CurrentFocus = NULL; + test_PrevFocus = g_dm; + test_OnSetFocus = SINK_EXPECTED; + hr = ITfThreadMgr_Deactivate(g_tm); + ok(SUCCEEDED(hr),"Failed to Deactivate\n"); + sink_check_ok(&test_OnSetFocus,"OnSetFocus"); + test_OnSetFocus = SINK_UNEXPECTED; +} + +static void test_TfGuidAtom(void) +{ + GUID gtest,g1; + HRESULT hr; + TfGuidAtom atom1,atom2; + BOOL equal; + + CoCreateGuid(>est); + + /* msdn reports this should return E_INVALIDARG. However my test show it crashing (winxp)*/ + /* + hr = ITfCategoryMgr_RegisterGUID(g_cm,>est,NULL); + ok(hr==E_INVALIDARG,"ITfCategoryMgr_RegisterGUID should have failed\n"); + */ + hr = ITfCategoryMgr_RegisterGUID(g_cm,>est,&atom1); + ok(SUCCEEDED(hr),"ITfCategoryMgr_RegisterGUID failed\n"); + hr = ITfCategoryMgr_RegisterGUID(g_cm,>est,&atom2); + ok(SUCCEEDED(hr),"ITfCategoryMgr_RegisterGUID failed\n"); + ok(atom1 == atom2,"atoms do not match\n"); + hr = ITfCategoryMgr_GetGUID(g_cm,atom2,NULL); + ok(hr==E_INVALIDARG,"ITfCategoryMgr_GetGUID should have failed\n"); + hr = ITfCategoryMgr_GetGUID(g_cm,atom2,&g1); + ok(SUCCEEDED(hr),"ITfCategoryMgr_GetGUID failed\n"); + ok(IsEqualGUID(&g1,>est),"guids do not match\n"); + hr = ITfCategoryMgr_IsEqualTfGuidAtom(g_cm,atom1,>est,NULL); + ok(hr==E_INVALIDARG,"ITfCategoryMgr_IsEqualTfGuidAtom should have failed\n"); + hr = ITfCategoryMgr_IsEqualTfGuidAtom(g_cm,atom1,>est,&equal); + ok(SUCCEEDED(hr),"ITfCategoryMgr_IsEqualTfGuidAtom failed\n"); + ok(equal == TRUE,"Equal value invalid\n"); + + /* show that cid and tid TfClientIds are also TfGuidAtoms */ + hr = ITfCategoryMgr_IsEqualTfGuidAtom(g_cm,tid,&CLSID_FakeService,&equal); + ok(SUCCEEDED(hr),"ITfCategoryMgr_IsEqualTfGuidAtom failed\n"); + ok(equal == TRUE,"Equal value invalid\n"); + hr = ITfCategoryMgr_GetGUID(g_cm,cid,&g1); + ok(SUCCEEDED(hr),"ITfCategoryMgr_GetGUID failed\n"); + ok(!IsEqualGUID(&g1,&GUID_NULL),"guid should not be NULL\n"); +} + +static void test_ClientId(void) +{ + ITfClientId *pcid; + TfClientId id1,id2; + HRESULT hr; + GUID g2; + + hr = ITfThreadMgr_QueryInterface(g_tm, &IID_ITfClientId, (LPVOID*)&pcid); + ok(SUCCEEDED(hr),"Unable to acquire ITfClientId interface\n"); + + CoCreateGuid(&g2); + + hr = ITfClientId_GetClientId(pcid,&GUID_NULL,&id1); + ok(SUCCEEDED(hr),"GetClientId failed\n"); + hr = ITfClientId_GetClientId(pcid,&GUID_NULL,&id2); + ok(SUCCEEDED(hr),"GetClientId failed\n"); + ok(id1==id2,"Id's for GUID_NULL do not match\n"); + hr = ITfClientId_GetClientId(pcid,&CLSID_FakeService,&id2); + ok(SUCCEEDED(hr),"GetClientId failed\n"); + ok(id2!=id1,"Id matches GUID_NULL\n"); + ok(id2==tid,"Id for CLSID_FakeService not matching tid\n"); + ok(id2!=cid,"Id for CLSID_FakeService matching cid\n"); + hr = ITfClientId_GetClientId(pcid,&g2,&id2); + ok(SUCCEEDED(hr),"GetClientId failed\n"); + ok(id2!=id1,"Id matches GUID_NULL\n"); + ok(id2!=tid,"Id for random guid matching tid\n"); + ok(id2!=cid,"Id for random guid matching cid\n"); + ITfClientId_Release(pcid); +} + +/********************************************************************** + * ITfEditSession + **********************************************************************/ +typedef struct tagEditSession +{ + const ITfEditSessionVtbl *EditSessionVtbl; + LONG refCount; +} EditSession; + +static void EditSession_Destructor(EditSession *This) +{ + HeapFree(GetProcessHeap(),0,This); +} + +static HRESULT WINAPI EditSession_QueryInterface(ITfEditSession *iface, REFIID iid, LPVOID *ppvOut) +{ + EditSession *This = (EditSession *)iface; + *ppvOut = NULL; + + if (IsEqualIID(iid, &IID_IUnknown) || IsEqualIID(iid, &IID_ITfEditSession)) + { + *ppvOut = This; + } + + if (*ppvOut) + { + IUnknown_AddRef(iface); + return S_OK; + } + + return E_NOINTERFACE; +} + +static ULONG WINAPI EditSession_AddRef(ITfEditSession *iface) +{ + EditSession *This = (EditSession *)iface; + return InterlockedIncrement(&This->refCount); +} + +static ULONG WINAPI EditSession_Release(ITfEditSession *iface) +{ + EditSession *This = (EditSession *)iface; + ULONG ret; + + ret = InterlockedDecrement(&This->refCount); + if (ret == 0) + EditSession_Destructor(This); + return ret; +} + +static void test_InsertAtSelection(TfEditCookie ec, ITfContext *cxt) +{ + HRESULT hr; + ITfInsertAtSelection *iis; + ITfRange *range=NULL; + static const WCHAR txt[] = {'H','e','l','l','o',' ','W','o','r','l','d',0}; + + hr = ITfContext_QueryInterface(cxt, &IID_ITfInsertAtSelection , (LPVOID*)&iis); + ok(SUCCEEDED(hr),"Failed to get ITfInsertAtSelection interface\n"); + test_ACP_InsertTextAtSelection = SINK_EXPECTED; + hr = ITfInsertAtSelection_InsertTextAtSelection(iis, ec, 0, txt, 11, &range); + ok(SUCCEEDED(hr),"ITfInsertAtSelection_InsertTextAtSelection failed %x\n",hr); + sink_check_ok(&test_ACP_InsertTextAtSelection,"InsertTextAtSelection"); + ok(range != NULL,"No range returned\n"); + ITfRange_Release(range); + ITfInsertAtSelection_Release(iis); +} + +static HRESULT WINAPI EditSession_DoEditSession(ITfEditSession *iface, +TfEditCookie ec) +{ + ITfContext *cxt; + ITfDocumentMgr *dm; + ITfRange *range; + TF_SELECTION selection; + ULONG fetched; + HRESULT hr; + + sink_fire_ok(&test_DoEditSession,"EditSession_DoEditSession"); + sink_check_ok(&test_ACP_RequestLock,"RequestLock"); + + ITfThreadMgr_GetFocus(g_tm, &dm); + ITfDocumentMgr_GetTop(dm,&cxt); + + hr = ITfContext_GetStart(cxt,ec,NULL); + ok(hr == E_INVALIDARG,"Unexpected return code %x\n",hr); + + range = (ITfRange*)0xdeaddead; + hr = ITfContext_GetStart(cxt,0xdeadcafe,&range); + ok(hr == TF_E_NOLOCK,"Unexpected return code %x\n",hr); + ok(range == NULL,"Range not set to NULL\n"); + + hr = ITfContext_GetStart(cxt,ec,&range); + ok(SUCCEEDED(hr),"Unexpected return code %x\n",hr); + ok(range != NULL,"Range set to NULL\n"); + + ITfRange_Release(range); + + hr = ITfContext_GetEnd(cxt,ec,NULL); + ok(hr == E_INVALIDARG,"Unexpected return code %x\n",hr); + + range = (ITfRange*)0xdeaddead; + hr = ITfContext_GetEnd(cxt,0xdeadcafe,&range); + ok(hr == TF_E_NOLOCK,"Unexpected return code %x\n",hr); + ok(range == NULL,"Range not set to NULL\n"); + + test_ACP_GetEndACP = SINK_EXPECTED; + hr = ITfContext_GetEnd(cxt,ec,&range); + ok(SUCCEEDED(hr),"Unexpected return code %x\n",hr); + ok(range != NULL,"Range set to NULL\n"); + sink_check_ok(&test_ACP_GetEndACP,"GetEndACP"); + + ITfRange_Release(range); + + selection.range = NULL; + test_ACP_GetSelection = SINK_EXPECTED; + hr = ITfContext_GetSelection(cxt, ec, TF_DEFAULT_SELECTION, 1, &selection, &fetched); + ok(SUCCEEDED(hr),"ITfContext_GetSelection failed\n"); + ok(fetched == 1,"fetched incorrect\n"); + ok(selection.range != NULL,"NULL range\n"); + sink_check_ok(&test_ACP_GetSelection,"ACP_GetSepection"); + ITfRange_Release(selection.range); + + test_InsertAtSelection(ec, cxt); + + test_ACP_GetEndACP = SINK_EXPECTED; + hr = ITfContext_GetEnd(cxt,ec,&range); + ok(SUCCEEDED(hr),"Unexpected return code %x\n",hr); + ok(range != NULL,"Range set to NULL\n"); + sink_check_ok(&test_ACP_GetEndACP,"GetEndACP"); + + selection.range = range; + selection.style.ase = TF_AE_NONE; + selection.style.fInterimChar = FALSE; + test_ACP_SetSelection = SINK_EXPECTED; + hr = ITfContext_SetSelection(cxt, ec, 1, &selection); + sink_check_ok(&test_ACP_SetSelection,"SetSelection"); + ITfRange_Release(range); + + ITfContext_Release(cxt); + ITfDocumentMgr_Release(dm); + return 0xdeadcafe; +} + +static const ITfEditSessionVtbl EditSession_EditSessionVtbl = +{ + EditSession_QueryInterface, + EditSession_AddRef, + EditSession_Release, + + EditSession_DoEditSession +}; + +static HRESULT EditSession_Constructor(ITfEditSession **ppOut) +{ + EditSession *This; + + *ppOut = NULL; + This = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(EditSession)); + if (This == NULL) + return E_OUTOFMEMORY; + + This->EditSessionVtbl = &EditSession_EditSessionVtbl; + This->refCount = 1; + + *ppOut = (ITfEditSession*)This; + return S_OK; +} + +static void test_TStoApplicationText(void) +{ + HRESULT hr, hrSession; + ITfEditSession *es; + ITfContext *cxt; + ITfDocumentMgr *dm; + ITfTextEditSink *sink; + ITfSource *source = NULL; + DWORD editSinkCookie = -1; + + ITfThreadMgr_GetFocus(g_tm, &dm); + EditSession_Constructor(&es); + ITfDocumentMgr_GetTop(dm,&cxt); + + TextEditSink_Constructor(&sink); + hr = ITfContext_QueryInterface(cxt,&IID_ITfSource,(LPVOID*)&source); + ok(SUCCEEDED(hr),"Failed to get IID_ITfSource for Context\n"); + if (source) + { + hr = ITfSource_AdviseSink(source, &IID_ITfTextEditSink, (LPVOID)sink, &editSinkCookie); + ok(SUCCEEDED(hr),"Failed to advise Sink\n"); + ok(editSinkCookie != -1,"Failed to get sink cookie\n"); + } + + hrSession = 0xfeedface; + /* Test no premissions flags */ + hr = ITfContext_RequestEditSession(cxt, tid, es, TF_ES_SYNC, &hrSession); + ok(hr == E_INVALIDARG,"RequestEditSession should have failed with %x not %x\n",E_INVALIDARG,hr); + ok(hrSession == E_FAIL,"hrSession should be %x not %x\n",E_FAIL,hrSession); + + documentStatus = TS_SD_READONLY; + hrSession = 0xfeedface; + test_ACP_GetStatus = SINK_EXPECTED; + hr = ITfContext_RequestEditSession(cxt, tid, es, TF_ES_SYNC|TF_ES_READWRITE, &hrSession); + ok(SUCCEEDED(hr),"ITfContext_RequestEditSession failed\n"); + ok(hrSession == TS_E_READONLY,"Unexpected hrSession (%x)\n",hrSession); + sink_check_ok(&test_ACP_GetStatus,"GetStatus"); + + /* signal a change to allow readwrite sessions */ + documentStatus = 0; + test_ACP_RequestLock = SINK_EXPECTED; + ITextStoreACPSink_OnStatusChange(ACPSink,documentStatus); + sink_check_ok(&test_ACP_RequestLock,"RequestLock"); + + test_ACP_GetStatus = SINK_EXPECTED; + test_ACP_RequestLock = SINK_EXPECTED; + test_DoEditSession = SINK_EXPECTED; + hrSession = 0xfeedface; + test_OnEndEdit = SINK_EXPECTED; + hr = ITfContext_RequestEditSession(cxt, tid, es, TF_ES_SYNC|TF_ES_READWRITE, &hrSession); + ok(SUCCEEDED(hr),"ITfContext_RequestEditSession failed\n"); + sink_check_ok(&test_OnEndEdit,"OnEndEdit"); + sink_check_ok(&test_DoEditSession,"DoEditSession"); + sink_check_ok(&test_ACP_GetStatus,"GetStatus"); + ok(hrSession == 0xdeadcafe,"Unexpected hrSession (%x)\n",hrSession); + + if (source) + { + hr = ITfSource_UnadviseSink(source, editSinkCookie); + ok(SUCCEEDED(hr),"Failed to unadvise Sink\n"); + ITfTextEditSink_Release(sink); + ITfSource_Release(source); + } + + ITfContext_Release(cxt); + ITfDocumentMgr_Release(dm); + ITfEditSession_Release(es); +} + +static void enum_compartments(ITfCompartmentMgr *cmpmgr, REFGUID present, REFGUID absent) +{ + BOOL found,found2; + IEnumGUID *ppEnum; + found = FALSE; + found2 = FALSE; + if (SUCCEEDED(ITfCompartmentMgr_EnumCompartments(cmpmgr, &ppEnum))) + { + ULONG fetched; + GUID g; + while (IEnumGUID_Next(ppEnum, 1, &g, &fetched) == S_OK) + { + WCHAR str[50]; + CHAR strA[50]; + StringFromGUID2(&g,str,sizeof(str)/sizeof(str[0])); + WideCharToMultiByte(CP_ACP,0,str,-1,strA,sizeof(strA),0,0); + trace("found %s\n",strA); + if (present && IsEqualGUID(present,&g)) + found = TRUE; + if (absent && IsEqualGUID(absent, &g)) + found2 = TRUE; + } + IEnumGUID_Release(ppEnum); + } + if (present) + ok(found,"Did not find compartment\n"); + if (absent) + ok(!found2,"Found compartment that should be absent\n"); +} + +static void test_Compartments(void) +{ + ITfContext *cxt; + ITfDocumentMgr *dm; + ITfCompartmentMgr *cmpmgr; + ITfCompartment *cmp; + HRESULT hr; + + ITfThreadMgr_GetFocus(g_tm, &dm); + ITfDocumentMgr_GetTop(dm,&cxt); + + /* Global */ + hr = ITfThreadMgr_GetGlobalCompartment(g_tm, &cmpmgr); + ok(SUCCEEDED(hr),"GetGlobalCompartment failed\n"); + hr = ITfCompartmentMgr_GetCompartment(cmpmgr, &GUID_COMPARTMENT_SPEECH_OPENCLOSE, &cmp); + ok(SUCCEEDED(hr),"GetCompartment failed\n"); + ITfCompartment_Release(cmp); + enum_compartments(cmpmgr,&GUID_COMPARTMENT_SPEECH_OPENCLOSE,NULL); + ITfCompartmentMgr_Release(cmpmgr); + + /* Thread */ + hr = ITfThreadMgr_QueryInterface(g_tm, &IID_ITfCompartmentMgr, (LPVOID*)&cmpmgr); + ok(SUCCEEDED(hr),"ThreadMgr QI for IID_ITfCompartmentMgr failed\n"); + hr = ITfCompartmentMgr_GetCompartment(cmpmgr, &CLSID_FakeService, &cmp); + ok(SUCCEEDED(hr),"GetCompartment failed\n"); + enum_compartments(cmpmgr,&CLSID_FakeService,&GUID_COMPARTMENT_SPEECH_OPENCLOSE); + ITfCompartmentMgr_ClearCompartment(cmpmgr,tid,&CLSID_FakeService); + enum_compartments(cmpmgr,NULL,&CLSID_FakeService); + ITfCompartmentMgr_Release(cmpmgr); + ITfCompartment_Release(cmp); + + /* DocumentMgr */ + hr = ITfDocumentMgr_QueryInterface(dm, &IID_ITfCompartmentMgr, (LPVOID*)&cmpmgr); + ok(SUCCEEDED(hr),"DocumentMgr QI for IID_ITfCompartmentMgr failed\n"); + + hr = ITfCompartmentMgr_GetCompartment(cmpmgr, &GUID_COMPARTMENT_PERSISTMENUENABLED, &cmp); + ok(SUCCEEDED(hr),"GetCompartment failed\n"); + enum_compartments(cmpmgr,&GUID_COMPARTMENT_PERSISTMENUENABLED,&GUID_COMPARTMENT_SPEECH_OPENCLOSE); + ITfCompartmentMgr_Release(cmpmgr); + + /* Context */ + hr = ITfContext_QueryInterface(cxt, &IID_ITfCompartmentMgr, (LPVOID*)&cmpmgr); + ok(SUCCEEDED(hr),"Context QI for IID_ITfCompartmentMgr failed\n"); + enum_compartments(cmpmgr,NULL,&GUID_COMPARTMENT_PERSISTMENUENABLED); + ITfCompartmentMgr_Release(cmpmgr); + + ITfContext_Release(cxt); + ITfDocumentMgr_Release(dm); +} + +static void processPendingMessages(void) +{ + MSG msg; + while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { + TranslateMessage(&msg); + DispatchMessage(&msg); + } +} + +static void test_AssociateFocus(void) +{ + ITfDocumentMgr *dm1, *dm2, *olddm, *dmcheck, *dmorig; + HWND wnd1, wnd2, wnd3; + HRESULT hr; + + ITfThreadMgr_GetFocus(g_tm, &dmorig); + test_CurrentFocus = NULL; + test_PrevFocus = dmorig; + test_OnSetFocus = SINK_EXPECTED; + hr = ITfThreadMgr_SetFocus(g_tm,NULL); + sink_check_ok(&test_OnSetFocus,"OnSetFocus"); + ITfDocumentMgr_Release(dmorig); + + hr = ITfThreadMgr_CreateDocumentMgr(g_tm,&dm1); + ok(SUCCEEDED(hr),"CreateDocumentMgr failed\n"); + + hr = ITfThreadMgr_CreateDocumentMgr(g_tm,&dm2); + ok(SUCCEEDED(hr),"CreateDocumentMgr failed\n"); + + wnd1 = CreateWindow("edit",NULL,WS_POPUP,0,0,200,60,NULL,NULL,NULL,NULL); + ok(wnd1!=NULL,"Unable to create window 1\n"); + wnd2 = CreateWindow("edit",NULL,WS_POPUP,0,65,200,60,NULL,NULL,NULL,NULL); + ok(wnd2!=NULL,"Unable to create window 2\n"); + wnd3 = CreateWindow("edit",NULL,WS_POPUP,0,130,200,60,NULL,NULL,NULL,NULL); + ok(wnd3!=NULL,"Unable to create window 3\n"); + + processPendingMessages(); + + test_OnInitDocumentMgr = SINK_OPTIONAL; /* Vista and greater */ + test_OnPushContext = SINK_OPTIONAL; /* Vista and greater */ + + ShowWindow(wnd1,SW_SHOWNORMAL); + SetFocus(wnd1); + sink_check_ok(&test_OnInitDocumentMgr,"OnInitDocumentMgr"); + sink_check_ok(&test_OnPushContext,"OnPushContext"); + + test_OnSetFocus = SINK_OPTIONAL; /* Vista and greater */ + ITfThreadMgr_GetFocus(g_tm, &test_PrevFocus); + test_CurrentFocus = FOCUS_IGNORE; /* This is a default system context */ + processPendingMessages(); + sink_check_ok(&test_OnSetFocus,"OnSetFocus"); + + test_CurrentFocus = dm1; + test_PrevFocus = FOCUS_IGNORE; + test_OnSetFocus = SINK_EXPECTED; + hr = ITfThreadMgr_AssociateFocus(g_tm,wnd1,dm1,&olddm); + ok(SUCCEEDED(hr),"AssociateFocus failed\n"); + sink_check_ok(&test_OnSetFocus,"OnSetFocus"); + + processPendingMessages(); + + ITfThreadMgr_GetFocus(g_tm, &dmcheck); + ok(dmcheck == dm1, "Expected DocumentMgr not focused\n"); + ITfDocumentMgr_Release(dmcheck); + + hr = ITfThreadMgr_AssociateFocus(g_tm,wnd2,dm2,&olddm); + ok(SUCCEEDED(hr),"AssociateFocus failed\n"); + processPendingMessages(); + ITfThreadMgr_GetFocus(g_tm, &dmcheck); + ok(dmcheck == dm1, "Expected DocumentMgr not focused\n"); + ITfDocumentMgr_Release(dmcheck); + + hr = ITfThreadMgr_AssociateFocus(g_tm,wnd3,dm2,&olddm); + ok(SUCCEEDED(hr),"AssociateFocus failed\n"); + processPendingMessages(); + ITfThreadMgr_GetFocus(g_tm, &dmcheck); + ok(dmcheck == dm1, "Expected DocumentMgr not focused\n"); + ITfDocumentMgr_Release(dmcheck); + + test_CurrentFocus = dm2; + test_PrevFocus = dm1; + test_OnSetFocus = SINK_OPTIONAL; /* wine and Winxp */ + ShowWindow(wnd2,SW_SHOWNORMAL); + SetFocus(wnd2); + sink_check_ok(&test_OnSetFocus,"OnSetFocus"); + test_CurrentFocus = FOCUS_IGNORE; /* occasional wine race */ + test_PrevFocus = FOCUS_IGNORE; /* occasional wine race */ + test_OnSetFocus = SINK_IGNORE; /* occasional wine race */ + processPendingMessages(); + + ShowWindow(wnd3,SW_SHOWNORMAL); + SetFocus(wnd3); + processPendingMessages(); + + test_CurrentFocus = dm1; + test_PrevFocus = dm2; + test_OnSetFocus = SINK_EXPECTED; + SetFocus(wnd1); + processPendingMessages(); + sink_check_ok(&test_OnSetFocus,"OnSetFocus"); + + hr = ITfThreadMgr_AssociateFocus(g_tm,wnd3,NULL,&olddm); + ok(SUCCEEDED(hr),"AssociateFocus failed\n"); + ok(olddm == dm2, "incorrect old DocumentMgr returned\n"); + ITfDocumentMgr_Release(olddm); + + test_CurrentFocus = dmorig; + test_PrevFocus = dm1; + test_OnSetFocus = SINK_EXPECTED; + test_ACP_GetStatus = SINK_EXPECTED; + ITfThreadMgr_SetFocus(g_tm,dmorig); + sink_check_ok(&test_OnSetFocus,"OnSetFocus"); + + test_CurrentFocus = FOCUS_IGNORE; /* NULL on XP, system default on Vista */ + test_PrevFocus = dmorig; + test_OnSetFocus = SINK_EXPECTED; + SetFocus(wnd3); + processPendingMessages(); + sink_check_ok(&test_OnSetFocus,"OnSetFocus"); + + hr = ITfThreadMgr_AssociateFocus(g_tm,wnd2,NULL,&olddm); + ok(SUCCEEDED(hr),"AssociateFocus failed\n"); + ok(olddm == dm2, "incorrect old DocumentMgr returned\n"); + ITfDocumentMgr_Release(olddm); + hr = ITfThreadMgr_AssociateFocus(g_tm,wnd1,NULL,&olddm); + ok(SUCCEEDED(hr),"AssociateFocus failed\n"); + ok(olddm == dm1, "incorrect old DocumentMgr returned\n"); + ITfDocumentMgr_Release(olddm); + + SetFocus(wnd2); + processPendingMessages(); + SetFocus(wnd1); + processPendingMessages(); + + ITfDocumentMgr_Release(dm1); + ITfDocumentMgr_Release(dm2); + + test_CurrentFocus = dmorig; + test_PrevFocus = FOCUS_IGNORE; + test_OnSetFocus = SINK_EXPECTED; + test_ACP_GetStatus = SINK_IGNORE; + ITfThreadMgr_SetFocus(g_tm,dmorig); + sink_check_ok(&test_OnSetFocus,"OnSetFocus"); + + DestroyWindow(wnd1); + DestroyWindow(wnd2); + test_OnPopContext = SINK_OPTIONAL; /* Vista and greater */ + test_OnSetFocus = SINK_OPTIONAL; /* Vista and greater */ + ITfThreadMgr_GetFocus(g_tm, &test_PrevFocus); + test_CurrentFocus = NULL; + DestroyWindow(wnd3); + sink_check_ok(&test_OnSetFocus,"OnSetFocus"); + sink_check_ok(&test_OnPopContext,"OnPopContext"); +} + +START_TEST(inputprocessor) +{ + if (SUCCEEDED(initialize())) + { + test_Register(); + test_RegisterCategory(); + test_EnumLanguageProfiles(); + test_EnumInputProcessorInfo(); + test_Enable(); + test_ThreadMgrAdviseSinks(); + test_Activate(); + test_startSession(); + test_TfGuidAtom(); + test_ClientId(); + test_KeystrokeMgr(); + test_TStoApplicationText(); + test_Compartments(); + test_AssociateFocus(); + test_endSession(); + test_FindClosestCategory(); + test_Disable(); + test_ThreadMgrUnadviseSinks(); + test_UnregisterCategory(); + test_Unregister(); + } + else + skip("Unable to create InputProcessor\n"); + cleanup(); +} diff --git a/rostests/winetests/mshtml/dom.c b/rostests/winetests/mshtml/dom.c index 25bf7641eb1..c6f54793ce5 100644 --- a/rostests/winetests/mshtml/dom.c +++ b/rostests/winetests/mshtml/dom.c @@ -3173,6 +3173,16 @@ static void test_navigator(IHTMLDocument2 *doc) ok(!strcmp_wa(bstr, buf), "userAgent returned %s, expected \"%s\"\n", wine_dbgstr_w(bstr), buf); SysFreeString(bstr); + if(!strncmp(buf, "Mozilla/", 8)) { + bstr = NULL; + hres = IOmNavigator_get_appVersion(navigator, &bstr); + ok(hres == S_OK, "get_appVersion failed: %08x\n", hres); + ok(!strcmp_wa(bstr, buf+8), "appVersion returned %s, expected \"%s\"\n", wine_dbgstr_w(bstr), buf+8); + SysFreeString(bstr); + }else { + skip("nonstandard user agent\n"); + } + ref = IOmNavigator_Release(navigator); ok(!ref, "navigator should be destroyed here\n"); } @@ -3185,8 +3195,6 @@ static void test_screen(IHTMLWindow2 *window) HDC hdc; HRESULT hres; - static const WCHAR displayW[] = {'D','I','S','P','L','A','Y',0}; - screen = NULL; hres = IHTMLWindow2_get_screen(window, &screen); ok(hres == S_OK, "get_screen failed: %08x\n", hres); @@ -3206,7 +3214,7 @@ static void test_screen(IHTMLWindow2 *window) IDispatchEx_Release(dispex); } - hdc = CreateICW(displayW, NULL, NULL, NULL); + hdc = CreateICA("DISPLAY", NULL, NULL, NULL); exl = GetDeviceCaps(hdc, HORZRES); l = 0xdeadbeef; diff --git a/rostests/winetests/mshtml/events.c b/rostests/winetests/mshtml/events.c index 16f727fdec7..d62df7a3b0b 100644 --- a/rostests/winetests/mshtml/events.c +++ b/rostests/winetests/mshtml/events.c @@ -67,6 +67,8 @@ DEFINE_EXPECT(div_onclick_disp); DEFINE_EXPECT(iframe_onreadystatechange_loading); DEFINE_EXPECT(iframe_onreadystatechange_interactive); DEFINE_EXPECT(iframe_onreadystatechange_complete); +DEFINE_EXPECT(iframedoc_onreadystatechange); +DEFINE_EXPECT(img_onload); static HWND container_hwnd = NULL; static IHTMLWindow2 *window; @@ -92,7 +94,10 @@ static const char click_doc_str[] = ""; static const char readystate_doc_str[] = - "<"; + ""; + +static const char img_doc_str[] = + ""; static const char *debugstr_guid(REFIID riid) { @@ -879,14 +884,46 @@ static HRESULT WINAPI body_onclick(IDispatchEx *iface, DISPID id, LCID lcid, WOR EVENT_HANDLER_FUNC_OBJ(body_onclick); +static HRESULT WINAPI img_onload(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp, + VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller) +{ + CHECK_EXPECT(img_onload); + test_event_args(&DIID_DispHTMLImg, id, wFlags, pdp, pvarRes, pei, pspCaller); + test_event_src("IMG"); + return S_OK; +} + +EVENT_HANDLER_FUNC_OBJ(img_onload); + +static HRESULT WINAPI iframedoc_onreadystatechange(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp, + VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller) +{ + IHTMLEventObj *event = NULL; + HRESULT hres; + + CHECK_EXPECT2(iframedoc_onreadystatechange); + test_event_args(&DIID_DispHTMLDocument, id, wFlags, pdp, pvarRes, pei, pspCaller); + + event = (void*)0xdeadbeef; + hres = IHTMLWindow2_get_event(window, &event); + ok(hres == S_OK, "get_event failed: %08x\n", hres); + ok(!event, "event = %p\n", event); + + return S_OK; +} + +EVENT_HANDLER_FUNC_OBJ(iframedoc_onreadystatechange); + static HRESULT WINAPI iframe_onreadystatechange(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp, VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller) { + IHTMLWindow2 *iframe_window; + IHTMLDocument2 *iframe_doc; IHTMLFrameBase2 *iframe; IHTMLElement2 *elem2; IHTMLElement *elem; VARIANT v; - BSTR str; + BSTR str, str2; HRESULT hres; test_event_args(&DIID_DispHTMLIFrame, id, wFlags, pdp, pvarRes, pei, pspCaller); @@ -913,15 +950,33 @@ static HRESULT WINAPI iframe_onreadystatechange(IDispatchEx *iface, DISPID id, L ok(!lstrcmpW(str, V_BSTR(&v)), "ready states differ\n"); VariantClear(&v); - if(!strcmp_wa(str, "loading")) + hres = IHTMLFrameBase2_get_contentWindow(iframe, &iframe_window); + ok(hres == S_OK, "get_contentDocument failed: %08x\n", hres); + + hres = IHTMLWindow2_get_document(iframe_window, &iframe_doc); + IHTMLWindow2_Release(iframe_window); + ok(hres == S_OK, "get_document failed: %08x\n", hres); + + hres = IHTMLDocument2_get_readyState(iframe_doc, &str2); + ok(!lstrcmpW(str, str2), "unexpected document readyState %s\n", wine_dbgstr_w(str2)); + SysFreeString(str2); + + if(!strcmp_wa(str, "loading")) { CHECK_EXPECT(iframe_onreadystatechange_loading); - else if(!strcmp_wa(str, "interactive")) + + V_VT(&v) = VT_DISPATCH; + V_DISPATCH(&v) = (IDispatch*)&iframedoc_onreadystatechange_obj; + hres = IHTMLDocument2_put_onreadystatechange(iframe_doc, v); + ok(hres == S_OK, "put_onreadystatechange: %08x\n", hres); + }else if(!strcmp_wa(str, "interactive")) CHECK_EXPECT(iframe_onreadystatechange_interactive); else if(!strcmp_wa(str, "complete")) CHECK_EXPECT(iframe_onreadystatechange_complete); else ok(0, "unexpected state %s\n", wine_dbgstr_w(str)); + IHTMLDocument2_Release(iframe_doc); + IHTMLFrameBase2_Release(iframe); return S_OK; } @@ -1307,17 +1362,60 @@ static void test_onreadystatechange(IHTMLDocument2 *doc) ok(hres == S_OK, "put_src failed: %08x\n", hres); SET_EXPECT(iframe_onreadystatechange_loading); + SET_EXPECT(iframedoc_onreadystatechange); SET_EXPECT(iframe_onreadystatechange_interactive); SET_EXPECT(iframe_onreadystatechange_complete); pump_msgs(&called_iframe_onreadystatechange_complete); - todo_wine CHECK_CALLED(iframe_onreadystatechange_loading); + CHECK_CALLED(iframedoc_onreadystatechange); CHECK_CALLED(iframe_onreadystatechange_interactive); CHECK_CALLED(iframe_onreadystatechange_complete); IHTMLFrameBase_Release(iframe); } +static void test_imgload(IHTMLDocument2 *doc) +{ + IHTMLImgElement *img; + IHTMLElement *elem; + VARIANT v; + BSTR str; + HRESULT hres; + + elem = get_elem_id(doc, "imgid"); + hres = IHTMLElement_QueryInterface(elem, &IID_IHTMLImgElement, (void**)&img); + IHTMLElement_Release(elem); + ok(hres == S_OK, "Could not get IHTMLImgElement iface: %08x\n", hres); + + V_VT(&v) = VT_EMPTY; + hres = IHTMLImgElement_get_onload(img, &v); + ok(hres == S_OK, "get_onload failed: %08x\n", hres); + ok(V_VT(&v) == VT_NULL, "V_VT(onload) = %d\n", V_VT(&v)); + + V_VT(&v) = VT_DISPATCH; + V_DISPATCH(&v) = (IDispatch*)&img_onload_obj; + hres = IHTMLImgElement_put_onload(img, v); + ok(hres == S_OK, "put_onload failed: %08x\n", hres); + + V_VT(&v) = VT_EMPTY; + hres = IHTMLImgElement_get_onload(img, &v); + ok(hres == S_OK, "get_onload failed: %08x\n", hres); + ok(V_VT(&v) == VT_DISPATCH, "V_VT(onload) = %d\n", V_VT(&v)); + ok(V_DISPATCH(&v) == (IDispatch*)&img_onload_obj, "V_DISPATCH(onload) != onloadkFunc\n"); + VariantClear(&v); + + str = a2bstr("http://www.winehq.org/images/winehq_logo_text.png"); + hres = IHTMLImgElement_put_src(img, str); + ok(hres == S_OK, "put_src failed: %08x\n", hres); + SysFreeString(str); + + SET_EXPECT(img_onload); + pump_msgs(&called_img_onload); + CHECK_CALLED(img_onload); + + IHTMLImgElement_Release(img); +} + static void test_timeout(IHTMLDocument2 *doc) { IHTMLWindow3 *win3; @@ -1957,6 +2055,7 @@ START_TEST(events) run_test(empty_doc_str, test_timeout); run_test(click_doc_str, test_onclick); run_test(readystate_doc_str, test_onreadystatechange); + run_test(img_doc_str, test_imgload); DestroyWindow(container_hwnd); CoUninitialize(); diff --git a/rostests/winetests/mshtml/jstest.html b/rostests/winetests/mshtml/jstest.html index 72ef427485a..6192f815af3 100644 --- a/rostests/winetests/mshtml/jstest.html +++ b/rostests/winetests/mshtml/jstest.html @@ -5,12 +5,30 @@ function ok(b,m) { return external.ok(b, m); } +function test_removeAttribute(e) { + ok(e.removeAttribute('nonexisting') === false, "removeAttribute('nonexisting') didn't return false"); + + e.title = "title"; + ok(e.removeAttribute('title') === true, "removeAttribute('title') didn't return true"); + ok(e.title === "", "e.title = " + e.title); + ok(("title" in e) === true, "title is not in e"); + + e["myattr"] = "test"; + ok(e.removeAttribute('myattr') === true, "removeAttribute('myattr') didn't return true"); + ok(e["myattr"] === undefined, "e['myattr'] = " + e['myattr']); + ok(("myattr" in e) === false, "myattr is in e"); + +} + function runTest() { obj = new Object(); ok(obj === window.obj, "obj !== window.obj"); ok(typeof(divid) === "object", "typeof(divid) = " + typeof(divid)); + test_removeAttribute(document.getElementById("divid")); + test_removeAttribute(document.body); + external.reportSuccess(); } diff --git a/rostests/winetests/mshtml/script.c b/rostests/winetests/mshtml/script.c index 6a0cbe36906..56d83efa696 100644 --- a/rostests/winetests/mshtml/script.c +++ b/rostests/winetests/mshtml/script.c @@ -1050,12 +1050,22 @@ static HRESULT QueryInterface(REFIID riid, void **ppv) static IHTMLDocument2 *create_document(void) { IHTMLDocument2 *doc; + IHTMLDocument5 *doc5; HRESULT hres; hres = CoCreateInstance(&CLSID_HTMLDocument, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER, &IID_IHTMLDocument2, (void**)&doc); ok(hres == S_OK, "CoCreateInstance failed: %08x\n", hres); + if (hres != S_OK) return NULL; + hres = IHTMLDocument2_QueryInterface(doc, &IID_IHTMLDocument5, (void**)&doc5); + if(FAILED(hres)) { + win_skip("Could not get IHTMLDocument5, probably too old IE\n"); + IHTMLDocument2_Release(doc); + return NULL; + } + + IHTMLDocument5_Release(doc5); return doc; } diff --git a/rostests/winetests/msxml3/domdoc.c b/rostests/winetests/msxml3/domdoc.c index 5f06d93f381..a743e51d391 100644 --- a/rostests/winetests/msxml3/domdoc.c +++ b/rostests/winetests/msxml3/domdoc.c @@ -535,6 +535,7 @@ static void test_domdoc( void ) BSTR str; LONG code; LONG nLength = 0; + WCHAR buff[100]; r = CoCreateInstance( &CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (LPVOID*)&doc ); @@ -543,6 +544,12 @@ static void test_domdoc( void ) test_disp((IUnknown*)doc); +if (0) +{ + /* crashes on native */ + r = IXMLDOMDocument_loadXML( doc, (BSTR)0x1, NULL ); +} + /* try some stupid things */ r = IXMLDOMDocument_loadXML( doc, NULL, NULL ); ok( r == S_FALSE, "loadXML failed\n"); @@ -601,6 +608,15 @@ static void test_domdoc( void ) ok( r == S_FALSE, "should be no document element\n"); ok( element == NULL, "Element should be NULL\n"); + /* test for BSTR handling, pass broken BSTR */ + memcpy(&buff[2], szComplete1, sizeof(szComplete1)); + /* just a big length */ + *(DWORD*)buff = 0xf0f0; + b = VARIANT_FALSE; + r = IXMLDOMDocument_loadXML( doc, &buff[2], &b ); + ok( r == S_OK, "loadXML failed\n"); + ok( b == VARIANT_TRUE, "failed to load XML string\n"); + /* try to load something valid */ b = VARIANT_FALSE; str = SysAllocString( szComplete1 ); @@ -2734,6 +2750,12 @@ static void test_XMLHTTP(void) SysFreeString(str2); hr = IXMLHttpRequest_send(pXMLHttpRequest, varbody); + if (hr == INET_E_RESOURCE_NOT_FOUND) + { + skip("No connection could be made with crossover.codeweavers.com\n"); + IXMLHttpRequest_Release(pXMLHttpRequest); + return; + } todo_wine ok(hr == S_OK, "IXMLHttpRequest_send should have succeeded instead of failing with 0x%08x\n", hr); VariantClear(&varbody); diff --git a/rostests/winetests/rsaenh/rsaenh.c b/rostests/winetests/rsaenh/rsaenh.c index 83ec87252c1..cb560f21e0e 100644 --- a/rostests/winetests/rsaenh/rsaenh.c +++ b/rostests/winetests/rsaenh/rsaenh.c @@ -128,16 +128,28 @@ static int init_base_environment(DWORD dwKeyFlags) hProv = (HCRYPTPROV)INVALID_HANDLE_VALUE; result = CryptAcquireContext(&hProv, szContainer, szProvider, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT); - ok(!result && GetLastError()==NTE_BAD_FLAGS, "%d, %08x\n", result, GetLastError()); + ok(!result && (GetLastError()==NTE_BAD_FLAGS || + broken(GetLastError() == NTE_KEYSET_NOT_DEF /* Win9x/NT4 */)), + "%d, %08x\n", result, GetLastError()); if (!CryptAcquireContext(&hProv, szContainer, szProvider, PROV_RSA_FULL, 0)) { - ok(GetLastError()==NTE_BAD_KEYSET, "%08x\n", GetLastError()); - if (GetLastError()!=NTE_BAD_KEYSET) return 0; + ok(GetLastError()==NTE_BAD_KEYSET || + broken(GetLastError() == NTE_KEYSET_NOT_DEF /* Win9x/NT4 */), + "%08x\n", GetLastError()); + if (GetLastError()!=NTE_BAD_KEYSET) + { + win_skip("RSA full provider not available\n"); + return 0; + } result = CryptAcquireContext(&hProv, szContainer, szProvider, PROV_RSA_FULL, CRYPT_NEWKEYSET); ok(result, "%08x\n", GetLastError()); - if (!result) return 0; + if (!result) + { + win_skip("Couldn't create crypto provider\n"); + return 0; + } result = CryptGenKey(hProv, AT_KEYEXCHANGE, dwKeyFlags, &hKey); ok(result, "%08x\n", GetLastError()); if (result) CryptDestroyKey(hKey); @@ -275,7 +287,6 @@ static BOOL derive_key(ALG_ID aiAlgid, HCRYPTKEY *phKey, DWORD len) return FALSE; } ok(result, "%08x\n", GetLastError()); - if (!result) return FALSE; result = CryptHashData(hHash, pbData, sizeof(pbData), 0); ok(result, "%08x\n", GetLastError()); if (!result) return FALSE; @@ -309,8 +320,9 @@ static void test_hashes(void) unsigned char pbData[2048]; BOOL result; HCRYPTHASH hHash, hHashClone; + HCRYPTPROV prov; BYTE pbHashValue[36]; - DWORD hashlen, len; + DWORD hashlen, len, error; int i; for (i=0; i<2048; i++) pbData[i] = (unsigned char)i; @@ -441,6 +453,74 @@ static void test_hashes(void) result = CryptDestroyHash(hHash); ok(result, "%08x\n", GetLastError()); + + /* The SHA-2 variants aren't supported in the RSA full provider */ + result = CryptCreateHash(hProv, CALG_SHA_256, 0, 0, &hHash); + ok(!result && GetLastError() == NTE_BAD_ALGID, + "expected NTE_BAD_ALGID, got %08x\n", GetLastError()); + result = CryptCreateHash(hProv, CALG_SHA_384, 0, 0, &hHash); + ok(!result && GetLastError() == NTE_BAD_ALGID, + "expected NTE_BAD_ALGID, got %08x\n", GetLastError()); + result = CryptCreateHash(hProv, CALG_SHA_512, 0, 0, &hHash); + ok(!result && GetLastError() == NTE_BAD_ALGID, + "expected NTE_BAD_ALGID, got %08x\n", GetLastError()); + + result = CryptAcquireContextA(&prov, NULL, szProvider, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT); + ok(result, "CryptAcquireContext failed 0x%08x\n", GetLastError()); + + result = CryptCreateHash(prov, CALG_SHA1, 0, 0, &hHash); + ok(result, "CryptCreateHash failed 0x%08x\n", GetLastError()); + + /* release provider before using the hash */ + result = CryptReleaseContext(prov, 0); + ok(result, "CryptReleaseContext failed 0x%08x\n", GetLastError()); + + SetLastError(0xdeadbeef); + result = CryptHashData(hHash, (const BYTE *)"data", sizeof("data"), 0); + error = GetLastError(); + ok(!result, "CryptHashData succeeded\n"); + ok(error == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER got %u\n", error); + + SetLastError(0xdeadbeef); + result = CryptDestroyHash(hHash); + error = GetLastError(); + ok(!result, "CryptDestroyHash succeeded\n"); + ok(error == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER got %u\n", error); + + if (!pCryptDuplicateHash) + { + win_skip("CryptDuplicateHash is not available\n"); + return; + } + + result = CryptAcquireContextA(&prov, NULL, szProvider, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT); + ok(result, "CryptAcquireContext failed 0x%08x\n", GetLastError()); + + result = CryptCreateHash(hProv, CALG_SHA1, 0, 0, &hHash); + ok(result, "CryptCreateHash failed 0x%08x\n", GetLastError()); + + result = CryptHashData(hHash, (const BYTE *)"data", sizeof("data"), 0); + ok(result, "CryptHashData failed 0x%08x\n", GetLastError()); + + result = pCryptDuplicateHash(hHash, NULL, 0, &hHashClone); + ok(result, "CryptDuplicateHash failed 0x%08x\n", GetLastError()); + + len = 20; + result = CryptGetHashParam(hHashClone, HP_HASHVAL, pbHashValue, &len, 0); + ok(result, "CryptGetHashParam failed 0x%08x\n", GetLastError()); + + /* add data after duplicating the hash */ + result = CryptHashData(hHash, (const BYTE *)"more data", sizeof("more data"), 0); + ok(result, "CryptHashData failed 0x%08x\n", GetLastError()); + + result = CryptDestroyHash(hHash); + ok(result, "CryptDestroyHash failed 0x%08x\n", GetLastError()); + + result = CryptDestroyHash(hHashClone); + ok(result, "CryptDestroyHash failed 0x%08x\n", GetLastError()); + + result = CryptReleaseContext(prov, 0); + ok(result, "CryptReleaseContext failed 0x%08x\n", GetLastError()); } static void test_block_cipher_modes(void) @@ -471,6 +551,10 @@ static void test_block_cipher_modes(void) result = CryptSetKeyParam(hKey, KP_MODE, (BYTE*)&dwMode, 0); ok(result, "%08x\n", GetLastError()); + result = CryptGetKeyParam(hKey, KP_SALT, NULL, &dwLen, 0); + ok(result, "%08x\n", GetLastError()); + ok(dwLen == 11 || broken(dwLen == 0 /* Win9x/NT4 */), "unexpected salt length %d\n", dwLen); + dwLen = 23; result = CryptEncrypt(hKey, 0, TRUE, 0, NULL, &dwLen, 24); ok(result, "CryptEncrypt failed: %08x\n", GetLastError()); @@ -716,6 +800,11 @@ static void test_aes(int keylen) for (i=0; iInitialize == (void *) pNextTable->FreeCredentialsHandle && + pNextTable->FreeCredentialsHandle != NULL)) + { + win_skip("Invalid function pointers for next package\n"); + return NULL; + } + + return pNextTable; } static void testGetInfo(void) @@ -181,7 +208,9 @@ static void testGetInfo(void) PackageInfo.fCapabilities); ok(PackageInfo.wVersion == 1, "wVersion: %d\n", PackageInfo.wVersion); ok(PackageInfo.wRPCID == 14, "wRPCID: %d\n", PackageInfo.wRPCID); - ok(PackageInfo.cbMaxToken == 0x4000, "cbMaxToken: 0x%x\n", + ok(PackageInfo.cbMaxToken == 0x4000 || + PackageInfo.cbMaxToken == 0x6000, /* Win7 */ + "cbMaxToken: 0x%x\n", PackageInfo.cbMaxToken); } } diff --git a/rostests/winetests/shlwapi/generated.c b/rostests/winetests/shlwapi/generated.c index db44d275994..e5e0896af8f 100755 --- a/rostests/winetests/shlwapi/generated.c +++ b/rostests/winetests/shlwapi/generated.c @@ -56,42 +56,103 @@ * Test helper macros */ -#ifdef _WIN64 +#define TEST_TYPE_SIZE(type, size) C_ASSERT(sizeof(type) == size); -# define TEST_TYPE_SIZE(type, size) +#ifdef TYPE_ALIGNMENT +# define TEST_TYPE_ALIGN(type, align) C_ASSERT(TYPE_ALIGNMENT(type) == align); +#else # define TEST_TYPE_ALIGN(type, align) +#endif + +#ifdef _TYPE_ALIGNMENT +# define TEST_TARGET_ALIGN(type, align) C_ASSERT(_TYPE_ALIGNMENT(*(type)0) == align); +# define TEST_FIELD_ALIGN(type, field, align) C_ASSERT(_TYPE_ALIGNMENT(((type*)0)->field) == align); +#else # define TEST_TARGET_ALIGN(type, align) # define TEST_FIELD_ALIGN(type, field, align) -# define TEST_FIELD_OFFSET(type, field, offset) - -#else - -# define TEST_TYPE_SIZE(type, size) C_ASSERT(sizeof(type) == size); - -# ifdef TYPE_ALIGNMENT -# define TEST_TYPE_ALIGN(type, align) C_ASSERT(TYPE_ALIGNMENT(type) == align); -# else -# define TEST_TYPE_ALIGN(type, align) -# endif - -# ifdef _TYPE_ALIGNMENT -# define TEST_TARGET_ALIGN(type, align) C_ASSERT(_TYPE_ALIGNMENT(*(type)0) == align); -# define TEST_FIELD_ALIGN(type, field, align) C_ASSERT(_TYPE_ALIGNMENT(((type*)0)->field) == align); -# else -# define TEST_TARGET_ALIGN(type, align) -# define TEST_FIELD_ALIGN(type, field, align) -# endif - -# define TEST_FIELD_OFFSET(type, field, offset) C_ASSERT(FIELD_OFFSET(type, field) == offset); - #endif +#define TEST_FIELD_OFFSET(type, field, offset) C_ASSERT(FIELD_OFFSET(type, field) == offset); + #define TEST_TARGET_SIZE(type, size) TEST_TYPE_SIZE(*(type)0, size) #define TEST_FIELD_SIZE(type, field, size) TEST_TYPE_SIZE((((type*)0)->field), size) #define TEST_TYPE_SIGNED(type) C_ASSERT((type) -1 < 0); #define TEST_TYPE_UNSIGNED(type) C_ASSERT((type) -1 > 0); +#ifdef _WIN64 + +static void test_pack_ASSOCF(void) +{ + /* ASSOCF */ + TEST_TYPE_SIZE (ASSOCF, 4) + TEST_TYPE_ALIGN (ASSOCF, 4) + TEST_TYPE_UNSIGNED(ASSOCF) +} + +static void test_pack_DLLGETVERSIONPROC(void) +{ + /* DLLGETVERSIONPROC */ + TEST_TYPE_SIZE (DLLGETVERSIONPROC, 8) + TEST_TYPE_ALIGN (DLLGETVERSIONPROC, 8) +} + +static void test_pack_DLLVERSIONINFO(void) +{ + /* DLLVERSIONINFO (pack 8) */ + TEST_TYPE_SIZE (DLLVERSIONINFO, 20) + TEST_TYPE_ALIGN (DLLVERSIONINFO, 4) + TEST_FIELD_SIZE (DLLVERSIONINFO, cbSize, 4) + TEST_FIELD_ALIGN (DLLVERSIONINFO, cbSize, 4) + TEST_FIELD_OFFSET(DLLVERSIONINFO, cbSize, 0) + TEST_FIELD_SIZE (DLLVERSIONINFO, dwMajorVersion, 4) + TEST_FIELD_ALIGN (DLLVERSIONINFO, dwMajorVersion, 4) + TEST_FIELD_OFFSET(DLLVERSIONINFO, dwMajorVersion, 4) + TEST_FIELD_SIZE (DLLVERSIONINFO, dwMinorVersion, 4) + TEST_FIELD_ALIGN (DLLVERSIONINFO, dwMinorVersion, 4) + TEST_FIELD_OFFSET(DLLVERSIONINFO, dwMinorVersion, 8) + TEST_FIELD_SIZE (DLLVERSIONINFO, dwBuildNumber, 4) + TEST_FIELD_ALIGN (DLLVERSIONINFO, dwBuildNumber, 4) + TEST_FIELD_OFFSET(DLLVERSIONINFO, dwBuildNumber, 12) + TEST_FIELD_SIZE (DLLVERSIONINFO, dwPlatformID, 4) + TEST_FIELD_ALIGN (DLLVERSIONINFO, dwPlatformID, 4) + TEST_FIELD_OFFSET(DLLVERSIONINFO, dwPlatformID, 16) +} + +static void test_pack_DLLVERSIONINFO2(void) +{ + /* DLLVERSIONINFO2 (pack 8) */ + TEST_TYPE_SIZE (DLLVERSIONINFO2, 32) + TEST_TYPE_ALIGN (DLLVERSIONINFO2, 8) + TEST_FIELD_SIZE (DLLVERSIONINFO2, info1, 20) + TEST_FIELD_ALIGN (DLLVERSIONINFO2, info1, 4) + TEST_FIELD_OFFSET(DLLVERSIONINFO2, info1, 0) + TEST_FIELD_SIZE (DLLVERSIONINFO2, dwFlags, 4) + TEST_FIELD_ALIGN (DLLVERSIONINFO2, dwFlags, 4) + TEST_FIELD_OFFSET(DLLVERSIONINFO2, dwFlags, 20) + TEST_FIELD_SIZE (DLLVERSIONINFO2, ullVersion, 8) + TEST_FIELD_ALIGN (DLLVERSIONINFO2, ullVersion, 8) + TEST_FIELD_OFFSET(DLLVERSIONINFO2, ullVersion, 24) +} + +static void test_pack_HUSKEY(void) +{ + /* HUSKEY */ + TEST_TYPE_SIZE (HUSKEY, 8) + TEST_TYPE_ALIGN (HUSKEY, 8) +} + +static void test_pack_PHUSKEY(void) +{ + /* PHUSKEY */ + TEST_TYPE_SIZE (PHUSKEY, 8) + TEST_TYPE_ALIGN (PHUSKEY, 8) + TEST_TARGET_SIZE (PHUSKEY, 8) + TEST_TARGET_ALIGN(PHUSKEY, 8) +} + +#else /* _WIN64 */ + static void test_pack_ASSOCF(void) { /* ASSOCF */ @@ -161,6 +222,8 @@ static void test_pack_PHUSKEY(void) TEST_TARGET_ALIGN(PHUSKEY, 4) } +#endif /* _WIN64 */ + static void test_pack(void) { test_pack_ASSOCF(); @@ -173,9 +236,5 @@ static void test_pack(void) START_TEST(generated) { -#ifdef _WIN64 - ok(0, "The type size / alignment tests don't support Win64 yet\n"); -#else test_pack(); -#endif } diff --git a/rostests/winetests/shlwapi/istream.c b/rostests/winetests/shlwapi/istream.c index 67d1fe25182..4a36b3ab0ba 100644 --- a/rostests/winetests/shlwapi/istream.c +++ b/rostests/winetests/shlwapi/istream.c @@ -208,12 +208,16 @@ static void test_SHCreateStreamOnFileA(DWORD mode, DWORD stgm) /* invalid arguments */ stream = NULL; - /* NT: ERROR_PATH_NOT_FOUND, 9x: ERROR_BAD_PATHNAME */ ret = (*pSHCreateStreamOnFileA)(NULL, mode | stgm, &stream); - ok(ret == HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND) || - ret == HRESULT_FROM_WIN32(ERROR_BAD_PATHNAME), - "SHCreateStreamOnFileA: expected HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND)" - "or HRESULT_FROM_WIN32(ERROR_BAD_PATHNAME), got 0x%08x\n", ret); + if (ret == E_INVALIDARG) /* Win98 SE */ { + win_skip("Not supported\n"); + return; + } + + ok(ret == HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND) /* NT */ || + ret == HRESULT_FROM_WIN32(ERROR_BAD_PATHNAME) /* 9x */, + "SHCreateStreamOnFileA: expected HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND) " + "or HRESULT_FROM_WIN32(ERROR_BAD_PATHNAME), got 0x%08x\n", ret); ok(stream == NULL, "SHCreateStreamOnFileA: expected a NULL IStream object, got %p\n", stream); #if 0 /* This test crashes on WinXP SP2 */ @@ -342,6 +346,11 @@ static void test_SHCreateStreamOnFileW(DWORD mode, DWORD stgm) stream = NULL; ret = (*pSHCreateStreamOnFileW)(test_file, mode | STGM_FAILIFTHERE | stgm, &stream); + if (ret == E_INVALIDARG) /* Win98 SE */ { + win_skip("Not supported\n"); + return; + } + ok(ret == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), "SHCreateStreamOnFileW: expected HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), got 0x%08x\n", ret); ok(stream == NULL, "SHCreateStreamOnFileW: expected a NULL IStream object, got %p\n", stream); @@ -423,6 +432,11 @@ static void test_SHCreateStreamOnFileEx(DWORD mode, DWORD stgm) stream = NULL; ret = (*pSHCreateStreamOnFileEx)(test_file, mode, 0, FALSE, template, &stream); + if (ret == HRESULT_FROM_WIN32(ERROR_ACCESS_DENIED)) { + win_skip("File probably locked by Anti-Virus/Spam software, trying again\n"); + Sleep(1000); + ret = (*pSHCreateStreamOnFileEx)(test_file, mode, 0, FALSE, template, &stream); + } ok( ret == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) || ret == HRESULT_FROM_WIN32(ERROR_INVALID_PARAMETER), "SHCreateStreamOnFileEx: expected HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) or " @@ -482,6 +496,11 @@ static void test_SHCreateStreamOnFileEx(DWORD mode, DWORD stgm) stream = NULL; ret = (*pSHCreateStreamOnFileEx)(test_file, mode | STGM_CREATE | stgm, 0, FALSE, NULL, &stream); + if (ret == HRESULT_FROM_WIN32(ERROR_ACCESS_DENIED)) { + win_skip("File probably locked by Anti-Virus/Spam software, trying again\n"); + Sleep(1000); + ret = (*pSHCreateStreamOnFileEx)(test_file, mode | STGM_CREATE | stgm, 0, FALSE, NULL, &stream); + } ok(ret == S_OK, "SHCreateStreamOnFileEx: expected S_OK, got 0x%08x\n", ret); ok(stream != NULL, "SHCreateStreamOnFileEx: expected a valid IStream object, got NULL\n"); @@ -498,6 +517,11 @@ static void test_SHCreateStreamOnFileEx(DWORD mode, DWORD stgm) stream = NULL; ret = (*pSHCreateStreamOnFileEx)(test_file, mode | STGM_CREATE | stgm, 0, TRUE, NULL, &stream); + if (ret == HRESULT_FROM_WIN32(ERROR_ACCESS_DENIED)) { + win_skip("File probably locked by Anti-Virus/Spam software, trying again\n"); + Sleep(1000); + ret = (*pSHCreateStreamOnFileEx)(test_file, mode | STGM_CREATE | stgm, 0, TRUE, NULL, &stream); + } ok(ret == S_OK, "SHCreateStreamOnFileEx: expected S_OK, got 0x%08x\n", ret); ok(stream != NULL, "SHCreateStreamOnFileEx: expected a valid IStream object, got NULL\n"); diff --git a/rostests/winetests/shlwapi/ordinal.c b/rostests/winetests/shlwapi/ordinal.c index 22437e2b17a..cfc25e116c7 100755 --- a/rostests/winetests/shlwapi/ordinal.c +++ b/rostests/winetests/shlwapi/ordinal.c @@ -28,9 +28,14 @@ #include "oaidl.h" #include "ocidl.h" #include "mlang.h" +#include "shlwapi.h" +#include "docobj.h" +#include "shobjidl.h" /* Function ptrs for ordinal calls */ static HMODULE hShlwapi; +static BOOL is_win2k_and_lower; + static int (WINAPI *pSHSearchMapInt)(const int*,const int*,int,int); static HRESULT (WINAPI *pGetAcceptLanguagesA)(LPSTR,LPDWORD); @@ -43,6 +48,14 @@ static HRESULT(WINAPI *pIConnectionPoint_SimpleInvoke)(IConnectionPoint*,DISPID, static HRESULT(WINAPI *pIConnectionPoint_InvokeWithCancel)(IConnectionPoint*,DISPID,DISPPARAMS*,DWORD,DWORD); static HRESULT(WINAPI *pConnectToConnectionPoint)(IUnknown*,REFIID,BOOL,IUnknown*, LPDWORD,IConnectionPoint **); static HRESULT(WINAPI *pSHPropertyBag_ReadLONG)(IPropertyBag *,LPCWSTR,LPLONG); +static LONG (WINAPI *pSHSetWindowBits)(HWND, INT, UINT, UINT); +static INT (WINAPI *pSHFormatDateTimeA)(const FILETIME UNALIGNED*, DWORD*, LPSTR, UINT); +static INT (WINAPI *pSHFormatDateTimeW)(const FILETIME UNALIGNED*, DWORD*, LPWSTR, UINT); +static DWORD (WINAPI *pSHGetObjectCompatFlags)(IUnknown*, const CLSID*); +static BOOL (WINAPI *pGUIDFromStringA)(LPSTR, CLSID *); +static HRESULT (WINAPI *pIUnknown_QueryServiceExec)(IUnknown*, REFIID, const GUID*, DWORD, DWORD, VARIANT*, VARIANT*); +static HRESULT (WINAPI *pIUnknown_ProfferService)(IUnknown*, REFGUID, IServiceProvider*, DWORD*); +static HWND (WINAPI *pSHCreateWorkerWindowA)(LONG, HWND, DWORD, DWORD, HMENU, LONG_PTR); static HMODULE hmlang; static HRESULT (WINAPI *pLcidToRfc1766A)(LCID, LPSTR, INT); @@ -55,6 +68,79 @@ static const CHAR ie_international[] = { static const CHAR acceptlanguage[] = { 'A','c','c','e','p','t','L','a','n','g','u','a','g','e',0}; +typedef struct { + int id; + const void *args[5]; +} call_entry_t; + +typedef struct { + call_entry_t *calls; + int count; + int alloc; +} call_trace_t; + +static void init_call_trace(call_trace_t *ctrace) +{ + ctrace->alloc = 10; + ctrace->count = 0; + ctrace->calls = HeapAlloc(GetProcessHeap(), 0, sizeof(call_entry_t) * ctrace->alloc); +} + +static void free_call_trace(const call_trace_t *ctrace) +{ + HeapFree(GetProcessHeap(), 0, ctrace->calls); +} + +static void add_call(call_trace_t *ctrace, int id, const void *arg0, + const void *arg1, const void *arg2, const void *arg3, const void *arg4) +{ + call_entry_t call; + + call.id = id; + call.args[0] = arg0; + call.args[1] = arg1; + call.args[2] = arg2; + call.args[3] = arg3; + call.args[4] = arg4; + + if (ctrace->count == ctrace->alloc) + { + ctrace->alloc *= 2; + ctrace->calls = HeapReAlloc(GetProcessHeap(),0, ctrace->calls, ctrace->alloc*sizeof(call_entry_t)); + } + + ctrace->calls[ctrace->count++] = call; +} + +static void ok_trace_(call_trace_t *texpected, call_trace_t *tgot, int line) +{ + if (texpected->count == tgot->count) + { + INT i; + /* compare */ + for (i = 0; i < texpected->count; i++) + { + call_entry_t *expected = &texpected->calls[i]; + call_entry_t *got = &tgot->calls[i]; + INT j; + + ok_(__FILE__, line)(expected->id == got->id, "got different ids %d: %d, %d\n", i+1, expected->id, got->id); + + for (j = 0; j < 5; j++) + { + ok_(__FILE__, line)(expected->args[j] == got->args[j], "got different args[%d] for %d: %p, %p\n", j, i+1, + expected->args[j], got->args[j]); + } + } + } + else + ok_(__FILE__, line)(0, "traces length mismatch\n"); +} + +#define ok_trace(a, b) ok_trace_(a, b, __LINE__) + +/* trace of actually made calls */ +static call_trace_t trace_got; static void test_GetAcceptLanguagesA(void) { @@ -180,7 +266,7 @@ static void test_GetAcceptLanguagesA(void) /* There is no space for the string in the registry. When the buffer is large enough, the default language is returned - When the buffer is to small for that fallback, win7_32 and w2k8_64 + When the buffer is too small for that fallback, win7_32 and w2k8_64 and above fail with HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER), but recent os succeed and return a partial result while older os succeed and overflow the buffer */ @@ -248,7 +334,7 @@ static void test_GetAcceptLanguagesA(void) memset(buffer, '#', maxlen); buffer[maxlen] = 0; hr = pGetAcceptLanguagesA( buffer, &len); - /* When the buffer is to small, win7_32 and w2k8_64 and above fail with + /* When the buffer is too small, win7_32 and w2k8_64 and above fail with HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER), other versions suceed and return a partial 0 terminated result while other versions fail with E_INVALIDARG and return a partial unterminated result */ @@ -1397,31 +1483,940 @@ static void test_SHPropertyBag_ReadLONG(void) IUnknown_Release((IUnknown*)pb); } + + +static void test_SHSetWindowBits(void) +{ + HWND hwnd; + DWORD style, styleold; + WNDCLASSA clsA; + + if(!pSHSetWindowBits) + { + win_skip("SHSetWindowBits is not available\n"); + return; + } + + clsA.style = 0; + clsA.lpfnWndProc = DefWindowProcA; + clsA.cbClsExtra = 0; + clsA.cbWndExtra = 0; + clsA.hInstance = GetModuleHandleA(NULL); + clsA.hIcon = 0; + clsA.hCursor = LoadCursorA(0, IDC_ARROW); + clsA.hbrBackground = NULL; + clsA.lpszMenuName = NULL; + clsA.lpszClassName = "Shlwapi test class"; + RegisterClassA(&clsA); + + hwnd = CreateWindowA("Shlwapi test class", "Test", WS_VISIBLE, 0, 0, 100, 100, + NULL, NULL, GetModuleHandle(NULL), 0); + ok(IsWindow(hwnd), "failed to create window\n"); + + /* null window */ + SetLastError(0xdeadbeef); + style = pSHSetWindowBits(NULL, GWL_STYLE, 0, 0); + ok(style == 0, "expected 0 retval, got %d\n", style); + ok(GetLastError() == ERROR_INVALID_WINDOW_HANDLE || + broken(GetLastError() == 0xdeadbeef), /* Win9x/WinMe */ + "expected ERROR_INVALID_WINDOW_HANDLE, got %d\n", GetLastError()); + + /* zero mask, zero flags */ + styleold = GetWindowLongA(hwnd, GWL_STYLE); + style = pSHSetWindowBits(hwnd, GWL_STYLE, 0, 0); + ok(styleold == style, "expected old style\n"); + ok(styleold == GetWindowLongA(hwnd, GWL_STYLE), "expected to keep old style\n"); + + /* test mask */ + styleold = GetWindowLongA(hwnd, GWL_STYLE); + ok(styleold & WS_VISIBLE, "expected WS_VISIBLE\n"); + style = pSHSetWindowBits(hwnd, GWL_STYLE, WS_VISIBLE, 0); + + ok(style == styleold, "expected previous style, got %x\n", style); + ok((GetWindowLongA(hwnd, GWL_STYLE) & WS_VISIBLE) == 0, "expected updated style\n"); + + /* test mask, unset style bit used */ + styleold = GetWindowLongA(hwnd, GWL_STYLE); + style = pSHSetWindowBits(hwnd, GWL_STYLE, WS_VISIBLE, 0); + ok(style == styleold, "expected previous style, got %x\n", style); + ok(styleold == GetWindowLongA(hwnd, GWL_STYLE), "expected to keep old style\n"); + + /* set back with flags */ + styleold = GetWindowLongA(hwnd, GWL_STYLE); + style = pSHSetWindowBits(hwnd, GWL_STYLE, WS_VISIBLE, WS_VISIBLE); + ok(style == styleold, "expected previous style, got %x\n", style); + ok(GetWindowLongA(hwnd, GWL_STYLE) & WS_VISIBLE, "expected updated style\n"); + + /* reset and try to set without a mask */ + pSHSetWindowBits(hwnd, GWL_STYLE, WS_VISIBLE, 0); + ok((GetWindowLongA(hwnd, GWL_STYLE) & WS_VISIBLE) == 0, "expected updated style\n"); + styleold = GetWindowLongA(hwnd, GWL_STYLE); + style = pSHSetWindowBits(hwnd, GWL_STYLE, 0, WS_VISIBLE); + ok(style == styleold, "expected previous style, got %x\n", style); + ok((GetWindowLongA(hwnd, GWL_STYLE) & WS_VISIBLE) == 0, "expected updated style\n"); + + DestroyWindow(hwnd); + + UnregisterClassA("Shlwapi test class", GetModuleHandleA(NULL)); +} + +static void test_SHFormatDateTimeA(void) +{ + FILETIME UNALIGNED filetime; + CHAR buff[100], buff2[100], buff3[100]; + SYSTEMTIME st; + DWORD flags; + INT ret; + + if(!pSHFormatDateTimeA) + { + win_skip("pSHFormatDateTimeA isn't available\n"); + return; + } + +if (0) +{ + /* crashes on native */ + ret = pSHFormatDateTimeA(NULL, NULL, NULL, 0); +} + + GetLocalTime(&st); + SystemTimeToFileTime(&st, &filetime); + /* SHFormatDateTime expects input as utc */ + LocalFileTimeToFileTime(&filetime, &filetime); + + /* no way to get required buffer length here */ + SetLastError(0xdeadbeef); + ret = pSHFormatDateTimeA(&filetime, NULL, NULL, 0); + ok(ret == 0, "got %d\n", ret); + ok(GetLastError() == 0xdeadbeef, "expected 0xdeadbeef, got %d\n", GetLastError()); + + SetLastError(0xdeadbeef); + buff[0] = 'a'; buff[1] = 0; + ret = pSHFormatDateTimeA(&filetime, NULL, buff, 0); + ok(ret == 0, "got %d\n", ret); + ok(GetLastError() == 0xdeadbeef, "expected 0xdeadbeef, got %d\n", GetLastError()); + ok(buff[0] == 'a', "expected same string, got %s\n", buff); + + /* flags needs to have FDTF_NOAUTOREADINGORDER for these tests to succeed on Vista+ */ + + /* all combinations documented as invalid succeeded */ + flags = FDTF_NOAUTOREADINGORDER | FDTF_SHORTTIME | FDTF_LONGTIME; + SetLastError(0xdeadbeef); + ret = pSHFormatDateTimeA(&filetime, &flags, buff, sizeof(buff)); + ok(ret == lstrlenA(buff)+1, "got %d\n", ret); + ok(GetLastError() == 0xdeadbeef, "expected 0xdeadbeef, got %d\n", GetLastError()); + + flags = FDTF_NOAUTOREADINGORDER | FDTF_SHORTDATE | FDTF_LONGDATE; + SetLastError(0xdeadbeef); + ret = pSHFormatDateTimeA(&filetime, &flags, buff, sizeof(buff)); + ok(ret == lstrlenA(buff)+1, "got %d\n", ret); + ok(GetLastError() == 0xdeadbeef, "expected 0xdeadbeef, got %d\n", GetLastError()); + + flags = FDTF_SHORTDATE | FDTF_LTRDATE | FDTF_RTLDATE; + SetLastError(0xdeadbeef); + ret = pSHFormatDateTimeA(&filetime, &flags, buff, sizeof(buff)); + ok(ret == lstrlenA(buff)+1, "got %d\n", ret); + ok(GetLastError() == 0xdeadbeef || + broken(GetLastError() == ERROR_INVALID_FLAGS), /* Win9x/WinMe */ + "expected 0xdeadbeef, got %d\n", GetLastError()); + + /* now check returned strings */ + flags = FDTF_NOAUTOREADINGORDER | FDTF_SHORTTIME; + ret = pSHFormatDateTimeA(&filetime, &flags, buff, sizeof(buff)); + ok(ret == lstrlenA(buff)+1, "got %d\n", ret); + ret = GetTimeFormat(LOCALE_USER_DEFAULT, TIME_NOSECONDS, &st, NULL, buff2, sizeof(buff2)); + ok(ret == lstrlenA(buff2)+1, "got %d\n", ret); + ok(lstrcmpA(buff, buff2) == 0, "expected (%s), got (%s)\n", buff2, buff); + + flags = FDTF_NOAUTOREADINGORDER | FDTF_LONGTIME; + ret = pSHFormatDateTimeA(&filetime, &flags, buff, sizeof(buff)); + ok(ret == lstrlenA(buff)+1, "got %d\n", ret); + ret = GetTimeFormat(LOCALE_USER_DEFAULT, 0, &st, NULL, buff2, sizeof(buff2)); + ok(ret == lstrlenA(buff2)+1, "got %d\n", ret); + ok(lstrcmpA(buff, buff2) == 0, "expected (%s), got (%s)\n", buff2, buff); + + /* both time flags */ + flags = FDTF_NOAUTOREADINGORDER | FDTF_LONGTIME | FDTF_SHORTTIME; + ret = pSHFormatDateTimeA(&filetime, &flags, buff, sizeof(buff)); + ok(ret == lstrlenA(buff)+1, "got %d\n", ret); + ret = GetTimeFormat(LOCALE_USER_DEFAULT, 0, &st, NULL, buff2, sizeof(buff2)); + ok(ret == lstrlenA(buff2)+1, "got %d\n", ret); + ok(lstrcmpA(buff, buff2) == 0, "expected (%s), got (%s)\n", buff2, buff); + + flags = FDTF_NOAUTOREADINGORDER | FDTF_SHORTDATE; + ret = pSHFormatDateTimeA(&filetime, &flags, buff, sizeof(buff)); + ok(ret == lstrlenA(buff)+1, "got %d\n", ret); + ret = GetDateFormat(LOCALE_USER_DEFAULT, DATE_SHORTDATE, &st, NULL, buff2, sizeof(buff2)); + ok(ret == lstrlenA(buff2)+1, "got %d\n", ret); + ok(lstrcmpA(buff, buff2) == 0, "expected (%s), got (%s)\n", buff2, buff); + + flags = FDTF_NOAUTOREADINGORDER | FDTF_LONGDATE; + ret = pSHFormatDateTimeA(&filetime, &flags, buff, sizeof(buff)); + ok(ret == lstrlenA(buff)+1, "got %d\n", ret); + ret = GetDateFormat(LOCALE_USER_DEFAULT, DATE_LONGDATE, &st, NULL, buff2, sizeof(buff2)); + ok(ret == lstrlenA(buff2)+1, "got %d\n", ret); + ok(lstrcmpA(buff, buff2) == 0, "expected (%s), got (%s)\n", buff2, buff); + + /* both date flags */ + flags = FDTF_NOAUTOREADINGORDER | FDTF_LONGDATE | FDTF_SHORTDATE; + ret = pSHFormatDateTimeA(&filetime, &flags, buff, sizeof(buff)); + ok(ret == lstrlenA(buff)+1, "got %d\n", ret); + ret = GetDateFormat(LOCALE_USER_DEFAULT, DATE_LONGDATE, &st, NULL, buff2, sizeof(buff2)); + ok(ret == lstrlenA(buff2)+1, "got %d\n", ret); + ok(lstrcmpA(buff, buff2) == 0, "expected (%s), got (%s)\n", buff2, buff); + + /* various combinations of date/time flags */ + flags = FDTF_NOAUTOREADINGORDER | FDTF_LONGDATE | FDTF_SHORTTIME; + ret = pSHFormatDateTimeA(&filetime, &flags, buff, sizeof(buff)); + ok(ret == lstrlenA(buff)+1, "got %d, length %d\n", ret, lstrlenA(buff)+1); + ret = GetDateFormat(LOCALE_USER_DEFAULT, DATE_LONGDATE, &st, NULL, buff2, sizeof(buff2)); + ok(ret == lstrlenA(buff2)+1, "got %d\n", ret); + strcat(buff2, ", "); + ret = GetTimeFormat(LOCALE_USER_DEFAULT, TIME_NOSECONDS, &st, NULL, buff3, sizeof(buff3)); + ok(ret == lstrlenA(buff3)+1, "got %d\n", ret); + strcat(buff2, buff3); + ok(lstrcmpA(buff, buff2) == 0, "expected (%s), got (%s)\n", buff2, buff); + + flags = FDTF_NOAUTOREADINGORDER | FDTF_LONGDATE | FDTF_LONGTIME; + ret = pSHFormatDateTimeA(&filetime, &flags, buff, sizeof(buff)); + ok(ret == lstrlenA(buff)+1, "got %d\n", ret); + ret = GetDateFormat(LOCALE_USER_DEFAULT, DATE_LONGDATE, &st, NULL, buff2, sizeof(buff2)); + ok(ret == lstrlenA(buff2)+1, "got %d\n", ret); + strcat(buff2, ", "); + ret = GetTimeFormat(LOCALE_USER_DEFAULT, 0, &st, NULL, buff3, sizeof(buff3)); + ok(ret == lstrlenA(buff3)+1, "got %d\n", ret); + strcat(buff2, buff3); + ok(lstrcmpA(buff, buff2) == 0, "expected (%s), got (%s)\n", buff2, buff); + + flags = FDTF_NOAUTOREADINGORDER | FDTF_SHORTDATE | FDTF_SHORTTIME; + ret = pSHFormatDateTimeA(&filetime, &flags, buff, sizeof(buff)); + ok(ret == lstrlenA(buff)+1, "got %d\n", ret); + ret = GetDateFormat(LOCALE_USER_DEFAULT, DATE_SHORTDATE, &st, NULL, buff2, sizeof(buff2)); + ok(ret == lstrlenA(buff2)+1, "got %d\n", ret); + strcat(buff2, " "); + ret = GetTimeFormat(LOCALE_USER_DEFAULT, TIME_NOSECONDS, &st, NULL, buff3, sizeof(buff3)); + ok(ret == lstrlenA(buff3)+1, "got %d\n", ret); + strcat(buff2, buff3); + ok(lstrcmpA(buff, buff2) == 0, "expected (%s), got (%s)\n", buff2, buff); + + flags = FDTF_NOAUTOREADINGORDER | FDTF_SHORTDATE | FDTF_LONGTIME; + ret = pSHFormatDateTimeA(&filetime, &flags, buff, sizeof(buff)); + ok(ret == lstrlenA(buff)+1, "got %d\n", ret); + ret = GetDateFormat(LOCALE_USER_DEFAULT, DATE_SHORTDATE, &st, NULL, buff2, sizeof(buff2)); + ok(ret == lstrlenA(buff2)+1, "got %d\n", ret); + strcat(buff2, " "); + ret = GetTimeFormat(LOCALE_USER_DEFAULT, 0, &st, NULL, buff3, sizeof(buff3)); + ok(ret == lstrlenA(buff3)+1, "got %d\n", ret); + strcat(buff2, buff3); + ok(lstrcmpA(buff, buff2) == 0, "expected (%s), got (%s)\n", buff2, buff); +} + +static void test_SHFormatDateTimeW(void) +{ + FILETIME UNALIGNED filetime; + WCHAR buff[100], buff2[100], buff3[100]; + SYSTEMTIME st; + DWORD flags; + INT ret; + static const WCHAR spaceW[] = {' ',0}; + static const WCHAR commaW[] = {',',' ',0}; + + if(!pSHFormatDateTimeW) + { + win_skip("pSHFormatDateTimeW isn't available\n"); + return; + } + +if (0) +{ + /* crashes on native */ + ret = pSHFormatDateTimeW(NULL, NULL, NULL, 0); +} + + GetLocalTime(&st); + SystemTimeToFileTime(&st, &filetime); + /* SHFormatDateTime expects input as utc */ + LocalFileTimeToFileTime(&filetime, &filetime); + + /* no way to get required buffer length here */ + SetLastError(0xdeadbeef); + ret = pSHFormatDateTimeW(&filetime, NULL, NULL, 0); + ok(ret == 0, "got %d\n", ret); + ok(GetLastError() == 0xdeadbeef, "expected 0xdeadbeef, got %d\n", GetLastError()); + + SetLastError(0xdeadbeef); + buff[0] = 'a'; buff[1] = 0; + ret = pSHFormatDateTimeW(&filetime, NULL, buff, 0); + ok(ret == 0, "got %d\n", ret); + ok(GetLastError() == 0xdeadbeef, "expected 0xdeadbeef, got %d\n", GetLastError()); + ok(buff[0] == 'a', "expected same string\n"); + + /* all combinations documented as invalid succeeded */ + flags = FDTF_SHORTTIME | FDTF_LONGTIME; + SetLastError(0xdeadbeef); + ret = pSHFormatDateTimeW(&filetime, &flags, buff, sizeof(buff)/sizeof(WCHAR)); + ok(ret == lstrlenW(buff)+1, "got %d\n", ret); + ok(GetLastError() == 0xdeadbeef, "expected 0xdeadbeef, got %d\n", GetLastError()); + + flags = FDTF_SHORTDATE | FDTF_LONGDATE; + SetLastError(0xdeadbeef); + ret = pSHFormatDateTimeW(&filetime, &flags, buff, sizeof(buff)/sizeof(WCHAR)); + ok(ret == lstrlenW(buff)+1, "got %d\n", ret); + ok(GetLastError() == 0xdeadbeef, "expected 0xdeadbeef, got %d\n", GetLastError()); + + flags = FDTF_SHORTDATE | FDTF_LTRDATE | FDTF_RTLDATE; + SetLastError(0xdeadbeef); + buff[0] = 0; /* NT4 doesn't clear the buffer on failure */ + ret = pSHFormatDateTimeW(&filetime, &flags, buff, sizeof(buff)/sizeof(WCHAR)); + ok(ret == lstrlenW(buff)+1, "got %d\n", ret); + ok(GetLastError() == 0xdeadbeef || + broken(GetLastError() == ERROR_INVALID_FLAGS), /* Win9x/WinMe/NT4 */ + "expected 0xdeadbeef, got %d\n", GetLastError()); + + /* now check returned strings */ + flags = FDTF_SHORTTIME; + ret = pSHFormatDateTimeW(&filetime, &flags, buff, sizeof(buff)/sizeof(WCHAR)); + ok(ret == lstrlenW(buff)+1, "got %d\n", ret); + SetLastError(0xdeadbeef); + ret = GetTimeFormatW(LOCALE_USER_DEFAULT, TIME_NOSECONDS, &st, NULL, buff2, sizeof(buff2)/sizeof(WCHAR)); + if (ret == 0 && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) + { + win_skip("Needed W-functions are not implemented\n"); + return; + } + ok(ret == lstrlenW(buff2)+1, "got %d\n", ret); + ok(lstrcmpW(buff, buff2) == 0, "expected equal strings\n"); + + flags = FDTF_LONGTIME; + ret = pSHFormatDateTimeW(&filetime, &flags, buff, sizeof(buff)/sizeof(WCHAR)); + ok(ret == lstrlenW(buff)+1, "got %d\n", ret); + ret = GetTimeFormatW(LOCALE_USER_DEFAULT, 0, &st, NULL, buff2, sizeof(buff2)/sizeof(WCHAR)); + ok(ret == lstrlenW(buff2)+1, "got %d\n", ret); + ok(lstrcmpW(buff, buff2) == 0, "expected equal strings\n"); + + /* both time flags */ + flags = FDTF_LONGTIME | FDTF_SHORTTIME; + ret = pSHFormatDateTimeW(&filetime, &flags, buff, sizeof(buff)/sizeof(WCHAR)); + ok(ret == lstrlenW(buff)+1, "got %d\n", ret); + ret = GetTimeFormatW(LOCALE_USER_DEFAULT, 0, &st, NULL, buff2, sizeof(buff2)/sizeof(WCHAR)); + ok(ret == lstrlenW(buff2)+1, "got %d\n", ret); + ok(lstrcmpW(buff, buff2) == 0, "expected equal string\n"); + + flags = FDTF_SHORTDATE; + ret = pSHFormatDateTimeW(&filetime, &flags, buff, sizeof(buff)/sizeof(WCHAR)); + ok(ret == lstrlenW(buff)+1, "got %d\n", ret); + ret = GetDateFormatW(LOCALE_USER_DEFAULT, DATE_SHORTDATE, &st, NULL, buff2, sizeof(buff2)/sizeof(WCHAR)); + ok(ret == lstrlenW(buff2)+1, "got %d\n", ret); + ok(lstrcmpW(buff, buff2) == 0, "expected equal strings\n"); + + flags = FDTF_LONGDATE; + ret = pSHFormatDateTimeW(&filetime, &flags, buff, sizeof(buff)/sizeof(WCHAR)); + ok(ret == lstrlenW(buff)+1, "got %d\n", ret); + ret = GetDateFormatW(LOCALE_USER_DEFAULT, DATE_LONGDATE, &st, NULL, buff2, sizeof(buff2)/sizeof(WCHAR)); + ok(ret == lstrlenW(buff2)+1, "got %d\n", ret); + ok(lstrcmpW(buff, buff2) == 0, "expected equal strings\n"); + + /* both date flags */ + flags = FDTF_LONGDATE | FDTF_SHORTDATE; + ret = pSHFormatDateTimeW(&filetime, &flags, buff, sizeof(buff)/sizeof(WCHAR)); + ok(ret == lstrlenW(buff)+1, "got %d\n", ret); + ret = GetDateFormatW(LOCALE_USER_DEFAULT, DATE_LONGDATE, &st, NULL, buff2, sizeof(buff2)/sizeof(WCHAR)); + ok(ret == lstrlenW(buff2)+1, "got %d\n", ret); + ok(lstrcmpW(buff, buff2) == 0, "expected equal strings\n"); + + /* various combinations of date/time flags */ + flags = FDTF_LONGDATE | FDTF_SHORTTIME; + ret = pSHFormatDateTimeW(&filetime, &flags, buff, sizeof(buff)/sizeof(WCHAR)); + ok(ret == lstrlenW(buff)+1, "got %d, length %d\n", ret, lstrlenW(buff)+1); + ret = GetDateFormatW(LOCALE_USER_DEFAULT, DATE_LONGDATE, &st, NULL, buff2, sizeof(buff2)/sizeof(WCHAR)); + ok(ret == lstrlenW(buff2)+1, "got %d\n", ret); + lstrcatW(buff2, commaW); + ret = GetTimeFormatW(LOCALE_USER_DEFAULT, TIME_NOSECONDS, &st, NULL, buff3, sizeof(buff3)/sizeof(WCHAR)); + ok(ret == lstrlenW(buff3)+1, "got %d\n", ret); + lstrcatW(buff2, buff3); + ok(lstrcmpW(buff, buff2) == 0, "expected equal strings\n"); + + flags = FDTF_LONGDATE | FDTF_LONGTIME; + ret = pSHFormatDateTimeW(&filetime, &flags, buff, sizeof(buff)/sizeof(WCHAR)); + ok(ret == lstrlenW(buff)+1, "got %d\n", ret); + ret = GetDateFormatW(LOCALE_USER_DEFAULT, DATE_LONGDATE, &st, NULL, buff2, sizeof(buff2)/sizeof(WCHAR)); + ok(ret == lstrlenW(buff2)+1, "got %d\n", ret); + lstrcatW(buff2, commaW); + ret = GetTimeFormatW(LOCALE_USER_DEFAULT, 0, &st, NULL, buff3, sizeof(buff3)/sizeof(WCHAR)); + ok(ret == lstrlenW(buff3)+1, "got %d\n", ret); + lstrcatW(buff2, buff3); + ok(lstrcmpW(buff, buff2) == 0, "expected equal strings\n"); + + flags = FDTF_SHORTDATE | FDTF_SHORTTIME; + ret = pSHFormatDateTimeW(&filetime, &flags, buff, sizeof(buff)/sizeof(WCHAR)); + ok(ret == lstrlenW(buff)+1, "got %d\n", ret); + ret = GetDateFormatW(LOCALE_USER_DEFAULT, DATE_SHORTDATE, &st, NULL, buff2, sizeof(buff2)/sizeof(WCHAR)); + ok(ret == lstrlenW(buff2)+1, "got %d\n", ret); + lstrcatW(buff2, spaceW); + ret = GetTimeFormatW(LOCALE_USER_DEFAULT, TIME_NOSECONDS, &st, NULL, buff3, sizeof(buff3)/sizeof(WCHAR)); + ok(ret == lstrlenW(buff3)+1, "got %d\n", ret); + lstrcatW(buff2, buff3); + ok(lstrcmpW(buff, buff2) == 0, "expected equal strings\n"); + + flags = FDTF_SHORTDATE | FDTF_LONGTIME; + ret = pSHFormatDateTimeW(&filetime, &flags, buff, sizeof(buff)/sizeof(WCHAR)); + ok(ret == lstrlenW(buff)+1, "got %d\n", ret); + ret = GetDateFormatW(LOCALE_USER_DEFAULT, DATE_SHORTDATE, &st, NULL, buff2, sizeof(buff2)/sizeof(WCHAR)); + ok(ret == lstrlenW(buff2)+1, "got %d\n", ret); + lstrcatW(buff2, spaceW); + ret = GetTimeFormatW(LOCALE_USER_DEFAULT, 0, &st, NULL, buff3, sizeof(buff3)/sizeof(WCHAR)); + ok(ret == lstrlenW(buff3)+1, "got %d\n", ret); + lstrcatW(buff2, buff3); + ok(lstrcmpW(buff, buff2) == 0, "expected equal strings\n"); +} + +static void test_SHGetObjectCompatFlags(void) +{ + struct compat_value { + CHAR nameA[30]; + DWORD value; + }; + + struct compat_value values[] = { + { "OTNEEDSSFCACHE", 0x1 }, + { "NO_WEBVIEW", 0x2 }, + { "UNBINDABLE", 0x4 }, + { "PINDLL", 0x8 }, + { "NEEDSFILESYSANCESTOR", 0x10 }, + { "NOTAFILESYSTEM", 0x20 }, + { "CTXMENU_NOVERBS", 0x40 }, + { "CTXMENU_LIMITEDQI", 0x80 }, + { "COCREATESHELLFOLDERONLY", 0x100 }, + { "NEEDSSTORAGEANCESTOR", 0x200 }, + { "NOLEGACYWEBVIEW", 0x400 }, + { "CTXMENU_XPQCMFLAGS", 0x1000 }, + { "NOIPROPERTYSTORE", 0x2000 } + }; + + static const char compat_path[] = "Software\\Microsoft\\Windows\\CurrentVersion\\ShellCompatibility\\Objects"; + CHAR keyA[39]; /* {CLSID} */ + HKEY root; + DWORD ret; + int i; + + if (!pSHGetObjectCompatFlags) + { + win_skip("SHGetObjectCompatFlags isn't available\n"); + return; + } + + /* null args */ + ret = pSHGetObjectCompatFlags(NULL, NULL); + ok(ret == 0, "got %d\n", ret); + + ret = RegOpenKeyA(HKEY_LOCAL_MACHINE, compat_path, &root); + if (ret != ERROR_SUCCESS) + { + skip("No compatibility class data found\n"); + return; + } + + for (i = 0; RegEnumKeyA(root, i, keyA, sizeof(keyA)) == ERROR_SUCCESS; i++) + { + HKEY clsid_key; + + if (RegOpenKeyA(root, keyA, &clsid_key) == ERROR_SUCCESS) + { + CHAR valueA[30]; + DWORD expected = 0, got, length = sizeof(valueA); + CLSID clsid; + int v; + + for (v = 0; RegEnumValueA(clsid_key, v, valueA, &length, NULL, NULL, NULL, NULL) == ERROR_SUCCESS; v++) + { + int j; + + for (j = 0; j < sizeof(values)/sizeof(struct compat_value); j++) + if (lstrcmpA(values[j].nameA, valueA) == 0) + { + expected |= values[j].value; + break; + } + + length = sizeof(valueA); + } + + pGUIDFromStringA(keyA, &clsid); + got = pSHGetObjectCompatFlags(NULL, &clsid); + ok(got == expected, "got 0x%08x, expected 0x%08x. Key %s\n", got, expected, keyA); + + RegCloseKey(clsid_key); + } + } + + RegCloseKey(root); +} + +typedef struct { + const IOleCommandTargetVtbl *lpVtbl; + LONG ref; +} IOleCommandTargetImpl; + +static const IOleCommandTargetVtbl IOleCommandTargetImpl_Vtbl; + +IOleCommandTarget* IOleCommandTargetImpl_Construct(void) +{ + IOleCommandTargetImpl *obj; + + obj = HeapAlloc(GetProcessHeap(), 0, sizeof(*obj)); + obj->lpVtbl = &IOleCommandTargetImpl_Vtbl; + obj->ref = 1; + + return (IOleCommandTarget*)obj; +} + +static HRESULT WINAPI IOleCommandTargetImpl_QueryInterface(IOleCommandTarget *iface, REFIID riid, void **ppvObj) +{ + IOleCommandTargetImpl *This = (IOleCommandTargetImpl *)iface; + + if (IsEqualIID(riid, &IID_IUnknown) || + IsEqualIID(riid, &IID_IOleCommandTarget)) + { + *ppvObj = This; + } + + if(*ppvObj) + { + IUnknown_AddRef(iface); + return S_OK; + } + + return E_NOINTERFACE; +} + +static ULONG WINAPI IOleCommandTargetImpl_AddRef(IOleCommandTarget *iface) +{ + IOleCommandTargetImpl *This = (IOleCommandTargetImpl *)iface; + return InterlockedIncrement(&This->ref); +} + +static ULONG WINAPI IOleCommandTargetImpl_Release(IOleCommandTarget *iface) +{ + IOleCommandTargetImpl *This = (IOleCommandTargetImpl *)iface; + ULONG ref = InterlockedDecrement(&This->ref); + + if (!ref) + { + HeapFree(GetProcessHeap(), 0, This); + return 0; + } + return ref; +} + +static HRESULT WINAPI IOleCommandTargetImpl_QueryStatus( + IOleCommandTarget *iface, const GUID *group, ULONG cCmds, OLECMD prgCmds[], OLECMDTEXT *pCmdText) +{ + return E_NOTIMPL; +} + +static HRESULT WINAPI IOleCommandTargetImpl_Exec( + IOleCommandTarget *iface, + const GUID *CmdGroup, + DWORD nCmdID, + DWORD nCmdexecopt, + VARIANT *pvaIn, + VARIANT *pvaOut) +{ + add_call(&trace_got, 3, CmdGroup, (void*)(DWORD_PTR)nCmdID, (void*)(DWORD_PTR)nCmdexecopt, pvaIn, pvaOut); + return S_OK; +} + +static const IOleCommandTargetVtbl IOleCommandTargetImpl_Vtbl = +{ + IOleCommandTargetImpl_QueryInterface, + IOleCommandTargetImpl_AddRef, + IOleCommandTargetImpl_Release, + IOleCommandTargetImpl_QueryStatus, + IOleCommandTargetImpl_Exec +}; + +typedef struct { + const IServiceProviderVtbl *lpVtbl; + LONG ref; +} IServiceProviderImpl; + +typedef struct { + const IProfferServiceVtbl *lpVtbl; + LONG ref; +} IProfferServiceImpl; + + +static const IServiceProviderVtbl IServiceProviderImpl_Vtbl; +static const IProfferServiceVtbl IProfferServiceImpl_Vtbl; + +IServiceProvider* IServiceProviderImpl_Construct(void) +{ + IServiceProviderImpl *obj; + + obj = HeapAlloc(GetProcessHeap(), 0, sizeof(*obj)); + obj->lpVtbl = &IServiceProviderImpl_Vtbl; + obj->ref = 1; + + return (IServiceProvider*)obj; +} + +IProfferService* IProfferServiceImpl_Construct(void) +{ + IProfferServiceImpl *obj; + + obj = HeapAlloc(GetProcessHeap(), 0, sizeof(*obj)); + obj->lpVtbl = &IProfferServiceImpl_Vtbl; + obj->ref = 1; + + return (IProfferService*)obj; +} + +static HRESULT WINAPI IServiceProviderImpl_QueryInterface(IServiceProvider *iface, REFIID riid, void **ppvObj) +{ + IServiceProviderImpl *This = (IServiceProviderImpl *)iface; + + if (IsEqualIID(riid, &IID_IUnknown) || + IsEqualIID(riid, &IID_IServiceProvider)) + { + *ppvObj = This; + } + + if(*ppvObj) + { + IUnknown_AddRef(iface); + /* native uses redefined IID_IServiceProvider symbol, so we can't compare pointers */ + if (IsEqualIID(riid, &IID_IServiceProvider)) + add_call(&trace_got, 1, iface, &IID_IServiceProvider, 0, 0, 0); + return S_OK; + } + + return E_NOINTERFACE; +} + +static ULONG WINAPI IServiceProviderImpl_AddRef(IServiceProvider *iface) +{ + IServiceProviderImpl *This = (IServiceProviderImpl *)iface; + return InterlockedIncrement(&This->ref); +} + +static ULONG WINAPI IServiceProviderImpl_Release(IServiceProvider *iface) +{ + IServiceProviderImpl *This = (IServiceProviderImpl *)iface; + ULONG ref = InterlockedDecrement(&This->ref); + + if (!ref) + { + HeapFree(GetProcessHeap(), 0, This); + return 0; + } + return ref; +} + +static HRESULT WINAPI IServiceProviderImpl_QueryService( + IServiceProvider *iface, REFGUID service, REFIID riid, void **ppv) +{ + /* native uses redefined pointer for IID_IOleCommandTarget, not one from uuid.lib */ + if (IsEqualIID(riid, &IID_IOleCommandTarget)) + { + add_call(&trace_got, 2, iface, service, &IID_IOleCommandTarget, 0, 0); + *ppv = IOleCommandTargetImpl_Construct(); + } + if (IsEqualIID(riid, &IID_IProfferService)) + { + if (IsEqualIID(service, &IID_IProfferService)) + add_call(&trace_got, 2, &IID_IProfferService, &IID_IProfferService, 0, 0, 0); + *ppv = IProfferServiceImpl_Construct(); + } + return S_OK; +} + +static const IServiceProviderVtbl IServiceProviderImpl_Vtbl = +{ + IServiceProviderImpl_QueryInterface, + IServiceProviderImpl_AddRef, + IServiceProviderImpl_Release, + IServiceProviderImpl_QueryService +}; + +static void test_IUnknown_QueryServiceExec(void) +{ + IServiceProvider *provider = IServiceProviderImpl_Construct(); + static const GUID dummy_serviceid = { 0xdeadbeef }; + static const GUID dummy_groupid = { 0xbeefbeef }; + call_trace_t trace_expected; + HRESULT hr; + + /* on <=W2K platforms same ordinal used for another export with different + prototype, so skipping using this indirect condition */ + if (is_win2k_and_lower) + { + win_skip("IUnknown_QueryServiceExec is not available\n"); + return; + } + + /* null source pointer */ + hr = pIUnknown_QueryServiceExec(NULL, &dummy_serviceid, &dummy_groupid, 0, 0, 0, 0); + ok(hr == E_FAIL, "got 0x%08x\n", hr); + + /* expected trace: + IUnknown_QueryServiceExec( ptr1, serviceid, groupid, arg1, arg2, arg3, arg4); + -> IUnknown_QueryInterface( ptr1, &IID_IServiceProvider, &prov ); + -> IServiceProvider_QueryService( prov, serviceid, &IID_IOleCommandTarget, &obj ); + -> IOleCommandTarget_Exec( obj, groupid, arg1, arg2, arg3, arg4 ); + */ + init_call_trace(&trace_expected); + + add_call(&trace_expected, 1, provider, &IID_IServiceProvider, 0, 0, 0); + add_call(&trace_expected, 2, provider, &dummy_serviceid, &IID_IOleCommandTarget, 0, 0); + add_call(&trace_expected, 3, &dummy_groupid, (void*)0x1, (void*)0x2, (void*)0x3, (void*)0x4); + + init_call_trace(&trace_got); + hr = pIUnknown_QueryServiceExec((IUnknown*)provider, &dummy_serviceid, &dummy_groupid, 0x1, 0x2, (void*)0x3, (void*)0x4); + ok(hr == S_OK, "got 0x%08x\n", hr); + + ok_trace(&trace_expected, &trace_got); + + free_call_trace(&trace_expected); + free_call_trace(&trace_got); + + IServiceProvider_Release(provider); +} + + +static HRESULT WINAPI IProfferServiceImpl_QueryInterface(IProfferService *iface, REFIID riid, void **ppvObj) +{ + IProfferServiceImpl *This = (IProfferServiceImpl *)iface; + + if (IsEqualIID(riid, &IID_IUnknown) || + IsEqualIID(riid, &IID_IProfferService)) + { + *ppvObj = This; + } + else if (IsEqualIID(riid, &IID_IServiceProvider)) + { + *ppvObj = IServiceProviderImpl_Construct(); + add_call(&trace_got, 1, iface, &IID_IServiceProvider, 0, 0, 0); + return S_OK; + } + + if(*ppvObj) + { + IUnknown_AddRef(iface); + return S_OK; + } + + return E_NOINTERFACE; +} + +static ULONG WINAPI IProfferServiceImpl_AddRef(IProfferService *iface) +{ + IProfferServiceImpl *This = (IProfferServiceImpl *)iface; + return InterlockedIncrement(&This->ref); +} + +static ULONG WINAPI IProfferServiceImpl_Release(IProfferService *iface) +{ + IProfferServiceImpl *This = (IProfferServiceImpl *)iface; + ULONG ref = InterlockedDecrement(&This->ref); + + if (!ref) + { + HeapFree(GetProcessHeap(), 0, This); + return 0; + } + return ref; +} + +static HRESULT WINAPI IProfferServiceImpl_ProfferService(IProfferService *iface, + REFGUID service, IServiceProvider *pService, DWORD *pCookie) +{ + add_call(&trace_got, 3, service, pService, pCookie, 0, 0); + return S_OK; +} + +static HRESULT WINAPI IProfferServiceImpl_RevokeService(IProfferService *iface, DWORD cookie) +{ + add_call(&trace_got, 4, (void*)(DWORD_PTR)cookie, 0, 0, 0, 0); + return S_OK; +} + +static const IProfferServiceVtbl IProfferServiceImpl_Vtbl = +{ + IProfferServiceImpl_QueryInterface, + IProfferServiceImpl_AddRef, + IProfferServiceImpl_Release, + IProfferServiceImpl_ProfferService, + IProfferServiceImpl_RevokeService +}; + +static void test_IUnknown_ProfferService(void) +{ + IServiceProvider *provider = IServiceProviderImpl_Construct(); + IProfferService *proff = IProfferServiceImpl_Construct(); + static const GUID dummy_serviceid = { 0xdeadbeef }; + call_trace_t trace_expected; + HRESULT hr; + DWORD cookie; + + /* on <=W2K platforms same ordinal used for another export with different + prototype, so skipping using this indirect condition */ + if (is_win2k_and_lower) + { + win_skip("IUnknown_ProfferService is not available\n"); + return; + } + + /* null source pointer */ + hr = pIUnknown_ProfferService(NULL, &dummy_serviceid, 0, 0); + ok(hr == E_FAIL, "got 0x%08x\n", hr); + + /* expected trace: + IUnknown_ProfferService( ptr1, serviceid, arg1, arg2); + -> IUnknown_QueryInterface( ptr1, &IID_IServiceProvider, &provider ); + -> IServiceProvider_QueryService( provider, &IID_IProfferService, &IID_IProfferService, &proffer ); + + if (service pointer not null): + -> IProfferService_ProfferService( proffer, serviceid, arg1, arg2 ); + else + -> IProfferService_RevokeService( proffer, *arg2 ); + */ + init_call_trace(&trace_expected); + + add_call(&trace_expected, 1, proff, &IID_IServiceProvider, 0, 0, 0); + add_call(&trace_expected, 2, &IID_IProfferService, &IID_IProfferService, 0, 0, 0); + add_call(&trace_expected, 3, &dummy_serviceid, provider, &cookie, 0, 0); + + init_call_trace(&trace_got); + hr = pIUnknown_ProfferService((IUnknown*)proff, &dummy_serviceid, provider, &cookie); + ok(hr == S_OK, "got 0x%08x\n", hr); + + ok_trace(&trace_expected, &trace_got); + free_call_trace(&trace_got); + free_call_trace(&trace_expected); + + /* same with ::Revoke path */ + init_call_trace(&trace_expected); + + add_call(&trace_expected, 1, proff, &IID_IServiceProvider, 0, 0, 0); + add_call(&trace_expected, 2, &IID_IProfferService, &IID_IProfferService, 0, 0, 0); + add_call(&trace_expected, 4, (void*)(DWORD_PTR)cookie, 0, 0, 0, 0); + + init_call_trace(&trace_got); + hr = pIUnknown_ProfferService((IUnknown*)proff, &dummy_serviceid, 0, &cookie); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok_trace(&trace_expected, &trace_got); + free_call_trace(&trace_got); + free_call_trace(&trace_expected); + + IServiceProvider_Release(provider); + IProfferService_Release(proff); +} + +static void test_SHCreateWorkerWindowA(void) +{ + WNDCLASSA cliA; + char classA[20]; + HWND hwnd; + LONG_PTR ret; + BOOL res; + + if (is_win2k_and_lower) + { + win_skip("SHCreateWorkerWindowA not available\n"); + return; + } + + hwnd = pSHCreateWorkerWindowA(0, NULL, 0, 0, 0, 0); + ok(hwnd != 0, "expected window\n"); + + GetClassName(hwnd, classA, 20); + ok(lstrcmpA(classA, "WorkerA") == 0, "expected WorkerA class, got %s\n", classA); + + ret = GetWindowLongPtrA(hwnd, 0); + ok(ret == 0, "got %ld\n", ret); + + /* class info */ + memset(&cliA, 0, sizeof(cliA)); + res = GetClassInfoA(GetModuleHandle("shlwapi.dll"), "WorkerA", &cliA); + ok(res, "failed to get class info\n"); + ok(cliA.style == 0, "got 0x%08x\n", cliA.style); + ok(cliA.cbClsExtra == 0, "got %d\n", cliA.cbClsExtra); + ok(cliA.cbWndExtra == sizeof(LONG_PTR), "got %d\n", cliA.cbWndExtra); + ok(cliA.lpszMenuName == 0, "got %s\n", cliA.lpszMenuName); + + DestroyWindow(hwnd); + + /* set extra bytes */ + hwnd = pSHCreateWorkerWindowA(0, NULL, 0, 0, 0, 0xdeadbeef); + ok(hwnd != 0, "expected window\n"); + + GetClassName(hwnd, classA, 20); + ok(lstrcmpA(classA, "WorkerA") == 0, "expected WorkerA class, got %s\n", classA); + + ret = GetWindowLongPtrA(hwnd, 0); + ok(ret == 0xdeadbeef, "got %ld\n", ret); + + /* test exstyle */ + ret = GetWindowLongA(hwnd, GWL_EXSTYLE); + ok(ret == WS_EX_WINDOWEDGE, "0x%08lx\n", ret); + + DestroyWindow(hwnd); + + hwnd = pSHCreateWorkerWindowA(0, NULL, WS_EX_TOOLWINDOW, 0, 0, 0); + ret = GetWindowLongA(hwnd, GWL_EXSTYLE); + ok(ret == (WS_EX_WINDOWEDGE|WS_EX_TOOLWINDOW), "0x%08lx\n", ret); + DestroyWindow(hwnd); +} + +static void init_pointers(void) +{ +#define MAKEFUNC(f, ord) (p##f = (void*)GetProcAddress(hShlwapi, (LPSTR)(ord))) + MAKEFUNC(SHAllocShared, 7); + MAKEFUNC(SHLockShared, 8); + MAKEFUNC(SHUnlockShared, 9); + MAKEFUNC(SHFreeShared, 10); + MAKEFUNC(GetAcceptLanguagesA, 14); + MAKEFUNC(SHSetWindowBits, 165); + MAKEFUNC(ConnectToConnectionPoint, 168); + MAKEFUNC(SHSearchMapInt, 198); + MAKEFUNC(SHCreateWorkerWindowA, 257); + MAKEFUNC(GUIDFromStringA, 269); + MAKEFUNC(SHPackDispParams, 282); + MAKEFUNC(IConnectionPoint_InvokeWithCancel, 283); + MAKEFUNC(IConnectionPoint_SimpleInvoke, 284); + MAKEFUNC(SHFormatDateTimeA, 353); + MAKEFUNC(SHFormatDateTimeW, 354); + MAKEFUNC(SHGetObjectCompatFlags, 476); + MAKEFUNC(IUnknown_QueryServiceExec, 484); + MAKEFUNC(SHPropertyBag_ReadLONG, 496); + MAKEFUNC(IUnknown_ProfferService, 514); +#undef MAKEFUNC +} + START_TEST(ordinal) { - hShlwapi = GetModuleHandleA("shlwapi.dll"); + hShlwapi = GetModuleHandleA("shlwapi.dll"); + is_win2k_and_lower = GetProcAddress(hShlwapi, "StrChrNW") == 0; - pGetAcceptLanguagesA = (void*)GetProcAddress(hShlwapi, (LPSTR)14); - pSHSearchMapInt = (void*)GetProcAddress(hShlwapi, (LPSTR)198); - pSHAllocShared=(void*)GetProcAddress(hShlwapi,(char*)7); - pSHLockShared=(void*)GetProcAddress(hShlwapi,(char*)8); - pSHUnlockShared=(void*)GetProcAddress(hShlwapi,(char*)9); - pSHFreeShared=(void*)GetProcAddress(hShlwapi,(char*)10); - pSHPackDispParams=(void*)GetProcAddress(hShlwapi,(char*)282); - pIConnectionPoint_SimpleInvoke=(void*)GetProcAddress(hShlwapi,(char*)284); - pIConnectionPoint_InvokeWithCancel=(void*)GetProcAddress(hShlwapi,(char*)283); - pConnectToConnectionPoint=(void*)GetProcAddress(hShlwapi,(char*)168); - pSHPropertyBag_ReadLONG=(void*)GetProcAddress(hShlwapi,(char*)496); + init_pointers(); - hmlang = LoadLibraryA("mlang.dll"); - pLcidToRfc1766A = (void *)GetProcAddress(hmlang, "LcidToRfc1766A"); + hmlang = LoadLibraryA("mlang.dll"); + pLcidToRfc1766A = (void *)GetProcAddress(hmlang, "LcidToRfc1766A"); - test_GetAcceptLanguagesA(); - test_SHSearchMapInt(); - test_alloc_shared(); - test_fdsa(); - test_GetShellSecurityDescriptor(); - test_SHPackDispParams(); - test_IConnectionPoint(); - test_SHPropertyBag_ReadLONG(); + test_GetAcceptLanguagesA(); + test_SHSearchMapInt(); + test_alloc_shared(); + test_fdsa(); + test_GetShellSecurityDescriptor(); + test_SHPackDispParams(); + test_IConnectionPoint(); + test_SHPropertyBag_ReadLONG(); + test_SHSetWindowBits(); + test_SHFormatDateTimeA(); + test_SHFormatDateTimeW(); + test_SHGetObjectCompatFlags(); + test_IUnknown_QueryServiceExec(); + test_IUnknown_ProfferService(); + test_SHCreateWorkerWindowA(); } diff --git a/rostests/winetests/shlwapi/path.c b/rostests/winetests/shlwapi/path.c index e52502fdf58..3e83a4556c6 100755 --- a/rostests/winetests/shlwapi/path.c +++ b/rostests/winetests/shlwapi/path.c @@ -28,12 +28,12 @@ #include "shlwapi.h" #include "wininet.h" -static HMODULE hShlwapi; static HRESULT (WINAPI *pPathIsValidCharA)(char,DWORD); static HRESULT (WINAPI *pPathIsValidCharW)(WCHAR,DWORD); static LPWSTR (WINAPI *pPathCombineW)(LPWSTR, LPCWSTR, LPCWSTR); static HRESULT (WINAPI *pPathCreateFromUrlA)(LPCSTR, LPSTR, LPDWORD, DWORD); static HRESULT (WINAPI *pPathCreateFromUrlW)(LPCWSTR, LPWSTR, LPDWORD, DWORD); +static BOOL (WINAPI *pPathAppendA)(LPSTR, LPCSTR); /* ################ */ @@ -300,6 +300,15 @@ static void test_PathIsValidCharA(void) BOOL ret; unsigned int c; + /* For whatever reason, PathIsValidCharA and PathAppendA share the same + * ordinal number in some native versions. Check this to prevent a crash. + */ + if (!pPathIsValidCharA || pPathIsValidCharA == (void*)pPathAppendA) + { + win_skip("PathIsValidCharA isn't available\n"); + return; + } + for (c = 0; c < 0x7f; c++) { ret = pPathIsValidCharA( c, ~0U ); @@ -318,6 +327,12 @@ static void test_PathIsValidCharW(void) BOOL ret; unsigned int c; + if (!pPathIsValidCharW) + { + win_skip("PathIsValidCharW isn't available\n"); + return; + } + for (c = 0; c < 0x7f; c++) { ret = pPathIsValidCharW( c, ~0U ); @@ -392,7 +407,13 @@ static void test_PathCombineW(void) WCHAR wbuf[MAX_PATH+1], wstr1[MAX_PATH] = {'C',':','\\',0}, wstr2[MAX_PATH]; static const WCHAR expout[] = {'C',':','\\','A','A',0}; int i; - + + if (!pPathCombineW) + { + win_skip("PathCombineW isn't available\n"); + return; + } + wszString2 = HeapAlloc(GetProcessHeap(), 0, MAX_PATH * sizeof(WCHAR)); /* NULL test */ @@ -1312,43 +1333,60 @@ static void test_PathUnquoteSpaces(void) } } +static void test_PathGetDriveNumber(void) +{ + static const CHAR test1A[] = "a:\\test.file"; + static const CHAR test2A[] = "file:////b:\\test.file"; + static const CHAR test3A[] = "file:///c:\\test.file"; + static const CHAR test4A[] = "file:\\\\c:\\test.file"; + int ret; + + SetLastError(0xdeadbeef); + ret = PathGetDriveNumberA(NULL); + ok(ret == -1, "got %d\n", ret); + ok(GetLastError() == 0xdeadbeef, "got %d\n", GetLastError()); + + ret = PathGetDriveNumberA(test1A); + ok(ret == 0, "got %d\n", ret); + ret = PathGetDriveNumberA(test2A); + ok(ret == -1, "got %d\n", ret); + ret = PathGetDriveNumberA(test3A); + ok(ret == -1, "got %d\n", ret); + ret = PathGetDriveNumberA(test4A); + ok(ret == -1, "got %d\n", ret); +} + /* ################ */ START_TEST(path) { - hShlwapi = GetModuleHandleA("shlwapi.dll"); - pPathCreateFromUrlA = (void*)GetProcAddress(hShlwapi, "PathCreateFromUrlA"); - pPathCreateFromUrlW = (void*)GetProcAddress(hShlwapi, "PathCreateFromUrlW"); + HMODULE hShlwapi = GetModuleHandleA("shlwapi.dll"); - test_PathSearchAndQualify(); - test_PathCreateFromUrl(); - test_PathIsUrl(); + pPathCreateFromUrlA = (void*)GetProcAddress(hShlwapi, "PathCreateFromUrlA"); + pPathCreateFromUrlW = (void*)GetProcAddress(hShlwapi, "PathCreateFromUrlW"); + pPathCombineW = (void*)GetProcAddress(hShlwapi, "PathCombineW"); + pPathIsValidCharA = (void*)GetProcAddress(hShlwapi, (LPSTR)455); + pPathIsValidCharW = (void*)GetProcAddress(hShlwapi, (LPSTR)456); + pPathAppendA = (void*)GetProcAddress(hShlwapi, "PathAppendA"); - test_PathAddBackslash(); - test_PathMakePretty(); - test_PathMatchSpec(); + test_PathSearchAndQualify(); + test_PathCreateFromUrl(); + test_PathIsUrl(); + + test_PathAddBackslash(); + test_PathMakePretty(); + test_PathMatchSpec(); - /* For whatever reason, PathIsValidCharA and PathAppendA share the same - * ordinal number in some native versions. Check this to prevent a crash. - */ - pPathIsValidCharA = (void*)GetProcAddress(hShlwapi, (LPSTR)455); - if (pPathIsValidCharA && pPathIsValidCharA != (void*)GetProcAddress(hShlwapi, "PathAppendA")) - { test_PathIsValidCharA(); + test_PathIsValidCharW(); - pPathIsValidCharW = (void*)GetProcAddress(hShlwapi, (LPSTR)456); - if (pPathIsValidCharW) test_PathIsValidCharW(); - } - - pPathCombineW = (void*)GetProcAddress(hShlwapi, "PathCombineW"); - if (pPathCombineW) test_PathCombineW(); - - test_PathCombineA(); - test_PathAppendA(); - test_PathCanonicalizeA(); - test_PathFindExtensionA(); - test_PathBuildRootA(); - test_PathCommonPrefixA(); - test_PathUnquoteSpaces(); + test_PathCombineA(); + test_PathAppendA(); + test_PathCanonicalizeA(); + test_PathFindExtensionA(); + test_PathBuildRootA(); + test_PathCommonPrefixA(); + test_PathUnquoteSpaces(); + test_PathGetDriveNumber(); } diff --git a/rostests/winetests/shlwapi/shlwapi.rbuild b/rostests/winetests/shlwapi/shlwapi.rbuild index cd5cffd19a3..0fe700994c5 100644 --- a/rostests/winetests/shlwapi/shlwapi.rbuild +++ b/rostests/winetests/shlwapi/shlwapi.rbuild @@ -3,7 +3,7 @@ . - + assoc.c clist.c clsid.c @@ -21,6 +21,7 @@ advapi32 ole32 oleaut32 + user32 ntdll diff --git a/rostests/winetests/shlwapi/string.c b/rostests/winetests/shlwapi/string.c index 00f0b023046..17c652de411 100755 --- a/rostests/winetests/shlwapi/string.c +++ b/rostests/winetests/shlwapi/string.c @@ -863,6 +863,33 @@ static void test_StrXXX_overflows(void) else win_skip("StrCatBuffA() is not available\n"); +if (0) +{ + /* crashes on XP */ + StrCpyNW(wbuf, (LPCWSTR)0x1, 10); + StrCpyNW((LPWSTR)0x1, wstr1, 10); +} + + memset(wbuf, 0xbf, sizeof(wbuf)); + expect_eq(StrCpyNW(wbuf, (LPCWSTR)0x1, 1), wbuf, PWCHAR, "%p"); + expect_eq(wbuf[0], 0, WCHAR, "%x"); + expect_eq(wbuf[1], (WCHAR)0xbfbf, WCHAR, "%x"); + + memset(wbuf, 0xbf, sizeof(wbuf)); + expect_eq(StrCpyNW(wbuf, 0, 10), wbuf, PWCHAR, "%p"); + expect_eq(wbuf[0], 0, WCHAR, "%x"); + expect_eq(wbuf[1], (WCHAR)0xbfbf, WCHAR, "%x"); + + memset(wbuf, 0xbf, sizeof(wbuf)); + expect_eq(StrCpyNW(wbuf, 0, 0), wbuf, PWCHAR, "%p"); + expect_eq(wbuf[0], (WCHAR)0xbfbf, WCHAR, "%x"); + expect_eq(wbuf[1], (WCHAR)0xbfbf, WCHAR, "%x"); + + memset(wbuf, 0xbf, sizeof(wbuf)); + expect_eq(StrCpyNW(wbuf, wstr1, 0), wbuf, PWCHAR, "%p"); + expect_eq(wbuf[0], (WCHAR)0xbfbf, WCHAR, "%x"); + expect_eq(wbuf[1], (WCHAR)0xbfbf, WCHAR, "%x"); + memset(wbuf, 0xbf, sizeof(wbuf)); expect_eq(StrCpyNW(wbuf, wstr1, 10), wbuf, PWCHAR, "%p"); expect_eq(wbuf[9], 0, WCHAR, "%x"); diff --git a/rostests/winetests/shlwapi/url.c b/rostests/winetests/shlwapi/url.c index 3d86ae7c5e1..0dd96431811 100644 --- a/rostests/winetests/shlwapi/url.c +++ b/rostests/winetests/shlwapi/url.c @@ -160,6 +160,7 @@ static const TEST_URL_CANONICALIZE TEST_CANONICALIZE[] = { {"A", 0, S_OK, "A", FALSE}, {"/uri-res/N2R?urn:sha1:B3K", URL_DONT_ESCAPE_EXTRA_INFO | URL_WININET_COMPATIBILITY /*0x82000000*/, S_OK, "/uri-res/N2R?urn:sha1:B3K", FALSE} /*LimeWire online installer calls this*/, {"http:www.winehq.org/dir/../index.html", 0, S_OK, "http:www.winehq.org/index.html"}, + {"http://localhost/test.html", URL_FILE_USE_PATHURL, S_OK, "http://localhost/test.html"} }; /* ################ */ @@ -278,6 +279,11 @@ static const TEST_URL_COMBINE TEST_COMBINE[] = { {"http://www.winehq.org/tests/../tests/", "/tests10/..", URL_DONT_SIMPLIFY, S_OK, "http://www.winehq.org/tests10/.."}, {"http://www.winehq.org/tests/../", "tests11", URL_DONT_SIMPLIFY, S_OK, "http://www.winehq.org/tests/../tests11"}, {"file:///C:\\dir\\file.txt", "test.txt", 0, S_OK, "file:///C:/dir/test.txt"}, + {"file:///C:\\dir\\file.txt#hash\\hash", "test.txt", 0, S_OK, "file:///C:/dir/file.txt#hash/test.txt"}, + {"file:///C:\\dir\\file.html#hash\\hash", "test.html", 0, S_OK, "file:///C:/dir/test.html"}, + {"file:///C:\\dir\\file.htm#hash\\hash", "test.htm", 0, S_OK, "file:///C:/dir/test.htm"}, + {"file:///C:\\dir\\file.hTmL#hash\\hash", "test.hTmL", 0, S_OK, "file:///C:/dir/test.hTmL"}, + {"file:///C:\\dir.html\\file.txt#hash\\hash", "test.txt", 0, S_OK, "file:///C:/dir.html/file.txt#hash/test.txt"}, {"C:\\winehq\\winehq.txt", "C:\\Test\\test.txt", 0, S_OK, "file:///C:/Test/test.txt"}, {"http://www.winehq.org/test/", "test%20file.txt", 0, S_OK, "http://www.winehq.org/test/test%20file.txt"}, {"http://www.winehq.org/test/", "test%20file.txt", URL_FILE_USE_PATHURL, S_OK, "http://www.winehq.org/test/test%20file.txt"}, @@ -537,6 +543,13 @@ static void test_url_part(const char* szUrl, DWORD dwPart, DWORD dwFlags, const HRESULT res; DWORD dwSize; + dwSize = 1; + res = pUrlGetPartA(szUrl, szPart, &dwSize, dwPart, dwFlags); + ok(res == E_POINTER, "UrlGetPart for \"%s\" gave: 0x%08x\n", szUrl, res); + ok(dwSize == strlen(szExpected)+1 || + (*szExpected == '?' && dwSize == strlen(szExpected)), + "UrlGetPart for \"%s\" gave size: %u\n", szUrl, dwSize); + dwSize = INTERNET_MAX_URL_LENGTH; res = pUrlGetPartA(szUrl, szPart, &dwSize, dwPart, dwFlags); ok(res == S_OK, @@ -570,6 +583,7 @@ static void test_UrlGetPart(void) { const char* file_url = "file://h o s t/c:/windows/file"; const char* http_url = "http://user:pass 123@www.wine hq.org"; + const char* res_url = "res://some.dll/find.dlg"; const char* about_url = "about:blank"; CHAR szPart[INTERNET_MAX_URL_LENGTH]; @@ -581,20 +595,38 @@ static void test_UrlGetPart(void) return; } + res = pUrlGetPartA(NULL, NULL, NULL, URL_PART_SCHEME, 0); + ok(res == E_INVALIDARG, "null params gave: 0x%08x\n", res); + + res = pUrlGetPartA(NULL, szPart, &dwSize, URL_PART_SCHEME, 0); + ok(res == E_INVALIDARG, "null URL gave: 0x%08x\n", res); + + res = pUrlGetPartA(res_url, NULL, &dwSize, URL_PART_SCHEME, 0); + ok(res == E_INVALIDARG, "null szPart gave: 0x%08x\n", res); + + res = pUrlGetPartA(res_url, szPart, NULL, URL_PART_SCHEME, 0); + ok(res == E_INVALIDARG, "null URL gave: 0x%08x\n", res); + + dwSize = 0; + szPart[0]='x'; szPart[1]=0; + res = pUrlGetPartA("hi", szPart, &dwSize, URL_PART_SCHEME, 0); + ok(res == E_INVALIDARG, "UrlGetPartA(*pcchOut = 0) returned %08X\n", res); + ok(szPart[0] == 'x' && szPart[1] == 0, "UrlGetPartA(*pcchOut = 0) modified szPart: \"%s\"\n", szPart); + ok(dwSize == 0, "dwSize = %d\n", dwSize); + dwSize = sizeof szPart; szPart[0]='x'; szPart[1]=0; res = pUrlGetPartA("hi", szPart, &dwSize, URL_PART_SCHEME, 0); - todo_wine { ok (res==S_FALSE, "UrlGetPartA(\"hi\") returned %08X\n", res); ok(szPart[0]==0, "UrlGetPartA(\"hi\") return \"%s\" instead of \"\"\n", szPart); - } + ok(dwSize == 0, "dwSize = %d\n", dwSize); + dwSize = sizeof szPart; szPart[0]='x'; szPart[1]=0; res = pUrlGetPartA("hi", szPart, &dwSize, URL_PART_QUERY, 0); - todo_wine { ok (res==S_FALSE, "UrlGetPartA(\"hi\") returned %08X\n", res); ok(szPart[0]==0, "UrlGetPartA(\"hi\") return \"%s\" instead of \"\"\n", szPart); - } + ok(dwSize == 0, "dwSize = %d\n", dwSize); test_url_part(TEST_URL_3, URL_PART_HOSTNAME, 0, "localhost"); test_url_part(TEST_URL_3, URL_PART_PORT, 0, "21"); @@ -614,9 +646,20 @@ static void test_UrlGetPart(void) res = pUrlGetPartA(about_url, szPart, &dwSize, URL_PART_HOSTNAME, 0); ok(res==E_FAIL, "returned %08x\n", res); + test_url_part(res_url, URL_PART_SCHEME, 0, "res"); + test_url_part("http://www.winehq.org", URL_PART_HOSTNAME, URL_PARTFLAG_KEEPSCHEME, "http:www.winehq.org"); + + dwSize = sizeof szPart; + szPart[0]='x'; szPart[1]=0; + res = pUrlGetPartA(res_url, szPart, &dwSize, URL_PART_QUERY, 0); + ok(res==S_FALSE, "UrlGetPartA returned %08X\n", res); + ok(szPart[0]==0, "UrlGetPartA gave \"%s\" instead of \"\"\n", szPart); + ok(dwSize == 0, "dwSize = %d\n", dwSize); + dwSize = sizeof(szPart); res = pUrlGetPartA("file://c:\\index.htm", szPart, &dwSize, URL_PART_HOSTNAME, 0); ok(res==S_FALSE, "returned %08x\n", res); + ok(dwSize == 0, "dwSize = %d\n", dwSize); dwSize = sizeof(szPart); szPart[0] = 'x'; szPart[1] = '\0'; @@ -624,6 +667,11 @@ static void test_UrlGetPart(void) ok(res==S_FALSE, "returned %08x\n", res); ok(szPart[0] == '\0', "szPart[0] = %c\n", szPart[0]); ok(dwSize == 0, "dwSize = %d\n", dwSize); + + dwSize = sizeof(szPart); + szPart[0] = 'x'; szPart[1] = '\0'; + res = pUrlGetPartA("index.htm", szPart, &dwSize, URL_PART_HOSTNAME, 0); + ok(res==E_FAIL, "returned %08x\n", res); } /* ########################### */ @@ -1000,6 +1048,15 @@ static void test_UrlCreateFromPath(void) /* ########################### */ +static void test_UrlIs_null(DWORD flag) +{ + BOOL ret; + ret = pUrlIsA(NULL, flag); + ok(ret == FALSE, "pUrlIsA(NULL, %d) failed\n", flag); + ret = pUrlIsW(NULL, flag); + ok(ret == FALSE, "pUrlIsW(NULL, %d) failed\n", flag); +} + static void test_UrlIs(void) { BOOL ret; @@ -1011,6 +1068,14 @@ static void test_UrlIs(void) return; } + test_UrlIs_null(URLIS_APPLIABLE); + test_UrlIs_null(URLIS_DIRECTORY); + test_UrlIs_null(URLIS_FILEURL); + test_UrlIs_null(URLIS_HASQUERY); + test_UrlIs_null(URLIS_NOHISTORY); + test_UrlIs_null(URLIS_OPAQUE); + test_UrlIs_null(URLIS_URL); + for(i = 0; i < sizeof(TEST_PATH_IS_URL) / sizeof(TEST_PATH_IS_URL[0]); i++) { MultiByteToWideChar(CP_ACP, 0, TEST_PATH_IS_URL[i].path, -1, wurl, 80); diff --git a/rostests/winetests/urlmon/generated.c b/rostests/winetests/urlmon/generated.c index 8a2f353b043..63e892bc543 100644 --- a/rostests/winetests/urlmon/generated.c +++ b/rostests/winetests/urlmon/generated.c @@ -54,45 +54,289 @@ * Test helper macros */ -#ifdef _WIN64 +#define TEST_TYPE_SIZE(type, size) C_ASSERT(sizeof(type) == size); -# define TEST_TYPE_SIZE(type, size) +#ifdef TYPE_ALIGNMENT +# define TEST_TYPE_ALIGN(type, align) C_ASSERT(TYPE_ALIGNMENT(type) == align); +#else # define TEST_TYPE_ALIGN(type, align) +#endif + +#ifdef _TYPE_ALIGNMENT +# define TEST_TARGET_ALIGN(type, align) C_ASSERT(_TYPE_ALIGNMENT(*(type)0) == align); +# define TEST_FIELD_ALIGN(type, field, align) C_ASSERT(_TYPE_ALIGNMENT(((type*)0)->field) == align); +#else # define TEST_TARGET_ALIGN(type, align) # define TEST_FIELD_ALIGN(type, field, align) -# define TEST_FIELD_OFFSET(type, field, offset) - -#else - -# define TEST_TYPE_SIZE(type, size) C_ASSERT(sizeof(type) == size); - -# ifdef TYPE_ALIGNMENT -# define TEST_TYPE_ALIGN(type, align) C_ASSERT(TYPE_ALIGNMENT(type) == align); -# else -# define TEST_TYPE_ALIGN(type, align) -# endif - -# ifdef _TYPE_ALIGNMENT -# define TEST_TARGET_ALIGN(type, align) C_ASSERT(_TYPE_ALIGNMENT(*(type)0) == align); -# define TEST_FIELD_ALIGN(type, field, align) C_ASSERT(_TYPE_ALIGNMENT(((type*)0)->field) == align); -# else -# define TEST_TARGET_ALIGN(type, align) -# define TEST_FIELD_ALIGN(type, field, align) -# endif - -# define TEST_FIELD_OFFSET(type, field, offset) C_ASSERT(FIELD_OFFSET(type, field) == offset); - #endif +#define TEST_FIELD_OFFSET(type, field, offset) C_ASSERT(FIELD_OFFSET(type, field) == offset); + #define TEST_TARGET_SIZE(type, size) TEST_TYPE_SIZE(*(type)0, size) #define TEST_FIELD_SIZE(type, field, size) TEST_TYPE_SIZE((((type*)0)->field), size) #define TEST_TYPE_SIGNED(type) C_ASSERT((type) -1 < 0); #define TEST_TYPE_UNSIGNED(type) C_ASSERT((type) -1 > 0); +#ifdef _WIN64 + static void test_pack_BINDINFO(void) { - /* BINDINFO (pack 4) */ + /* BINDINFO */ + TEST_FIELD_SIZE (BINDINFO, cbSize, 4) + TEST_FIELD_ALIGN (BINDINFO, cbSize, 4) + TEST_FIELD_OFFSET(BINDINFO, cbSize, 0) + TEST_FIELD_SIZE (BINDINFO, szExtraInfo, 8) + TEST_FIELD_ALIGN (BINDINFO, szExtraInfo, 8) + TEST_FIELD_OFFSET(BINDINFO, szExtraInfo, 8) +} + +static void test_pack_IBindHost(void) +{ + /* IBindHost */ +} + +static void test_pack_IBindHostVtbl(void) +{ + /* IBindHostVtbl */ +} + +static void test_pack_IBindStatusCallback(void) +{ + /* IBindStatusCallback */ +} + +static void test_pack_IBindStatusCallbackVtbl(void) +{ + /* IBindStatusCallbackVtbl */ +} + +static void test_pack_IBinding(void) +{ + /* IBinding */ +} + +static void test_pack_IBindingVtbl(void) +{ + /* IBindingVtbl */ +} + +static void test_pack_IInternetProtocolInfo(void) +{ + /* IInternetProtocolInfo */ +} + +static void test_pack_IInternetProtocolInfoVtbl(void) +{ + /* IInternetProtocolInfoVtbl */ +} + +static void test_pack_IInternetSession(void) +{ + /* IInternetSession */ +} + +static void test_pack_IInternetSessionVtbl(void) +{ + /* IInternetSessionVtbl */ +} + +static void test_pack_IPersistMoniker(void) +{ + /* IPersistMoniker */ +} + +static void test_pack_IPersistMonikerVtbl(void) +{ + /* IPersistMonikerVtbl */ +} + +static void test_pack_IWinInetHttpInfo(void) +{ + /* IWinInetHttpInfo */ +} + +static void test_pack_IWinInetHttpInfoVtbl(void) +{ + /* IWinInetHttpInfoVtbl */ +} + +static void test_pack_IWinInetInfo(void) +{ + /* IWinInetInfo */ +} + +static void test_pack_IWinInetInfoVtbl(void) +{ + /* IWinInetInfoVtbl */ +} + +static void test_pack_LPBINDHOST(void) +{ + /* LPBINDHOST */ + TEST_TYPE_SIZE (LPBINDHOST, 8) + TEST_TYPE_ALIGN (LPBINDHOST, 8) +} + +static void test_pack_LPBINDING(void) +{ + /* LPBINDING */ + TEST_TYPE_SIZE (LPBINDING, 8) + TEST_TYPE_ALIGN (LPBINDING, 8) +} + +static void test_pack_LPBINDSTATUSCALLBACK(void) +{ + /* LPBINDSTATUSCALLBACK */ + TEST_TYPE_SIZE (LPBINDSTATUSCALLBACK, 8) + TEST_TYPE_ALIGN (LPBINDSTATUSCALLBACK, 8) +} + +static void test_pack_LPIINTERNETPROTOCOLINFO(void) +{ + /* LPIINTERNETPROTOCOLINFO */ + TEST_TYPE_SIZE (LPIINTERNETPROTOCOLINFO, 8) + TEST_TYPE_ALIGN (LPIINTERNETPROTOCOLINFO, 8) +} + +static void test_pack_LPIINTERNETSESSION(void) +{ + /* LPIINTERNETSESSION */ + TEST_TYPE_SIZE (LPIINTERNETSESSION, 8) + TEST_TYPE_ALIGN (LPIINTERNETSESSION, 8) +} + +static void test_pack_LPPERSISTMONIKER(void) +{ + /* LPPERSISTMONIKER */ + TEST_TYPE_SIZE (LPPERSISTMONIKER, 8) + TEST_TYPE_ALIGN (LPPERSISTMONIKER, 8) +} + +static void test_pack_LPREMFORMATETC(void) +{ + /* LPREMFORMATETC */ + TEST_TYPE_SIZE (LPREMFORMATETC, 8) + TEST_TYPE_ALIGN (LPREMFORMATETC, 8) +} + +static void test_pack_LPREMSECURITY_ATTRIBUTES(void) +{ + /* LPREMSECURITY_ATTRIBUTES */ + TEST_TYPE_SIZE (LPREMSECURITY_ATTRIBUTES, 8) + TEST_TYPE_ALIGN (LPREMSECURITY_ATTRIBUTES, 8) +} + +static void test_pack_LPWININETHTTPINFO(void) +{ + /* LPWININETHTTPINFO */ + TEST_TYPE_SIZE (LPWININETHTTPINFO, 8) + TEST_TYPE_ALIGN (LPWININETHTTPINFO, 8) +} + +static void test_pack_LPWININETINFO(void) +{ + /* LPWININETINFO */ + TEST_TYPE_SIZE (LPWININETINFO, 8) + TEST_TYPE_ALIGN (LPWININETINFO, 8) +} + +static void test_pack_PREMSECURITY_ATTRIBUTES(void) +{ + /* PREMSECURITY_ATTRIBUTES */ + TEST_TYPE_SIZE (PREMSECURITY_ATTRIBUTES, 8) + TEST_TYPE_ALIGN (PREMSECURITY_ATTRIBUTES, 8) +} + +static void test_pack_REMSECURITY_ATTRIBUTES(void) +{ + /* REMSECURITY_ATTRIBUTES */ + TEST_TYPE_SIZE (REMSECURITY_ATTRIBUTES, 12) + TEST_TYPE_ALIGN (REMSECURITY_ATTRIBUTES, 4) + TEST_FIELD_SIZE (REMSECURITY_ATTRIBUTES, nLength, 4) + TEST_FIELD_ALIGN (REMSECURITY_ATTRIBUTES, nLength, 4) + TEST_FIELD_OFFSET(REMSECURITY_ATTRIBUTES, nLength, 0) + TEST_FIELD_SIZE (REMSECURITY_ATTRIBUTES, lpSecurityDescriptor, 4) + TEST_FIELD_ALIGN (REMSECURITY_ATTRIBUTES, lpSecurityDescriptor, 4) + TEST_FIELD_OFFSET(REMSECURITY_ATTRIBUTES, lpSecurityDescriptor, 4) + TEST_FIELD_SIZE (REMSECURITY_ATTRIBUTES, bInheritHandle, 4) + TEST_FIELD_ALIGN (REMSECURITY_ATTRIBUTES, bInheritHandle, 4) + TEST_FIELD_OFFSET(REMSECURITY_ATTRIBUTES, bInheritHandle, 8) +} + +static void test_pack_RemBINDINFO(void) +{ + /* RemBINDINFO */ + TEST_TYPE_SIZE (RemBINDINFO, 96) + TEST_TYPE_ALIGN (RemBINDINFO, 8) + TEST_FIELD_SIZE (RemBINDINFO, cbSize, 4) + TEST_FIELD_ALIGN (RemBINDINFO, cbSize, 4) + TEST_FIELD_OFFSET(RemBINDINFO, cbSize, 0) + TEST_FIELD_SIZE (RemBINDINFO, szExtraInfo, 8) + TEST_FIELD_ALIGN (RemBINDINFO, szExtraInfo, 8) + TEST_FIELD_OFFSET(RemBINDINFO, szExtraInfo, 8) + TEST_FIELD_SIZE (RemBINDINFO, grfBindInfoF, 4) + TEST_FIELD_ALIGN (RemBINDINFO, grfBindInfoF, 4) + TEST_FIELD_OFFSET(RemBINDINFO, grfBindInfoF, 16) + TEST_FIELD_SIZE (RemBINDINFO, dwBindVerb, 4) + TEST_FIELD_ALIGN (RemBINDINFO, dwBindVerb, 4) + TEST_FIELD_OFFSET(RemBINDINFO, dwBindVerb, 20) + TEST_FIELD_SIZE (RemBINDINFO, szCustomVerb, 8) + TEST_FIELD_ALIGN (RemBINDINFO, szCustomVerb, 8) + TEST_FIELD_OFFSET(RemBINDINFO, szCustomVerb, 24) + TEST_FIELD_SIZE (RemBINDINFO, cbstgmedData, 4) + TEST_FIELD_ALIGN (RemBINDINFO, cbstgmedData, 4) + TEST_FIELD_OFFSET(RemBINDINFO, cbstgmedData, 32) + TEST_FIELD_SIZE (RemBINDINFO, dwOptions, 4) + TEST_FIELD_ALIGN (RemBINDINFO, dwOptions, 4) + TEST_FIELD_OFFSET(RemBINDINFO, dwOptions, 36) + TEST_FIELD_SIZE (RemBINDINFO, dwOptionsFlags, 4) + TEST_FIELD_ALIGN (RemBINDINFO, dwOptionsFlags, 4) + TEST_FIELD_OFFSET(RemBINDINFO, dwOptionsFlags, 40) + TEST_FIELD_SIZE (RemBINDINFO, dwCodePage, 4) + TEST_FIELD_ALIGN (RemBINDINFO, dwCodePage, 4) + TEST_FIELD_OFFSET(RemBINDINFO, dwCodePage, 44) + TEST_FIELD_SIZE (RemBINDINFO, securityAttributes, 12) + TEST_FIELD_ALIGN (RemBINDINFO, securityAttributes, 4) + TEST_FIELD_OFFSET(RemBINDINFO, securityAttributes, 48) + TEST_FIELD_SIZE (RemBINDINFO, iid, 16) + TEST_FIELD_ALIGN (RemBINDINFO, iid, 4) + TEST_FIELD_OFFSET(RemBINDINFO, iid, 60) + TEST_FIELD_SIZE (RemBINDINFO, pUnk, 8) + TEST_FIELD_ALIGN (RemBINDINFO, pUnk, 8) + TEST_FIELD_OFFSET(RemBINDINFO, pUnk, 80) + TEST_FIELD_SIZE (RemBINDINFO, dwReserved, 4) + TEST_FIELD_ALIGN (RemBINDINFO, dwReserved, 4) + TEST_FIELD_OFFSET(RemBINDINFO, dwReserved, 88) +} + +static void test_pack_RemFORMATETC(void) +{ + /* RemFORMATETC */ + TEST_TYPE_SIZE (RemFORMATETC, 20) + TEST_TYPE_ALIGN (RemFORMATETC, 4) + TEST_FIELD_SIZE (RemFORMATETC, cfFormat, 4) + TEST_FIELD_ALIGN (RemFORMATETC, cfFormat, 4) + TEST_FIELD_OFFSET(RemFORMATETC, cfFormat, 0) + TEST_FIELD_SIZE (RemFORMATETC, ptd, 4) + TEST_FIELD_ALIGN (RemFORMATETC, ptd, 4) + TEST_FIELD_OFFSET(RemFORMATETC, ptd, 4) + TEST_FIELD_SIZE (RemFORMATETC, dwAspect, 4) + TEST_FIELD_ALIGN (RemFORMATETC, dwAspect, 4) + TEST_FIELD_OFFSET(RemFORMATETC, dwAspect, 8) + TEST_FIELD_SIZE (RemFORMATETC, lindex, 4) + TEST_FIELD_ALIGN (RemFORMATETC, lindex, 4) + TEST_FIELD_OFFSET(RemFORMATETC, lindex, 12) + TEST_FIELD_SIZE (RemFORMATETC, tymed, 4) + TEST_FIELD_ALIGN (RemFORMATETC, tymed, 4) + TEST_FIELD_OFFSET(RemFORMATETC, tymed, 16) +} + +#else /* _WIN64 */ + +static void test_pack_BINDINFO(void) +{ + /* BINDINFO */ TEST_FIELD_SIZE (BINDINFO, cbSize, 4) TEST_FIELD_ALIGN (BINDINFO, cbSize, 4) TEST_FIELD_OFFSET(BINDINFO, cbSize, 0) @@ -108,7 +352,7 @@ static void test_pack_IBindHost(void) static void test_pack_IBindHostVtbl(void) { - /* IBindHostVtbl (pack 4) */ + /* IBindHostVtbl */ } static void test_pack_IBindStatusCallback(void) @@ -118,7 +362,7 @@ static void test_pack_IBindStatusCallback(void) static void test_pack_IBindStatusCallbackVtbl(void) { - /* IBindStatusCallbackVtbl (pack 4) */ + /* IBindStatusCallbackVtbl */ } static void test_pack_IBinding(void) @@ -128,7 +372,7 @@ static void test_pack_IBinding(void) static void test_pack_IBindingVtbl(void) { - /* IBindingVtbl (pack 4) */ + /* IBindingVtbl */ } static void test_pack_IInternetProtocolInfo(void) @@ -138,7 +382,7 @@ static void test_pack_IInternetProtocolInfo(void) static void test_pack_IInternetProtocolInfoVtbl(void) { - /* IInternetProtocolInfoVtbl (pack 4) */ + /* IInternetProtocolInfoVtbl */ } static void test_pack_IInternetSession(void) @@ -148,7 +392,7 @@ static void test_pack_IInternetSession(void) static void test_pack_IInternetSessionVtbl(void) { - /* IInternetSessionVtbl (pack 4) */ + /* IInternetSessionVtbl */ } static void test_pack_IPersistMoniker(void) @@ -158,7 +402,7 @@ static void test_pack_IPersistMoniker(void) static void test_pack_IPersistMonikerVtbl(void) { - /* IPersistMonikerVtbl (pack 4) */ + /* IPersistMonikerVtbl */ } static void test_pack_IWinInetHttpInfo(void) @@ -168,7 +412,7 @@ static void test_pack_IWinInetHttpInfo(void) static void test_pack_IWinInetHttpInfoVtbl(void) { - /* IWinInetHttpInfoVtbl (pack 4) */ + /* IWinInetHttpInfoVtbl */ } static void test_pack_IWinInetInfo(void) @@ -178,7 +422,7 @@ static void test_pack_IWinInetInfo(void) static void test_pack_IWinInetInfoVtbl(void) { - /* IWinInetInfoVtbl (pack 4) */ + /* IWinInetInfoVtbl */ } static void test_pack_LPBINDHOST(void) @@ -260,7 +504,7 @@ static void test_pack_PREMSECURITY_ATTRIBUTES(void) static void test_pack_REMSECURITY_ATTRIBUTES(void) { - /* REMSECURITY_ATTRIBUTES (pack 4) */ + /* REMSECURITY_ATTRIBUTES */ TEST_TYPE_SIZE (REMSECURITY_ATTRIBUTES, 12) TEST_TYPE_ALIGN (REMSECURITY_ATTRIBUTES, 4) TEST_FIELD_SIZE (REMSECURITY_ATTRIBUTES, nLength, 4) @@ -276,7 +520,7 @@ static void test_pack_REMSECURITY_ATTRIBUTES(void) static void test_pack_RemBINDINFO(void) { - /* RemBINDINFO (pack 4) */ + /* RemBINDINFO */ TEST_TYPE_SIZE (RemBINDINFO, 72) TEST_TYPE_ALIGN (RemBINDINFO, 4) TEST_FIELD_SIZE (RemBINDINFO, cbSize, 4) @@ -322,7 +566,7 @@ static void test_pack_RemBINDINFO(void) static void test_pack_RemFORMATETC(void) { - /* RemFORMATETC (pack 4) */ + /* RemFORMATETC */ TEST_TYPE_SIZE (RemFORMATETC, 20) TEST_TYPE_ALIGN (RemFORMATETC, 4) TEST_FIELD_SIZE (RemFORMATETC, cfFormat, 4) @@ -342,6 +586,8 @@ static void test_pack_RemFORMATETC(void) TEST_FIELD_OFFSET(RemFORMATETC, tymed, 16) } +#endif /* _WIN64 */ + static void test_pack(void) { test_pack_BINDINFO(); @@ -379,9 +625,5 @@ static void test_pack(void) START_TEST(generated) { -#ifdef _WIN64 - ok(0, "The type size / alignment tests don't support Win64 yet\n"); -#else test_pack(); -#endif } diff --git a/rostests/winetests/urlmon/misc.c b/rostests/winetests/urlmon/misc.c index 2e77c1bc237..259c5a0399a 100644 --- a/rostests/winetests/urlmon/misc.c +++ b/rostests/winetests/urlmon/misc.c @@ -63,6 +63,8 @@ DEFINE_EXPECT(QI_IInternetProtocolInfo); DEFINE_EXPECT(CreateInstance); DEFINE_EXPECT(unk_Release); +static HRESULT (WINAPI *pCoInternetCompareUrl)(LPCWSTR, LPCWSTR, DWORD); + static void test_CreateFormatEnum(void) { IEnumFORMATETC *fenum = NULL, *fenum2 = NULL; @@ -363,13 +365,18 @@ static void test_CoInternetCompareUrl(void) { HRESULT hres; - hres = CoInternetCompareUrl(url1, url1, 0); + if (!pCoInternetCompareUrl) { + win_skip("CoInternetCompareUrl not found\n"); + return; + } + + hres = pCoInternetCompareUrl(url1, url1, 0); ok(hres == S_OK, "CoInternetParseUrl failed: %08x\n", hres); - hres = CoInternetCompareUrl(url1, url3, 0); + hres = pCoInternetCompareUrl(url1, url3, 0); ok(hres == S_FALSE, "CoInternetParseUrl failed: %08x\n", hres); - hres = CoInternetCompareUrl(url3, url1, 0); + hres = pCoInternetCompareUrl(url3, url1, 0); ok(hres == S_FALSE, "CoInternetParseUrl failed: %08x\n", hres); } @@ -1402,10 +1409,15 @@ static void test_IsValidURL(void) START_TEST(misc) { + HMODULE hurlmon; + OleInitialize(NULL); register_protocols(); + hurlmon = GetModuleHandle("urlmon.dll"); + pCoInternetCompareUrl = (void *) GetProcAddress(hurlmon, "CoInternetCompareUrl"); + test_CreateFormatEnum(); test_RegisterFormatEnumerator(); test_CoInternetParseUrl(); diff --git a/rostests/winetests/urlmon/sec_mgr.c b/rostests/winetests/urlmon/sec_mgr.c index e4416981dac..239da6c697c 100644 --- a/rostests/winetests/urlmon/sec_mgr.c +++ b/rostests/winetests/urlmon/sec_mgr.c @@ -1,6 +1,6 @@ /* * Copyright 2005-2006 Jacek Caban for CodeWeavers - * Copyright 2009 Detlef Riekenberg + * Copyright 2009-2010 Detlef Riekenberg * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -35,21 +35,22 @@ #include "initguid.h" +static HRESULT (WINAPI *pCoInternetGetSecurityUrl)(LPCWSTR, LPWSTR*, PSUACTION, DWORD); + static const WCHAR url1[] = {'r','e','s',':','/','/','m','s','h','t','m','l','.','d','l','l', '/','b','l','a','n','k','.','h','t','m',0}; static const WCHAR url2[] = {'i','n','d','e','x','.','h','t','m',0}; static const WCHAR url3[] = {'f','i','l','e',':','/','/','c',':','\\','I','n','d','e','x','.','h','t','m',0}; static const WCHAR url4[] = {'f','i','l','e',':','s','o','m','e','%','2','0','f','i','l','e', '%','2','e','j','p','g',0}; -static const WCHAR url5[] = {'h','t','t','p',':','/','/','w','w','w','.','w','i','n','e','h','q', - '.','o','r','g',0}; +static const WCHAR url5[] = {'h','t','t','p',':','/','/','w','w','w','.','z','o','n','e','3', + '.','w','i','n','e','t','e','s','t',0}; static const WCHAR url6[] = {'a','b','o','u','t',':','b','l','a','n','k',0}; -static const WCHAR url7[] = {'f','t','p',':','/','/','w','i','n','e','h','q','.','o','r','g','/', - 'f','i','l','e','.','t','e','s','t',0}; +static const WCHAR url7[] = {'f','t','p',':','/','/','z','o','n','e','3', + '.','w','i','n','e','t','e','s','t','/','f','i','l','e','.','t','e','s','t',0}; static const WCHAR url8[] = {'t','e','s','t',':','1','2','3','a','b','c',0}; -static const WCHAR url9[] = - {'h','t','t','p',':','/','/','w','w','w','.','w','i','n','e','h','q','.','o','r','g', - '/','s','i','t','e','/','a','b','o','u','t',0}; +static const WCHAR url9[] = {'h','t','t','p',':','/','/','w','w','w','.','z','o','n','e','3', + '.','w','i','n','e','t','e','s','t', '/','s','i','t','e','/','a','b','o','u','t',0}; static const WCHAR url10[] = {'f','i','l','e',':','/','/','s','o','m','e','%','2','0','f','i','l','e', '.','j','p','g',0}; @@ -58,11 +59,11 @@ static const WCHAR url4e[] = {'f','i','l','e',':','s','o','m','e',' ','f','i','l static const BYTE secid1[] = {'f','i','l','e',':',0,0,0,0}; -static const BYTE secid5[] = {'h','t','t','p',':','w','w','w','.','w','i','n','e','h','q', - '.','o','r','g',3,0,0,0}; +static const BYTE secid5[] = {'h','t','t','p',':','w','w','w','.','z','o','n','e','3', + '.','w','i','n','e','t','e','s','t',3,0,0,0}; static const BYTE secid6[] = {'a','b','o','u','t',':','b','l','a','n','k',3,0,0,0}; -static const BYTE secid7[] = {'f','t','p',':','w','i','n','e','h','q','.','o','r','g', - 3,0,0,0}; +static const BYTE secid7[] = {'f','t','p',':','z','o','n','e','3', + '.','w','i','n','e','t','e','s','t',3,0,0,0}; static const BYTE secid10[] = {'f','i','l','e',':','s','o','m','e','%','2','0','f','i','l','e','.','j','p','g',3,0,0,0}; static const BYTE secid10_2[] = @@ -632,7 +633,9 @@ static void test_InternetSecurityMarshalling(void) ok(hres == S_OK, "CreateStreamOnHGlobal returned: %08x\n", hres); hres = CoMarshalInterface(stream, &IID_IInternetSecurityManager, unk, MSHCTX_INPROC, NULL, MSHLFLAGS_NORMAL); - ok(hres == S_OK, "CoMarshalInterface returned: %08x\n", hres); + /* Not supported in W98 */ + ok(hres == S_OK || broken(hres == REGDB_E_IIDNOTREG), + "CoMarshalInterface returned: %08x\n", hres); IStream_Release(stream); IUnknown_Release(unk); @@ -641,8 +644,9 @@ static void test_InternetSecurityMarshalling(void) static void test_InternetGetSecurityUrl(void) { - const WCHAR url5_out[] = {'h','t','t','p',':','w','w','w','.','w','i','n','e','h','q','.','o','r','g',0}; - const WCHAR url7_out[] = {'f','t','p',':','w','i','n','e','h','q','.','o','r','g',0}; + const WCHAR url5_out[] = {'h','t','t','p',':','w','w','w','.','z','o','n','e','3', + '.','w','i','n','e','t','e','s','t',0}; + const WCHAR url7_out[] = {'f','t','p',':','z','o','n','e','3','.','w','i','n','e','t','e','s','t',0}; const WCHAR *in[] = {url2, url3, url4, url5, url7, url8, url9, url10}; const WCHAR *out_default[] = {url2, url3, url4, url5_out, url7_out, url8, url5_out, url10}; @@ -652,8 +656,13 @@ static void test_InternetGetSecurityUrl(void) DWORD i; HRESULT hres; + if (!pCoInternetGetSecurityUrl) { + win_skip("CoInternetGetSecurityUrl not found\n"); + return; + } + for(i=0; i #include -static void test_ScriptShape(HDC hdc) +static void test_ScriptItemize( void ) { static const WCHAR test1[] = {'t', 'e', 's', 't',0}; - BOOL ret; + static const WCHAR test2[] = {'1','2','3','-','5','2',0x064a,0x064f,0x0633,0x0627,0x0648,0x0650,0x064a,'7','1','.',0}; + static const WCHAR test3[] = +{0x0e04,0x0e27,0x0e32,0x0e21,0x0e1e,0x0e22,0x0e32,0x0e22,0x0e32, 0x0e21 +,0x0e2d,0x0e22,0x0e39,0x0e48,0x0e17,0x0e35,0x0e48,0x0e44,0x0e2b,0x0e19 +,0x0e04,0x0e27,0x0e32,0x0e21,0x0e2a, 0x0e33,0x0e40,0x0e23,0x0e47,0x0e08, + 0x0e2d,0x0e22,0x0e39,0x0e48,0x0e17,0x0e35,0x0e48,0x0e19,0x0e31,0x0e48,0x0e19,0}; + static const WCHAR test4[] = {'1','2','3','-','5','2',' ','i','s',' ','7','1','.',0}; + static const WCHAR test5[] = +{0x0627,0x0644,0x0635,0x0651,0x0650,0x062d,0x0629,0x064f,' ',0x062a,0x064e, +0x0627,0x062c,0x064c,' ',0x0639,0x064e,0x0644,0x0649,' ', +0x0631,0x064f,0x0624,0x0648,0x0633,0x0650,' ',0x0627,0x0644 +,0x0623,0x0635,0x0650,0x062d,0x0651,0x064e,0x0627,0x0621,0x0650,0}; + SCRIPT_ITEM items[10]; + SCRIPT_CONTROL Control; + SCRIPT_STATE State; + HRESULT hr; + int nItems; + + memset(&Control, 0, sizeof(Control)); + memset(&State, 0, sizeof(State)); + + hr = ScriptItemize(NULL, 4, 10, &Control, &State, items, NULL); + ok (hr == E_INVALIDARG, "ScriptItemize should return E_INVALIDARG if pwcInChars is NULL\n"); + + hr = ScriptItemize(test1, 4, 10, &Control, &State, NULL, NULL); + ok (hr == E_INVALIDARG, "ScriptItemize should return E_INVALIDARG if pItems is NULL\n"); + + hr = ScriptItemize(test1, 4, 1, &Control, &State, items, NULL); + ok (hr == E_INVALIDARG, "ScriptItemize should return E_INVALIDARG if cMaxItems < 2."); + + hr = ScriptItemize(test1, 0, 10, NULL, NULL, items, &nItems); + ok (hr == E_INVALIDARG, "ScriptItemize should return E_INVALIDARG if cInChars is 0\n"); + + hr = ScriptItemize(test1, 4, 10, NULL, NULL, items, &nItems); + ok(!hr, "ScriptItemize should return S_OK not %08x\n", hr); + ok(nItems == 1, "Wrong number of items\n"); + ok(items[0].iCharPos == 0, "Wrong CharPos \n"); + ok(items[0].a.fRTL == 0, "Wrong fRTL\n"); + ok(items[0].a.fLayoutRTL == 0, "Wrong fLayoutRTL\n"); + ok(items[0].a.s.uBidiLevel == 0, "Wrong BidiLevel\n"); + + State.uBidiLevel = 0; + hr = ScriptItemize(test1, 4, 10, &Control, &State, items, &nItems); + ok(!hr, "ScriptItemize should return S_OK not %08x\n", hr); + ok(nItems == 1, "Wrong number of items\n"); + ok(items[0].iCharPos == 0, "Wrong CharPos \n"); + ok(items[0].a.fRTL == 0, "Wrong fRTL\n"); + ok(items[0].a.fLayoutRTL == 0, "Wrong fLayoutRTL\n"); + ok(items[0].a.s.uBidiLevel == 0, "Wrong BidiLevel\n"); + + State.uBidiLevel = 1; + hr = ScriptItemize(test1, 4, 10, &Control, &State, items, &nItems); + ok(!hr, "ScriptItemize should return S_OK not %08x\n", hr); + ok(nItems == 1, "Wrong number of items\n"); + ok(items[0].iCharPos == 0, "Wrong CharPos \n"); + ok(items[0].a.fRTL == 0, "Wrong fRTL\n"); + ok(items[0].a.fLayoutRTL == 0, "Wrong fLayoutRTL\n"); + todo_wine ok(items[0].a.s.uBidiLevel == 2, "Wrong BidiLevel\n"); + + hr = ScriptItemize(test2, 16, 10, NULL, NULL, items, &nItems); + ok(!hr, "ScriptItemize should return S_OK not %08x\n", hr); + ok(nItems == 6, "Wrong number of items\n"); + ok(items[0].iCharPos == 0, "Wrong CharPos \n"); + ok(items[0].a.fRTL == 0, "Wrong fRTL\n"); + ok(items[0].a.fLayoutRTL == 0, "Wrong fLayoutRTL\n"); + ok(items[0].a.s.uBidiLevel == 0, "Wrong BidiLevel\n"); + ok(items[1].iCharPos == 3, "Wrong CharPos \n"); + ok(items[1].a.fRTL == 0, "Wrong fRTL\n"); + ok(items[1].a.fLayoutRTL == 0, "Wrong fLayoutRTL\n"); + ok(items[1].a.s.uBidiLevel == 0, "Wrong BidiLevel\n"); + ok(items[2].iCharPos == 4, "Wrong CharPos \n"); + ok(items[2].a.fRTL == 0, "Wrong fRTL\n"); + ok(items[2].a.fLayoutRTL == 0, "Wrong fLayoutRTL\n"); + ok(items[2].a.s.uBidiLevel == 0, "Wrong BidiLevel\n"); + ok(items[3].iCharPos == 6, "Wrong CharPos \n"); + ok(items[3].a.fRTL == 1, "Wrong fRTL\n"); + ok(items[3].a.fLayoutRTL == 1, "Wrong fLayoutRTL\n"); + ok(items[3].a.s.uBidiLevel == 1, "Wrong BidiLevel\n"); + ok(items[4].iCharPos == 13, "Wrong CharPos \n"); + ok(items[4].a.fRTL == 0, "Wrong fRTL\n"); + ok(items[4].a.fLayoutRTL == 0, "Wrong fLayoutRTL\n"); + ok(items[4].a.s.uBidiLevel == 0, "Wrong BidiLevel\n"); + ok(items[5].iCharPos == 15, "Wrong CharPos \n"); + ok(items[5].a.fRTL == 0, "Wrong fRTL\n"); + ok(items[5].a.fLayoutRTL == 0, "Wrong fLayoutRTL\n"); + ok(items[5].a.s.uBidiLevel == 0, "Wrong BidiLevel\n"); + + State.uBidiLevel = 0; + hr = ScriptItemize(test2, 16, 10, &Control, &State, items, &nItems); + ok(!hr, "ScriptItemize should return S_OK not %08x\n", hr); + ok(nItems == 4, "Wrong number of items\n"); + ok(items[0].iCharPos == 0, "Wrong CharPos \n"); + ok(items[0].a.fRTL == 0, "Wrong fRTL\n"); + ok(items[0].a.fLayoutRTL == 0, "Wrong fLayoutRTL\n"); + todo_wine ok(items[0].a.s.uBidiLevel == 2, "Wrong BidiLevel\n"); + ok(items[1].iCharPos == 6, "Wrong CharPos \n"); + ok(items[1].a.fRTL == 1, "Wrong fRTL\n"); + ok(items[1].a.fLayoutRTL == 1, "Wrong fLayoutRTL\n"); + ok(items[1].a.s.uBidiLevel == 1, "Wrong BidiLevel\n"); + ok(items[2].iCharPos == 13, "Wrong CharPos \n"); + ok(items[2].a.fRTL == 0, "Wrong fRTL\n"); + todo_wine ok(items[2].a.fLayoutRTL == 1, "Wrong fLayoutRTL\n"); + ok(items[2].a.s.uBidiLevel == 2, "Wrong BidiLevel\n"); + ok(items[3].iCharPos == 15, "Wrong CharPos \n"); + ok(items[3].a.fRTL == 0, "Wrong fRTL\n"); + ok(items[3].a.fLayoutRTL == 0, "Wrong fLayoutRTL\n"); + ok(items[3].a.s.uBidiLevel == 0, "Wrong BidiLevel\n"); + + State.uBidiLevel = 1; + hr = ScriptItemize(test2, 16, 10, &Control, &State, items, &nItems); + ok(!hr, "ScriptItemize should return S_OK not %08x\n", hr); + ok(nItems == 4, "Wrong number of items\n"); + ok(items[0].iCharPos == 0, "Wrong CharPos \n"); + ok(items[0].a.fRTL == 0, "Wrong fRTL\n"); + todo_wine ok(items[0].a.fLayoutRTL == 1, "Wrong fLayoutRTL\n"); + ok(items[0].a.s.uBidiLevel == 2, "Wrong BidiLevel\n"); + ok(items[1].iCharPos == 6, "Wrong CharPos \n"); + ok(items[1].a.fRTL == 1, "Wrong fRTL\n"); + ok(items[1].a.fLayoutRTL == 1, "Wrong fLayoutRTL\n"); + ok(items[1].a.s.uBidiLevel == 1, "Wrong BidiLevel\n"); + ok(items[2].iCharPos == 13, "Wrong CharPos \n"); + ok(items[2].a.fRTL == 0, "Wrong fRTL\n"); + todo_wine ok(items[2].a.fLayoutRTL == 1, "Wrong fLayoutRTL\n"); + ok(items[2].a.s.uBidiLevel == 2, "Wrong BidiLevel\n"); + ok(items[3].iCharPos == 15, "Wrong CharPos \n"); + ok(items[3].a.fRTL == 1, "Wrong fRTL\n"); + ok(items[3].a.fLayoutRTL == 1, "Wrong fLayoutRTL\n"); + ok(items[3].a.s.uBidiLevel == 1, "Wrong BidiLevel\n"); + + hr = ScriptItemize(test3, 41, 10, NULL, NULL, items, &nItems); + ok(!hr, "ScriptItemize should return S_OK not %08x\n", hr); + ok(nItems == 1, "Wrong number of items\n"); + ok(items[0].iCharPos == 0, "Wrong CharPos \n"); + ok(items[0].a.fRTL == 0, "Wrong fRTL\n"); + ok(items[0].a.fLayoutRTL == 0, "Wrong fLayoutRTL\n"); + ok(items[0].a.s.uBidiLevel == 0, "Wrong BidiLevel\n"); + + State.uBidiLevel = 0; + hr = ScriptItemize(test3, 41, 10, &Control, &State, items, &nItems); + ok(!hr, "ScriptItemize should return S_OK not %08x\n", hr); + ok(nItems == 1, "Wrong number of items\n"); + ok(items[0].iCharPos == 0, "Wrong CharPos \n"); + ok(items[0].a.fRTL == 0, "Wrong fRTL\n"); + ok(items[0].a.fLayoutRTL == 0, "Wrong fLayoutRTL\n"); + ok(items[0].a.s.uBidiLevel == 0, "Wrong BidiLevel\n"); + + State.uBidiLevel = 1; + hr = ScriptItemize(test3, 41, 10, &Control, &State, items, &nItems); + ok(!hr, "ScriptItemize should return S_OK not %08x\n", hr); + ok(nItems == 1, "Wrong number of items\n"); + ok(items[0].iCharPos == 0, "Wrong CharPos \n"); + ok(items[0].a.fRTL == 0, "Wrong fRTL\n"); + ok(items[0].a.fLayoutRTL == 0, "Wrong fLayoutRTL\n"); + todo_wine ok(items[0].a.s.uBidiLevel == 2, "Wrong BidiLevel\n"); + + hr = ScriptItemize(test4, 12, 10, NULL, NULL, items, &nItems); + ok(!hr, "ScriptItemize should return S_OK not %08x\n", hr); + ok(nItems == 5, "Wrong number of items\n"); + ok(items[0].iCharPos == 0, "Wrong CharPos \n"); + ok(items[0].a.fRTL == 0, "Wrong fRTL\n"); + ok(items[0].a.fLayoutRTL == 0, "Wrong fLayoutRTL\n"); + ok(items[0].a.s.uBidiLevel == 0, "Wrong BidiLevel\n"); + ok(items[1].iCharPos == 3, "Wrong CharPos \n"); + ok(items[1].a.fRTL == 0, "Wrong fRTL\n"); + ok(items[1].a.fLayoutRTL == 0, "Wrong fLayoutRTL\n"); + ok(items[1].a.s.uBidiLevel == 0, "Wrong BidiLevel\n"); + ok(items[2].iCharPos == 4, "Wrong CharPos \n"); + ok(items[2].a.fRTL == 0, "Wrong fRTL\n"); + ok(items[2].a.fLayoutRTL == 0, "Wrong fLayoutRTL\n"); + ok(items[2].a.s.uBidiLevel == 0, "Wrong BidiLevel\n"); + ok(items[3].iCharPos == 7, "Wrong CharPos \n"); + ok(items[3].a.fRTL == 0, "Wrong fRTL\n"); + ok(items[3].a.fLayoutRTL == 0, "Wrong fLayoutRTL\n"); + ok(items[3].a.s.uBidiLevel == 0, "Wrong BidiLevel\n"); + ok(items[4].iCharPos == 10, "Wrong CharPos \n"); + ok(items[4].a.fRTL == 0, "Wrong fRTL\n"); + ok(items[4].a.fLayoutRTL == 0, "Wrong fLayoutRTL\n"); + ok(items[4].a.s.uBidiLevel == 0, "Wrong BidiLevel\n"); + + State.uBidiLevel = 0; + hr = ScriptItemize(test4, 12, 10, &Control, &State, items, &nItems); + ok(!hr, "ScriptItemize should return S_OK not %08x\n", hr); + ok(nItems == 5, "Wrong number of items\n"); + ok(items[0].iCharPos == 0, "Wrong CharPos \n"); + ok(items[0].a.fRTL == 0, "Wrong fRTL\n"); + ok(items[0].a.fLayoutRTL == 0, "Wrong fLayoutRTL\n"); + ok(items[0].a.s.uBidiLevel == 0, "Wrong BidiLevel\n"); + ok(items[1].iCharPos == 3, "Wrong CharPos \n"); + ok(items[1].a.fRTL == 0, "Wrong fRTL\n"); + ok(items[1].a.fLayoutRTL == 0, "Wrong fLayoutRTL\n"); + ok(items[1].a.s.uBidiLevel == 0, "Wrong BidiLevel\n"); + ok(items[2].iCharPos == 4, "Wrong CharPos \n"); + ok(items[2].a.fRTL == 0, "Wrong fRTL\n"); + ok(items[2].a.fLayoutRTL == 0, "Wrong fLayoutRTL\n"); + ok(items[2].a.s.uBidiLevel == 0, "Wrong BidiLevel\n"); + ok(items[3].iCharPos == 7, "Wrong CharPos \n"); + ok(items[3].a.fRTL == 0, "Wrong fRTL\n"); + ok(items[3].a.fLayoutRTL == 0, "Wrong fLayoutRTL\n"); + ok(items[3].a.s.uBidiLevel == 0, "Wrong BidiLevel\n"); + ok(items[4].iCharPos == 10, "Wrong CharPos \n"); + ok(items[4].a.fRTL == 0, "Wrong fRTL\n"); + ok(items[4].a.fLayoutRTL == 0, "Wrong fLayoutRTL\n"); + ok(items[4].a.s.uBidiLevel == 0, "Wrong BidiLevel\n"); + + State.uBidiLevel = 1; + hr = ScriptItemize(test4, 12, 10, &Control, &State, items, &nItems); + ok(!hr, "ScriptItemize should return S_OK not %08x\n", hr); + todo_wine ok(nItems == 4, "Wrong number of items\n"); + ok(items[0].iCharPos == 0, "Wrong CharPos \n"); + ok(items[0].a.fRTL == 0, "Wrong fRTL\n"); + todo_wine ok(items[0].a.fLayoutRTL == 1, "Wrong fLayoutRTL\n"); + ok(items[0].a.s.uBidiLevel == 2, "Wrong BidiLevel\n"); + ok(items[1].iCharPos == 6, "Wrong CharPos \n"); + ok(items[1].a.fRTL == 1, "Wrong fRTL\n"); + ok(items[1].a.fLayoutRTL == 1, "Wrong fLayoutRTL\n"); + ok(items[1].a.s.uBidiLevel == 1, "Wrong BidiLevel\n"); + ok(items[2].iCharPos == 7, "Wrong CharPos \n"); + ok(items[2].a.fRTL == 0, "Wrong fRTL\n"); + ok(items[2].a.fLayoutRTL == 0, "Wrong fLayoutRTL\n"); + ok(items[2].a.s.uBidiLevel == 2, "Wrong BidiLevel\n"); + todo_wine ok(items[3].iCharPos == 10, "Wrong CharPos \n"); + ok(items[3].a.fRTL == 0, "Wrong fRTL\n"); + ok(items[3].a.fLayoutRTL == 0, "Wrong fLayoutRTL\n"); + todo_wine ok(items[3].a.s.uBidiLevel == 2, "Wrong BidiLevel\n"); + + hr = ScriptItemize(test5, 38, 10, NULL, NULL, items, &nItems); + ok(!hr, "ScriptItemize should return S_OK not %08x\n", hr); + ok(nItems == 1, "Wrong number of items\n"); + ok(items[0].iCharPos == 0, "Wrong CharPos \n"); + ok(items[0].a.fRTL == 1, "Wrong fRTL\n"); + ok(items[0].a.fLayoutRTL == 1, "Wrong fLayoutRTL\n"); + ok(items[0].a.s.uBidiLevel == 1, "Wrong BidiLevel\n"); + + State.uBidiLevel = 0; + hr = ScriptItemize(test5, 38, 10, &Control, &State, items, &nItems); + ok(!hr, "ScriptItemize should return S_OK not %08x\n", hr); + ok(nItems == 1, "Wrong number of items\n"); + ok(items[0].iCharPos == 0, "Wrong CharPos \n"); + ok(items[0].a.fRTL == 1, "Wrong fRTL\n"); + ok(items[0].a.fLayoutRTL == 1, "Wrong fLayoutRTL\n"); + ok(items[0].a.s.uBidiLevel == 1, "Wrong BidiLevel\n"); + + State.uBidiLevel = 1; + hr = ScriptItemize(test5, 38, 10, &Control, &State, items, &nItems); + ok(!hr, "ScriptItemize should return S_OK not %08x\n", hr); + ok(nItems == 1, "Wrong number of items\n"); + ok(items[0].iCharPos == 0, "Wrong CharPos \n"); + ok(items[0].a.fRTL == 1, "Wrong fRTL\n"); + ok(items[0].a.fLayoutRTL == 1, "Wrong fLayoutRTL\n"); + ok(items[0].a.s.uBidiLevel == 1, "Wrong BidiLevel\n"); +} + + +static void test_ScriptShape(HDC hdc) +{ + static const WCHAR test1[] = {'w', 'i', 'n', 'e',0}; + static const WCHAR test2[] = {0x202B, 'i', 'n', 0x202C,0}; HRESULT hr; SCRIPT_CACHE sc = NULL; - WORD glyphs[4], logclust[4]; + WORD glyphs[4], glyphs2[4], logclust[4]; SCRIPT_VISATTR attrs[4]; SCRIPT_ITEM items[2]; - int nb, widths[4]; - GOFFSET offset[4]; - ABC abc[4]; - - hr = ScriptItemize(NULL, 4, 2, NULL, NULL, items, NULL); - ok(hr == E_INVALIDARG, "ScriptItemize should return E_INVALIDARG not %08x\n", hr); - - hr = ScriptItemize(test1, 4, 2, NULL, NULL, NULL, NULL); - ok(hr == E_INVALIDARG, "ScriptItemize should return E_INVALIDARG not %08x\n", hr); + int nb; hr = ScriptItemize(test1, 4, 2, NULL, NULL, items, NULL); ok(!hr, "ScriptItemize should return S_OK not %08x\n", hr); @@ -73,8 +322,122 @@ static void test_ScriptShape(HDC hdc) ok(!hr, "ScriptShape should return S_OK not %08x\n", hr); ok(items[0].a.fNoGlyphIndex == FALSE, "fNoGlyphIndex TRUE\n"); + + memset(glyphs,-1,sizeof(glyphs)); + memset(logclust,-1,sizeof(logclust)); + memset(attrs,-1,sizeof(attrs)); hr = ScriptShape(NULL, &sc, test1, 4, 4, &items[0].a, glyphs, logclust, attrs, &nb); ok(!hr, "ScriptShape should return S_OK not %08x\n", hr); + ok(nb == 4, "Wrong number of items\n"); + ok(logclust[0] == 0, "clusters out of order\n"); + ok(logclust[1] == 1, "clusters out of order\n"); + ok(logclust[2] == 2, "clusters out of order\n"); + ok(logclust[3] == 3, "clusters out of order\n"); + ok(attrs[0].uJustification == SCRIPT_JUSTIFY_CHARACTER, "uJustification incorrect\n"); + ok(attrs[1].uJustification == SCRIPT_JUSTIFY_CHARACTER, "uJustification incorrect\n"); + ok(attrs[2].uJustification == SCRIPT_JUSTIFY_CHARACTER, "uJustification incorrect\n"); + ok(attrs[3].uJustification == SCRIPT_JUSTIFY_CHARACTER, "uJustification incorrect\n"); + ok(attrs[0].fClusterStart == 1, "fClusterStart incorrect\n"); + ok(attrs[1].fClusterStart == 1, "fClusterStart incorrect\n"); + ok(attrs[2].fClusterStart == 1, "fClusterStart incorrect\n"); + ok(attrs[3].fClusterStart == 1, "fClusterStart incorrect\n"); + ok(attrs[0].fDiacritic == 0, "fDiacritic incorrect\n"); + ok(attrs[1].fDiacritic == 0, "fDiacritic incorrect\n"); + ok(attrs[2].fDiacritic == 0, "fDiacritic incorrect\n"); + ok(attrs[3].fDiacritic == 0, "fDiacritic incorrect\n"); + ok(attrs[0].fZeroWidth == 0, "fZeroWidth incorrect\n"); + ok(attrs[1].fZeroWidth == 0, "fZeroWidth incorrect\n"); + ok(attrs[2].fZeroWidth == 0, "fZeroWidth incorrect\n"); + ok(attrs[3].fZeroWidth == 0, "fZeroWidth incorrect\n"); + + ScriptFreeCache(&sc); + sc = NULL; + + memset(glyphs2,-1,sizeof(glyphs2)); + memset(logclust,-1,sizeof(logclust)); + memset(attrs,-1,sizeof(attrs)); + hr = ScriptShape(hdc, &sc, test2, 4, 4, &items[0].a, glyphs2, logclust, attrs, &nb); + ok(hr == S_OK, "ScriptShape should return S_OK not %08x\n", hr); + ok(nb == 4, "Wrong number of items\n"); + ok(glyphs2[0] == 0, "Incorrect glyph for 0x202B\n"); + ok(glyphs2[3] == 0, "Incorrect glyph for 0x202C\n"); + ok(logclust[0] == 0, "clusters out of order\n"); + ok(logclust[1] == 1, "clusters out of order\n"); + ok(logclust[2] == 2, "clusters out of order\n"); + ok(logclust[3] == 3, "clusters out of order\n"); + ok(attrs[0].uJustification == SCRIPT_JUSTIFY_CHARACTER, "uJustification incorrect\n"); + ok(attrs[1].uJustification == SCRIPT_JUSTIFY_CHARACTER, "uJustification incorrect\n"); + ok(attrs[2].uJustification == SCRIPT_JUSTIFY_CHARACTER, "uJustification incorrect\n"); + ok(attrs[3].uJustification == SCRIPT_JUSTIFY_CHARACTER, "uJustification incorrect\n"); + ok(attrs[0].fClusterStart == 1, "fClusterStart incorrect\n"); + ok(attrs[1].fClusterStart == 1, "fClusterStart incorrect\n"); + ok(attrs[2].fClusterStart == 1, "fClusterStart incorrect\n"); + ok(attrs[3].fClusterStart == 1, "fClusterStart incorrect\n"); + ok(attrs[0].fDiacritic == 0, "fDiacritic incorrect\n"); + ok(attrs[1].fDiacritic == 0, "fDiacritic incorrect\n"); + ok(attrs[2].fDiacritic == 0, "fDiacritic incorrect\n"); + ok(attrs[3].fDiacritic == 0, "fDiacritic incorrect\n"); + ok(attrs[0].fZeroWidth == 0, "fZeroWidth incorrect\n"); + ok(attrs[1].fZeroWidth == 0, "fZeroWidth incorrect\n"); + ok(attrs[2].fZeroWidth == 0, "fZeroWidth incorrect\n"); + ok(attrs[3].fZeroWidth == 0, "fZeroWidth incorrect\n"); + + /* modify LTR to RTL */ + items[0].a.fRTL = 1; + memset(glyphs2,-1,sizeof(glyphs2)); + memset(logclust,-1,sizeof(logclust)); + memset(attrs,-1,sizeof(attrs)); + hr = ScriptShape(hdc, &sc, test1, 4, 4, &items[0].a, glyphs2, logclust, attrs, &nb); + ok(!hr, "ScriptShape should return S_OK not %08x\n", hr); + ok(nb == 4, "Wrong number of items\n"); + ok(glyphs2[0] == glyphs[3], "Glyphs not reordered properly\n"); + ok(glyphs2[1] == glyphs[2], "Glyphs not reordered properly\n"); + ok(glyphs2[2] == glyphs[1], "Glyphs not reordered properly\n"); + ok(glyphs2[3] == glyphs[0], "Glyphs not reordered properly\n"); + ok(logclust[0] == 3, "clusters out of order\n"); + ok(logclust[1] == 2, "clusters out of order\n"); + ok(logclust[2] == 1, "clusters out of order\n"); + ok(logclust[3] == 0, "clusters out of order\n"); + ok(attrs[0].uJustification == SCRIPT_JUSTIFY_CHARACTER, "uJustification incorrect\n"); + ok(attrs[1].uJustification == SCRIPT_JUSTIFY_CHARACTER, "uJustification incorrect\n"); + ok(attrs[2].uJustification == SCRIPT_JUSTIFY_CHARACTER, "uJustification incorrect\n"); + ok(attrs[3].uJustification == SCRIPT_JUSTIFY_CHARACTER, "uJustification incorrect\n"); + ok(attrs[0].fClusterStart == 1, "fClusterStart incorrect\n"); + ok(attrs[1].fClusterStart == 1, "fClusterStart incorrect\n"); + ok(attrs[2].fClusterStart == 1, "fClusterStart incorrect\n"); + ok(attrs[3].fClusterStart == 1, "fClusterStart incorrect\n"); + ok(attrs[0].fDiacritic == 0, "fDiacritic incorrect\n"); + ok(attrs[1].fDiacritic == 0, "fDiacritic incorrect\n"); + ok(attrs[2].fDiacritic == 0, "fDiacritic incorrect\n"); + ok(attrs[3].fDiacritic == 0, "fDiacritic incorrect\n"); + ok(attrs[0].fZeroWidth == 0, "fZeroWidth incorrect\n"); + ok(attrs[1].fZeroWidth == 0, "fZeroWidth incorrect\n"); + ok(attrs[2].fZeroWidth == 0, "fZeroWidth incorrect\n"); + ok(attrs[3].fZeroWidth == 0, "fZeroWidth incorrect\n"); + + ScriptFreeCache(&sc); +} + +static void test_ScriptPlace(HDC hdc) +{ + static const WCHAR test1[] = {'t', 'e', 's', 't',0}; + BOOL ret; + HRESULT hr; + SCRIPT_CACHE sc = NULL; + WORD glyphs[4], logclust[4]; + SCRIPT_VISATTR attrs[4]; + SCRIPT_ITEM items[2]; + int nb, widths[4]; + GOFFSET offset[4]; + ABC abc[4]; + + hr = ScriptItemize(test1, 4, 2, NULL, NULL, items, NULL); + ok(!hr, "ScriptItemize should return S_OK not %08x\n", hr); + ok(items[0].a.fNoGlyphIndex == FALSE, "fNoGlyphIndex TRUE\n"); + + hr = ScriptShape(hdc, &sc, test1, 4, 4, &items[0].a, glyphs, logclust, attrs, &nb); + ok(!hr, "ScriptShape should return S_OK not %08x\n", hr); + ok(items[0].a.fNoGlyphIndex == FALSE, "fNoGlyphIndex TRUE\n"); hr = ScriptPlace(hdc, &sc, glyphs, 4, NULL, &items[0].a, widths, NULL, NULL); ok(hr == E_INVALIDARG, "ScriptPlace should return E_INVALIDARG not %08x\n", hr); @@ -143,28 +506,6 @@ static void test_ScriptItemIzeShapePlace(HDC hdc, unsigned short pwOutGlyphs[256 ok( ppSp[5]->langid == 9, "Langid[5] not = to 9\n"); /* Check a known value to ensure */ /* ptrs work */ - - /* This set of tests are to check that the various edits in ScriptIemize work */ - cInChars = 5; /* Length of test without NULL */ - cMaxItems = 1; /* Check threshold value */ - hr = ScriptItemize(TestItem1, cInChars, cMaxItems, NULL, NULL, pItem, &pcItems); - ok (hr == E_INVALIDARG, "ScriptItemize should return E_INVALIDARG if cMaxItems < 2. Was %d\n", - cMaxItems); - cInChars = 5; - cMaxItems = 255; - hr = ScriptItemize(NULL, cInChars, cMaxItems, NULL, NULL, pItem, &pcItems); - ok (hr == E_INVALIDARG, "ScriptItemize should return E_INVALIDARG if pwcInChars is NULL\n"); - - cInChars = 5; - cMaxItems = 255; - hr = ScriptItemize(TestItem1, 0, cMaxItems, NULL, NULL, pItem, &pcItems); - ok (hr == E_INVALIDARG, "ScriptItemize should return E_INVALIDARG if cInChars is 0\n"); - - cInChars = 5; - cMaxItems = 255; - hr = ScriptItemize(TestItem1, cInChars, cMaxItems, NULL, NULL, NULL, &pcItems); - ok (hr == E_INVALIDARG, "ScriptItemize should return E_INVALIDARG if pItems is NULL\n"); - /* This is a valid test that will cause parsing to take place */ cInChars = 5; cMaxItems = 255; @@ -636,6 +977,78 @@ static void test_ScriptTextOut2(HDC hdc) } } +static void test_ScriptTextOut3(HDC hdc) +{ + HRESULT hr; + + int cInChars; + int cMaxItems; + SCRIPT_ITEM pItem[255]; + int pcItems; + WCHAR TestItem1[] = {' ','\r', 0}; + + SCRIPT_CACHE psc; + int cChars; + int cMaxGlyphs; + unsigned short pwOutGlyphs1[256]; + WORD pwLogClust[256]; + SCRIPT_VISATTR psva[256]; + int pcGlyphs; + int piAdvance[256]; + GOFFSET pGoffset[256]; + ABC pABC[256]; + RECT rect; + + /* This is to ensure that non exisiting glyphs are translated into a valid glyph number */ + cInChars = 2; + cMaxItems = 255; + hr = ScriptItemize(TestItem1, cInChars, cMaxItems, NULL, NULL, pItem, &pcItems); + ok (hr == 0, "ScriptItemize should return 0, returned %08x\n", hr); + /* This test is for the interim operation of ScriptItemize where only one SCRIPT_ITEM is * + * returned. */ + ok (pcItems > 0, "The number of SCRIPT_ITEMS should be greater than 0\n"); + if (pcItems > 0) + ok (pItem[0].iCharPos == 0 && pItem[2].iCharPos == cInChars, + "Start pos not = 0 (%d) or end pos not = %d (%d)\n", + pItem[0].iCharPos, cInChars, pItem[2].iCharPos); + + /* It would appear that we have a valid SCRIPT_ANALYSIS and can continue + * ie. ScriptItemize has succeeded and that pItem has been set */ + cInChars = 2; + cMaxItems = 255; + if (hr == 0) { + psc = NULL; /* must be null on first call */ + cChars = cInChars; + cMaxGlyphs = cInChars; + cMaxGlyphs = 256; + hr = ScriptShape(hdc, &psc, TestItem1, cChars, + cMaxGlyphs, &pItem[0].a, + pwOutGlyphs1, pwLogClust, psva, &pcGlyphs); + ok (hr == 0, "ScriptShape should return 0 not (%08x)\n", hr); + ok (psc != NULL, "psc should not be null and have SCRIPT_CACHE buffer address\n"); + ok (pcGlyphs == cChars, "Chars in (%d) should equal Glyphs out (%d)\n", cChars, pcGlyphs); + if (hr ==0) { + /* Note hdc is needed as glyph info is not yet in psc */ + hr = ScriptPlace(hdc, &psc, pwOutGlyphs1, pcGlyphs, psva, &pItem[0].a, piAdvance, + pGoffset, pABC); + ok (hr == 0, "Should return 0 not (%08x)\n", hr); + + /* Test Rect Rgn is acceptable */ + rect.top = 10; + rect.bottom = 20; + rect.left = 10; + rect.right = 40; + hr = ScriptTextOut(hdc, &psc, 0, 0, 0, &rect, &pItem[0].a, NULL, 0, pwOutGlyphs1, pcGlyphs, + piAdvance, NULL, pGoffset); + ok (hr == 0, "ScriptTextOut should return 0 not (%08x)\n", hr); + + } + /* Clean up and go */ + ScriptFreeCache(&psc); + ok( psc == NULL, "Expected psc to be NULL, got %p\n", psc); + } +} + static void test_ScriptXtoX(void) /**************************************************************************************** * This routine tests the ScriptXtoCP and ScriptCPtoX functions using static variables * @@ -1078,20 +1491,55 @@ static void test_ScriptGetGlyphABCWidth(HDC hdc) static void test_ScriptLayout(void) { HRESULT hr; - static const BYTE levels[][5] = + static const BYTE levels[][10] = { - { 0, 0, 0, 0, 0 }, - { 1, 1, 1, 1, 1 }, - { 2, 2, 2, 2, 2 }, - { 3, 3, 3, 3, 3 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, + { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 }, + { 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 }, + + { 0, 0, 0, 0, 0, 1, 1, 1, 1, 1}, + { 1, 1, 1, 2, 2, 2, 1, 1, 1, 1 }, + { 2, 2, 2, 1, 1, 1, 2, 2, 2, 2 }, + { 0, 0, 1, 1, 2, 2, 1, 1, 0, 0 }, + { 1, 1, 2, 2, 3, 3, 2, 2, 1, 1 }, + + { 0, 0, 1, 1, 2, 2, 1, 1, 0, 1 }, + { 1, 0, 1, 2, 2, 1, 2, 1, 0, 1 }, }; - static const int expect[][5] = + static const int expect_l2v[][10] = { - { 0, 1, 2, 3, 4 }, - { 4, 3, 2, 1, 0 }, - { 0, 1, 2, 3, 4 }, - { 4, 3, 2, 1, 0 } + { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }, + { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 }, + { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }, + { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 }, + + { 0, 1, 2, 3, 4, 9, 8 ,7 ,6, 5}, +/**/ { 9, 8, 7, 4, 5, 6, 3 ,2 ,1, 0}, +/**/ { 7, 8, 9, 6, 5, 4, 0 ,1 ,2, 3}, + { 0, 1, 7, 6, 4, 5, 3 ,2 ,8, 9}, + { 9, 8, 2, 3, 5, 4, 6 ,7 ,1, 0}, + + { 0, 1, 7, 6, 4, 5, 3 ,2 ,8, 9}, +/**/ { 0, 1, 7, 5, 6, 4, 3 ,2 ,8, 9}, }; + static const int expect_v2l[][10] = + { + { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }, + { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 }, + { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }, + { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 }, + + { 0, 1, 2, 3, 4, 9, 8 ,7 ,6, 5}, + { 9, 8, 7, 6, 3, 4, 5 ,2 ,1, 0}, + { 6, 7, 8, 9, 5, 4, 3 ,0 ,1, 2}, + { 0, 1, 7, 6, 4, 5, 3 ,2 ,8, 9}, + { 9, 8, 2, 3, 5, 4, 6 ,7 ,1, 0}, + + { 0, 1, 7, 6, 4, 5, 3 ,2 ,8, 9}, + { 0, 1, 7, 6, 5, 3, 4 ,2 ,8, 9}, + }; + int i, j, vistolog[sizeof(levels[0])], logtovis[sizeof(levels[0])]; hr = ScriptLayout(sizeof(levels[0]), NULL, vistolog, logtovis); @@ -1107,14 +1555,14 @@ static void test_ScriptLayout(void) for (j = 0; j < sizeof(levels[i]); j++) { - ok(expect[i][j] == vistolog[j], + ok(expect_v2l[i][j] == vistolog[j], "failure: levels[%d][%d] = %d, vistolog[%d] = %d\n", i, j, levels[i][j], j, vistolog[j] ); } for (j = 0; j < sizeof(levels[i]); j++) { - ok(expect[i][j] == logtovis[j], + ok(expect_l2v[i][j] == logtovis[j], "failure: levels[%d][%d] = %d, logtovis[%d] = %d\n", i, j, levels[i][j], j, logtovis[j] ); } @@ -1325,15 +1773,18 @@ START_TEST(usp10) hfont = SelectObject(hdc, CreateFontIndirectA(&lf)); + test_ScriptItemize(); test_ScriptItemIzeShapePlace(hdc,pwOutGlyphs); test_ScriptGetCMap(hdc, pwOutGlyphs); test_ScriptCacheGetHeight(hdc); test_ScriptGetGlyphABCWidth(hdc); test_ScriptShape(hdc); + test_ScriptPlace(hdc); test_ScriptGetFontProperties(hdc); test_ScriptTextOut(hdc); test_ScriptTextOut2(hdc); + test_ScriptTextOut3(hdc); test_ScriptXtoX(); test_ScriptString(hdc); test_ScriptStringXtoCP_CPtoX(hdc); diff --git a/rostests/winetests/wininet/ftp.c b/rostests/winetests/wininet/ftp.c index b4de4e184b6..df9c34753d6 100644 --- a/rostests/winetests/wininet/ftp.c +++ b/rostests/winetests/wininet/ftp.c @@ -42,6 +42,7 @@ static BOOL (WINAPI *pFtpCommandA)(HINTERNET,BOOL,DWORD,LPCSTR,DWORD_PTR,HINTERNET*); +static INTERNET_STATUS_CALLBACK (WINAPI *pInternetSetStatusCallbackA)(HINTERNET,INTERNET_STATUS_CALLBACK); static void test_getfile_no_open(void) @@ -360,6 +361,20 @@ static void test_getfile(HINTERNET hFtp, HINTERNET hConnect) "Expected ERROR_INTERNET_INCORRECT_HANDLE_TYPE, got %d\n", GetLastError()); } +static void trace_extended_error(DWORD error) +{ + DWORD code, buflen = 0; + + if (error != ERROR_INTERNET_EXTENDED_ERROR) return; + if (!InternetGetLastResponseInfoA(&code, NULL, &buflen) && GetLastError() == ERROR_INSUFFICIENT_BUFFER) + { + char *text = HeapAlloc(GetProcessHeap(), 0, ++buflen); + InternetGetLastResponseInfoA(&code, text, &buflen); + trace("%u %s\n", code, text); + HeapFree(GetProcessHeap(), 0, text); + } +} + static void test_openfile(HINTERNET hFtp, HINTERNET hConnect) { HINTERNET hOpenFile; @@ -414,34 +429,41 @@ static void test_openfile(HINTERNET hFtp, HINTERNET hConnect) if (hOpenFile) { BOOL bRet; + DWORD error; HINTERNET hOpenFile2; HANDLE hFile; /* We have a handle so all ftp calls should fail (TODO: Put all ftp-calls in here) */ SetLastError(0xdeadbeef); bRet = FtpCreateDirectoryA(hFtp, "new_directory_deadbeef"); + error = GetLastError(); ok ( bRet == FALSE, "Expected FtpCreateDirectoryA to fail\n"); - ok ( GetLastError() == ERROR_FTP_TRANSFER_IN_PROGRESS, - "Expected ERROR_FTP_TRANSFER_IN_PROGRESS, got %d\n", GetLastError()); + ok ( error == ERROR_FTP_TRANSFER_IN_PROGRESS || broken(error == ERROR_INTERNET_EXTENDED_ERROR), + "Expected ERROR_FTP_TRANSFER_IN_PROGRESS, got %d\n", error); + trace_extended_error(error); SetLastError(0xdeadbeef); bRet = FtpDeleteFileA(hFtp, "non_existent_file_deadbeef"); + error = GetLastError(); ok ( bRet == FALSE, "Expected FtpDeleteFileA to fail\n"); - ok ( GetLastError() == ERROR_FTP_TRANSFER_IN_PROGRESS, - "Expected ERROR_FTP_TRANSFER_IN_PROGRESS, got %d\n", GetLastError()); + ok ( error == ERROR_FTP_TRANSFER_IN_PROGRESS || broken(error == ERROR_INTERNET_EXTENDED_ERROR), + "Expected ERROR_FTP_TRANSFER_IN_PROGRESS, got %d\n", error); + trace_extended_error(error); SetLastError(0xdeadbeef); bRet = FtpGetFileA(hFtp, "welcome.msg", "should_be_non_existing_deadbeef", FALSE, FILE_ATTRIBUTE_NORMAL, FTP_TRANSFER_TYPE_UNKNOWN, 0); - ok ( bRet == FALSE, "Expected FtpGetFileA to fail\n"); - ok ( GetLastError() == ERROR_FTP_TRANSFER_IN_PROGRESS, - "Expected ERROR_FTP_TRANSFER_IN_PROGRESS, got %d\n", GetLastError()); + error = GetLastError(); + ok ( bRet == FALSE || broken(bRet == TRUE), "Expected FtpGetFileA to fail\n"); + ok ( error == ERROR_FTP_TRANSFER_IN_PROGRESS || broken(error == ERROR_SUCCESS), + "Expected ERROR_FTP_TRANSFER_IN_PROGRESS, got %d\n", error); DeleteFileA("should_be_non_existing_deadbeef"); /* Just in case */ SetLastError(0xdeadbeef); hOpenFile2 = FtpOpenFileA(hFtp, "welcome.msg", GENERIC_READ, FTP_TRANSFER_TYPE_ASCII, 0); - ok ( bRet == FALSE, "Expected FtpOpenFileA to fail\n"); - ok ( GetLastError() == ERROR_FTP_TRANSFER_IN_PROGRESS, - "Expected ERROR_FTP_TRANSFER_IN_PROGRESS, got %d\n", GetLastError()); + error = GetLastError(); + ok ( bRet == FALSE || broken(bRet == TRUE), "Expected FtpOpenFileA to fail\n"); + ok ( error == ERROR_FTP_TRANSFER_IN_PROGRESS || broken(error == ERROR_SUCCESS), + "Expected ERROR_FTP_TRANSFER_IN_PROGRESS, got %d\n", error); InternetCloseHandle(hOpenFile2); /* Just in case */ /* Create a temporary local file */ @@ -451,22 +473,25 @@ static void test_openfile(HINTERNET hFtp, HINTERNET hConnect) CloseHandle(hFile); SetLastError(0xdeadbeef); bRet = FtpPutFileA(hFtp, "now_existing_local", "non_existing_remote", FTP_TRANSFER_TYPE_UNKNOWN, 0); + error = GetLastError(); ok ( bRet == FALSE, "Expected FtpPutFileA to fail\n"); - ok ( GetLastError() == ERROR_FTP_TRANSFER_IN_PROGRESS, - "Expected ERROR_FTP_TRANSFER_IN_PROGRESS, got %d\n", GetLastError()); + ok ( error == ERROR_FTP_TRANSFER_IN_PROGRESS || broken(error == ERROR_INTERNET_EXTENDED_ERROR), + "Expected ERROR_FTP_TRANSFER_IN_PROGRESS, got %d\n", error); DeleteFileA("now_existing_local"); SetLastError(0xdeadbeef); bRet = FtpRemoveDirectoryA(hFtp, "should_be_non_existing_deadbeef_dir"); + error = GetLastError(); ok ( bRet == FALSE, "Expected FtpRemoveDirectoryA to fail\n"); - ok ( GetLastError() == ERROR_FTP_TRANSFER_IN_PROGRESS, - "Expected ERROR_FTP_TRANSFER_IN_PROGRESS, got %d\n", GetLastError()); + ok ( error == ERROR_FTP_TRANSFER_IN_PROGRESS || broken(error == ERROR_INTERNET_EXTENDED_ERROR), + "Expected ERROR_FTP_TRANSFER_IN_PROGRESS, got %d\n", error); SetLastError(0xdeadbeef); bRet = FtpRenameFileA(hFtp , "should_be_non_existing_deadbeef", "new"); + error = GetLastError(); ok ( bRet == FALSE, "Expected FtpRenameFileA to fail\n"); - ok ( GetLastError() == ERROR_FTP_TRANSFER_IN_PROGRESS, - "Expected ERROR_FTP_TRANSFER_IN_PROGRESS, got %d\n", GetLastError()); + ok ( error == ERROR_FTP_TRANSFER_IN_PROGRESS || broken(error == ERROR_INTERNET_EXTENDED_ERROR), + "Expected ERROR_FTP_TRANSFER_IN_PROGRESS, got %d\n", error); } InternetCloseHandle(hOpenFile); @@ -728,6 +753,7 @@ static void test_find_first_file(HINTERNET hFtp, HINTERNET hConnect) HINTERNET hSearch; HINTERNET hSearch2; HINTERNET hOpenFile; + DWORD error; /* NULL as the search file ought to return the first file in the directory */ SetLastError(0xdeadbeef); @@ -773,10 +799,17 @@ static void test_find_first_file(HINTERNET hFtp, HINTERNET hConnect) /* This should fail as the OpenFile handle wasn't closed */ SetLastError(0xdeadbeef); hSearch = FtpFindFirstFileA(hFtp, "welcome.msg", &findData, 0, 0); - ok ( hSearch == NULL, "Expected FtpFindFirstFileA to fail\n" ); - ok ( GetLastError() == ERROR_FTP_TRANSFER_IN_PROGRESS, - "Expected ERROR_FTP_TRANSFER_IN_PROGRESS, got %d\n", GetLastError() ); - InternetCloseHandle(hSearch); /* Just in case */ + error = GetLastError(); + ok ( hSearch == NULL || broken(hSearch != NULL), /* win2k */ + "Expected FtpFindFirstFileA to fail\n" ); + if (!hSearch) + ok ( error == ERROR_FTP_TRANSFER_IN_PROGRESS || broken(error == ERROR_INTERNET_EXTENDED_ERROR), + "Expected ERROR_FTP_TRANSFER_IN_PROGRESS, got %d\n", error ); + else + { + ok( error == ERROR_SUCCESS, "wrong error %u on success\n", GetLastError() ); + InternetCloseHandle(hSearch); + } InternetCloseHandle(hOpenFile); @@ -889,6 +922,51 @@ static void test_get_current_dir(HINTERNET hFtp, HINTERNET hConnect) ok ( GetLastError() == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got: %d\n", GetLastError()); } +static void WINAPI status_callback(HINTERNET handle, DWORD_PTR ctx, DWORD status, LPVOID info, DWORD info_len) +{ + switch (status) + { + case INTERNET_STATUS_RESOLVING_NAME: + case INTERNET_STATUS_NAME_RESOLVED: + case INTERNET_STATUS_CONNECTING_TO_SERVER: + case INTERNET_STATUS_CONNECTED_TO_SERVER: + trace("%p %lx %u %s %u\n", handle, ctx, status, (char *)info, info_len); + break; + default: + break; + } +} + +static void test_status_callbacks(HINTERNET hInternet) +{ + INTERNET_STATUS_CALLBACK cb; + HINTERNET hFtp; + BOOL ret; + + if (!pInternetSetStatusCallbackA) + { + win_skip("InternetSetStatusCallbackA() is not available, skipping test\n"); + return; + } + + cb = pInternetSetStatusCallbackA(hInternet, status_callback); + ok(cb == NULL, "expected NULL got %p\n", cb); + + hFtp = InternetConnect(hInternet, "ftp.winehq.org", INTERNET_DEFAULT_FTP_PORT, "anonymous", NULL, + INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 1); + if (!hFtp) + { + skip("No ftp connection could be made to ftp.winehq.org %u\n", GetLastError()); + return; + } + + ret = InternetCloseHandle(hFtp); + ok(ret, "InternetCloseHandle failed %u\n", GetLastError()); + + cb = pInternetSetStatusCallbackA(hInternet, NULL); + ok(cb == status_callback, "expected check_status got %p\n", cb); +} + START_TEST(ftp) { HMODULE hWininet; @@ -896,6 +974,7 @@ START_TEST(ftp) hWininet = GetModuleHandleA("wininet.dll"); pFtpCommandA = (void*)GetProcAddress(hWininet, "FtpCommandA"); + pInternetSetStatusCallbackA = (void*)GetProcAddress(hWininet, "InternetSetStatusCallbackA"); SetLastError(0xdeadbeef); hInternet = InternetOpen("winetest", 0, NULL, NULL, 0); @@ -937,6 +1016,7 @@ START_TEST(ftp) test_command(hFtp, hHttp); test_find_first_file(hFtp, hHttp); test_get_current_dir(hFtp, hHttp); + test_status_callbacks(hInternet); InternetCloseHandle(hHttp); InternetCloseHandle(hFtp); diff --git a/rostests/winetests/wininet/generated.c b/rostests/winetests/wininet/generated.c index ceb21deb869..1282b6fda5e 100644 --- a/rostests/winetests/wininet/generated.c +++ b/rostests/winetests/wininet/generated.c @@ -55,45 +55,1272 @@ * Test helper macros */ -#ifdef _WIN64 +#define TEST_TYPE_SIZE(type, size) C_ASSERT(sizeof(type) == size); -# define TEST_TYPE_SIZE(type, size) +#ifdef TYPE_ALIGNMENT +# define TEST_TYPE_ALIGN(type, align) C_ASSERT(TYPE_ALIGNMENT(type) == align); +#else # define TEST_TYPE_ALIGN(type, align) +#endif + +#ifdef _TYPE_ALIGNMENT +# define TEST_TARGET_ALIGN(type, align) C_ASSERT(_TYPE_ALIGNMENT(*(type)0) == align); +# define TEST_FIELD_ALIGN(type, field, align) C_ASSERT(_TYPE_ALIGNMENT(((type*)0)->field) == align); +#else # define TEST_TARGET_ALIGN(type, align) # define TEST_FIELD_ALIGN(type, field, align) -# define TEST_FIELD_OFFSET(type, field, offset) - -#else - -# define TEST_TYPE_SIZE(type, size) C_ASSERT(sizeof(type) == size); - -# ifdef TYPE_ALIGNMENT -# define TEST_TYPE_ALIGN(type, align) C_ASSERT(TYPE_ALIGNMENT(type) == align); -# else -# define TEST_TYPE_ALIGN(type, align) -# endif - -# ifdef _TYPE_ALIGNMENT -# define TEST_TARGET_ALIGN(type, align) C_ASSERT(_TYPE_ALIGNMENT(*(type)0) == align); -# define TEST_FIELD_ALIGN(type, field, align) C_ASSERT(_TYPE_ALIGNMENT(((type*)0)->field) == align); -# else -# define TEST_TARGET_ALIGN(type, align) -# define TEST_FIELD_ALIGN(type, field, align) -# endif - -# define TEST_FIELD_OFFSET(type, field, offset) C_ASSERT(FIELD_OFFSET(type, field) == offset); - #endif +#define TEST_FIELD_OFFSET(type, field, offset) C_ASSERT(FIELD_OFFSET(type, field) == offset); + #define TEST_TARGET_SIZE(type, size) TEST_TYPE_SIZE(*(type)0, size) #define TEST_FIELD_SIZE(type, field, size) TEST_TYPE_SIZE((((type*)0)->field), size) #define TEST_TYPE_SIGNED(type) C_ASSERT((type) -1 < 0); #define TEST_TYPE_UNSIGNED(type) C_ASSERT((type) -1 > 0); +#ifdef _WIN64 + static void test_pack_GOPHER_ABSTRACT_ATTRIBUTE_TYPEA(void) { - /* GOPHER_ABSTRACT_ATTRIBUTE_TYPEA (pack 4) */ + /* GOPHER_ABSTRACT_ATTRIBUTE_TYPEA */ + TEST_TYPE_SIZE (GOPHER_ABSTRACT_ATTRIBUTE_TYPEA, 16) + TEST_TYPE_ALIGN (GOPHER_ABSTRACT_ATTRIBUTE_TYPEA, 8) + TEST_FIELD_SIZE (GOPHER_ABSTRACT_ATTRIBUTE_TYPEA, ShortAbstract, 8) + TEST_FIELD_ALIGN (GOPHER_ABSTRACT_ATTRIBUTE_TYPEA, ShortAbstract, 8) + TEST_FIELD_OFFSET(GOPHER_ABSTRACT_ATTRIBUTE_TYPEA, ShortAbstract, 0) + TEST_FIELD_SIZE (GOPHER_ABSTRACT_ATTRIBUTE_TYPEA, AbstractFile, 8) + TEST_FIELD_ALIGN (GOPHER_ABSTRACT_ATTRIBUTE_TYPEA, AbstractFile, 8) + TEST_FIELD_OFFSET(GOPHER_ABSTRACT_ATTRIBUTE_TYPEA, AbstractFile, 8) +} + +static void test_pack_GOPHER_ABSTRACT_ATTRIBUTE_TYPEW(void) +{ + /* GOPHER_ABSTRACT_ATTRIBUTE_TYPEW */ + TEST_TYPE_SIZE (GOPHER_ABSTRACT_ATTRIBUTE_TYPEW, 16) + TEST_TYPE_ALIGN (GOPHER_ABSTRACT_ATTRIBUTE_TYPEW, 8) + TEST_FIELD_SIZE (GOPHER_ABSTRACT_ATTRIBUTE_TYPEW, ShortAbstract, 8) + TEST_FIELD_ALIGN (GOPHER_ABSTRACT_ATTRIBUTE_TYPEW, ShortAbstract, 8) + TEST_FIELD_OFFSET(GOPHER_ABSTRACT_ATTRIBUTE_TYPEW, ShortAbstract, 0) + TEST_FIELD_SIZE (GOPHER_ABSTRACT_ATTRIBUTE_TYPEW, AbstractFile, 8) + TEST_FIELD_ALIGN (GOPHER_ABSTRACT_ATTRIBUTE_TYPEW, AbstractFile, 8) + TEST_FIELD_OFFSET(GOPHER_ABSTRACT_ATTRIBUTE_TYPEW, AbstractFile, 8) +} + +static void test_pack_GOPHER_ADMIN_ATTRIBUTE_TYPEA(void) +{ + /* GOPHER_ADMIN_ATTRIBUTE_TYPEA */ + TEST_TYPE_SIZE (GOPHER_ADMIN_ATTRIBUTE_TYPEA, 16) + TEST_TYPE_ALIGN (GOPHER_ADMIN_ATTRIBUTE_TYPEA, 8) + TEST_FIELD_SIZE (GOPHER_ADMIN_ATTRIBUTE_TYPEA, Comment, 8) + TEST_FIELD_ALIGN (GOPHER_ADMIN_ATTRIBUTE_TYPEA, Comment, 8) + TEST_FIELD_OFFSET(GOPHER_ADMIN_ATTRIBUTE_TYPEA, Comment, 0) + TEST_FIELD_SIZE (GOPHER_ADMIN_ATTRIBUTE_TYPEA, EmailAddress, 8) + TEST_FIELD_ALIGN (GOPHER_ADMIN_ATTRIBUTE_TYPEA, EmailAddress, 8) + TEST_FIELD_OFFSET(GOPHER_ADMIN_ATTRIBUTE_TYPEA, EmailAddress, 8) +} + +static void test_pack_GOPHER_ADMIN_ATTRIBUTE_TYPEW(void) +{ + /* GOPHER_ADMIN_ATTRIBUTE_TYPEW */ + TEST_TYPE_SIZE (GOPHER_ADMIN_ATTRIBUTE_TYPEW, 16) + TEST_TYPE_ALIGN (GOPHER_ADMIN_ATTRIBUTE_TYPEW, 8) + TEST_FIELD_SIZE (GOPHER_ADMIN_ATTRIBUTE_TYPEW, Comment, 8) + TEST_FIELD_ALIGN (GOPHER_ADMIN_ATTRIBUTE_TYPEW, Comment, 8) + TEST_FIELD_OFFSET(GOPHER_ADMIN_ATTRIBUTE_TYPEW, Comment, 0) + TEST_FIELD_SIZE (GOPHER_ADMIN_ATTRIBUTE_TYPEW, EmailAddress, 8) + TEST_FIELD_ALIGN (GOPHER_ADMIN_ATTRIBUTE_TYPEW, EmailAddress, 8) + TEST_FIELD_OFFSET(GOPHER_ADMIN_ATTRIBUTE_TYPEW, EmailAddress, 8) +} + +static void test_pack_GOPHER_ASK_ATTRIBUTE_TYPEA(void) +{ + /* GOPHER_ASK_ATTRIBUTE_TYPEA */ + TEST_TYPE_SIZE (GOPHER_ASK_ATTRIBUTE_TYPEA, 16) + TEST_TYPE_ALIGN (GOPHER_ASK_ATTRIBUTE_TYPEA, 8) + TEST_FIELD_SIZE (GOPHER_ASK_ATTRIBUTE_TYPEA, QuestionType, 8) + TEST_FIELD_ALIGN (GOPHER_ASK_ATTRIBUTE_TYPEA, QuestionType, 8) + TEST_FIELD_OFFSET(GOPHER_ASK_ATTRIBUTE_TYPEA, QuestionType, 0) + TEST_FIELD_SIZE (GOPHER_ASK_ATTRIBUTE_TYPEA, QuestionText, 8) + TEST_FIELD_ALIGN (GOPHER_ASK_ATTRIBUTE_TYPEA, QuestionText, 8) + TEST_FIELD_OFFSET(GOPHER_ASK_ATTRIBUTE_TYPEA, QuestionText, 8) +} + +static void test_pack_GOPHER_ASK_ATTRIBUTE_TYPEW(void) +{ + /* GOPHER_ASK_ATTRIBUTE_TYPEW */ + TEST_TYPE_SIZE (GOPHER_ASK_ATTRIBUTE_TYPEW, 16) + TEST_TYPE_ALIGN (GOPHER_ASK_ATTRIBUTE_TYPEW, 8) + TEST_FIELD_SIZE (GOPHER_ASK_ATTRIBUTE_TYPEW, QuestionType, 8) + TEST_FIELD_ALIGN (GOPHER_ASK_ATTRIBUTE_TYPEW, QuestionType, 8) + TEST_FIELD_OFFSET(GOPHER_ASK_ATTRIBUTE_TYPEW, QuestionType, 0) + TEST_FIELD_SIZE (GOPHER_ASK_ATTRIBUTE_TYPEW, QuestionText, 8) + TEST_FIELD_ALIGN (GOPHER_ASK_ATTRIBUTE_TYPEW, QuestionText, 8) + TEST_FIELD_OFFSET(GOPHER_ASK_ATTRIBUTE_TYPEW, QuestionText, 8) +} + +static void test_pack_GOPHER_ATTRIBUTE_ENUMERATORA(void) +{ + /* GOPHER_ATTRIBUTE_ENUMERATORA */ + TEST_TYPE_SIZE (GOPHER_ATTRIBUTE_ENUMERATORA, 8) + TEST_TYPE_ALIGN (GOPHER_ATTRIBUTE_ENUMERATORA, 8) +} + +static void test_pack_GOPHER_ATTRIBUTE_ENUMERATORW(void) +{ + /* GOPHER_ATTRIBUTE_ENUMERATORW */ + TEST_TYPE_SIZE (GOPHER_ATTRIBUTE_ENUMERATORW, 8) + TEST_TYPE_ALIGN (GOPHER_ATTRIBUTE_ENUMERATORW, 8) +} + +static void test_pack_GOPHER_ATTRIBUTE_TYPEA(void) +{ + /* GOPHER_ATTRIBUTE_TYPEA */ + TEST_FIELD_SIZE (GOPHER_ATTRIBUTE_TYPEA, CategoryId, 4) + TEST_FIELD_ALIGN (GOPHER_ATTRIBUTE_TYPEA, CategoryId, 4) + TEST_FIELD_OFFSET(GOPHER_ATTRIBUTE_TYPEA, CategoryId, 0) + TEST_FIELD_SIZE (GOPHER_ATTRIBUTE_TYPEA, AttributeId, 4) + TEST_FIELD_ALIGN (GOPHER_ATTRIBUTE_TYPEA, AttributeId, 4) + TEST_FIELD_OFFSET(GOPHER_ATTRIBUTE_TYPEA, AttributeId, 4) +} + +static void test_pack_GOPHER_ATTRIBUTE_TYPEW(void) +{ + /* GOPHER_ATTRIBUTE_TYPEW */ + TEST_FIELD_SIZE (GOPHER_ATTRIBUTE_TYPEW, CategoryId, 4) + TEST_FIELD_ALIGN (GOPHER_ATTRIBUTE_TYPEW, CategoryId, 4) + TEST_FIELD_OFFSET(GOPHER_ATTRIBUTE_TYPEW, CategoryId, 0) + TEST_FIELD_SIZE (GOPHER_ATTRIBUTE_TYPEW, AttributeId, 4) + TEST_FIELD_ALIGN (GOPHER_ATTRIBUTE_TYPEW, AttributeId, 4) + TEST_FIELD_OFFSET(GOPHER_ATTRIBUTE_TYPEW, AttributeId, 4) +} + +static void test_pack_GOPHER_FIND_DATAA(void) +{ + /* GOPHER_FIND_DATAA */ + TEST_TYPE_SIZE (GOPHER_FIND_DATAA, 808) + TEST_TYPE_ALIGN (GOPHER_FIND_DATAA, 4) + TEST_FIELD_SIZE (GOPHER_FIND_DATAA, DisplayString, 129) + TEST_FIELD_ALIGN (GOPHER_FIND_DATAA, DisplayString, 1) + TEST_FIELD_OFFSET(GOPHER_FIND_DATAA, DisplayString, 0) + TEST_FIELD_SIZE (GOPHER_FIND_DATAA, GopherType, 4) + TEST_FIELD_ALIGN (GOPHER_FIND_DATAA, GopherType, 4) + TEST_FIELD_OFFSET(GOPHER_FIND_DATAA, GopherType, 132) + TEST_FIELD_SIZE (GOPHER_FIND_DATAA, SizeLow, 4) + TEST_FIELD_ALIGN (GOPHER_FIND_DATAA, SizeLow, 4) + TEST_FIELD_OFFSET(GOPHER_FIND_DATAA, SizeLow, 136) + TEST_FIELD_SIZE (GOPHER_FIND_DATAA, SizeHigh, 4) + TEST_FIELD_ALIGN (GOPHER_FIND_DATAA, SizeHigh, 4) + TEST_FIELD_OFFSET(GOPHER_FIND_DATAA, SizeHigh, 140) + TEST_FIELD_SIZE (GOPHER_FIND_DATAA, LastModificationTime, 8) + TEST_FIELD_ALIGN (GOPHER_FIND_DATAA, LastModificationTime, 4) + TEST_FIELD_OFFSET(GOPHER_FIND_DATAA, LastModificationTime, 144) + TEST_FIELD_SIZE (GOPHER_FIND_DATAA, Locator, 654) + TEST_FIELD_ALIGN (GOPHER_FIND_DATAA, Locator, 1) + TEST_FIELD_OFFSET(GOPHER_FIND_DATAA, Locator, 152) +} + +static void test_pack_GOPHER_FIND_DATAW(void) +{ + /* GOPHER_FIND_DATAW */ + TEST_TYPE_SIZE (GOPHER_FIND_DATAW, 1588) + TEST_TYPE_ALIGN (GOPHER_FIND_DATAW, 4) + TEST_FIELD_SIZE (GOPHER_FIND_DATAW, DisplayString, 258) + TEST_FIELD_ALIGN (GOPHER_FIND_DATAW, DisplayString, 2) + TEST_FIELD_OFFSET(GOPHER_FIND_DATAW, DisplayString, 0) + TEST_FIELD_SIZE (GOPHER_FIND_DATAW, GopherType, 4) + TEST_FIELD_ALIGN (GOPHER_FIND_DATAW, GopherType, 4) + TEST_FIELD_OFFSET(GOPHER_FIND_DATAW, GopherType, 260) + TEST_FIELD_SIZE (GOPHER_FIND_DATAW, SizeLow, 4) + TEST_FIELD_ALIGN (GOPHER_FIND_DATAW, SizeLow, 4) + TEST_FIELD_OFFSET(GOPHER_FIND_DATAW, SizeLow, 264) + TEST_FIELD_SIZE (GOPHER_FIND_DATAW, SizeHigh, 4) + TEST_FIELD_ALIGN (GOPHER_FIND_DATAW, SizeHigh, 4) + TEST_FIELD_OFFSET(GOPHER_FIND_DATAW, SizeHigh, 268) + TEST_FIELD_SIZE (GOPHER_FIND_DATAW, LastModificationTime, 8) + TEST_FIELD_ALIGN (GOPHER_FIND_DATAW, LastModificationTime, 4) + TEST_FIELD_OFFSET(GOPHER_FIND_DATAW, LastModificationTime, 272) + TEST_FIELD_SIZE (GOPHER_FIND_DATAW, Locator, 1308) + TEST_FIELD_ALIGN (GOPHER_FIND_DATAW, Locator, 2) + TEST_FIELD_OFFSET(GOPHER_FIND_DATAW, Locator, 280) +} + +static void test_pack_GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE(void) +{ + /* GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE */ + TEST_TYPE_SIZE (GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, 24) + TEST_TYPE_ALIGN (GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, 4) + TEST_FIELD_SIZE (GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, DegreesNorth, 4) + TEST_FIELD_ALIGN (GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, DegreesNorth, 4) + TEST_FIELD_OFFSET(GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, DegreesNorth, 0) + TEST_FIELD_SIZE (GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, MinutesNorth, 4) + TEST_FIELD_ALIGN (GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, MinutesNorth, 4) + TEST_FIELD_OFFSET(GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, MinutesNorth, 4) + TEST_FIELD_SIZE (GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, SecondsNorth, 4) + TEST_FIELD_ALIGN (GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, SecondsNorth, 4) + TEST_FIELD_OFFSET(GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, SecondsNorth, 8) + TEST_FIELD_SIZE (GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, DegreesEast, 4) + TEST_FIELD_ALIGN (GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, DegreesEast, 4) + TEST_FIELD_OFFSET(GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, DegreesEast, 12) + TEST_FIELD_SIZE (GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, MinutesEast, 4) + TEST_FIELD_ALIGN (GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, MinutesEast, 4) + TEST_FIELD_OFFSET(GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, MinutesEast, 16) + TEST_FIELD_SIZE (GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, SecondsEast, 4) + TEST_FIELD_ALIGN (GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, SecondsEast, 4) + TEST_FIELD_OFFSET(GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, SecondsEast, 20) +} + +static void test_pack_GOPHER_LOCATION_ATTRIBUTE_TYPEA(void) +{ + /* GOPHER_LOCATION_ATTRIBUTE_TYPEA */ + TEST_TYPE_SIZE (GOPHER_LOCATION_ATTRIBUTE_TYPEA, 8) + TEST_TYPE_ALIGN (GOPHER_LOCATION_ATTRIBUTE_TYPEA, 8) + TEST_FIELD_SIZE (GOPHER_LOCATION_ATTRIBUTE_TYPEA, Location, 8) + TEST_FIELD_ALIGN (GOPHER_LOCATION_ATTRIBUTE_TYPEA, Location, 8) + TEST_FIELD_OFFSET(GOPHER_LOCATION_ATTRIBUTE_TYPEA, Location, 0) +} + +static void test_pack_GOPHER_LOCATION_ATTRIBUTE_TYPEW(void) +{ + /* GOPHER_LOCATION_ATTRIBUTE_TYPEW */ + TEST_TYPE_SIZE (GOPHER_LOCATION_ATTRIBUTE_TYPEW, 8) + TEST_TYPE_ALIGN (GOPHER_LOCATION_ATTRIBUTE_TYPEW, 8) + TEST_FIELD_SIZE (GOPHER_LOCATION_ATTRIBUTE_TYPEW, Location, 8) + TEST_FIELD_ALIGN (GOPHER_LOCATION_ATTRIBUTE_TYPEW, Location, 8) + TEST_FIELD_OFFSET(GOPHER_LOCATION_ATTRIBUTE_TYPEW, Location, 0) +} + +static void test_pack_GOPHER_MOD_DATE_ATTRIBUTE_TYPE(void) +{ + /* GOPHER_MOD_DATE_ATTRIBUTE_TYPE */ + TEST_TYPE_SIZE (GOPHER_MOD_DATE_ATTRIBUTE_TYPE, 8) + TEST_TYPE_ALIGN (GOPHER_MOD_DATE_ATTRIBUTE_TYPE, 4) + TEST_FIELD_SIZE (GOPHER_MOD_DATE_ATTRIBUTE_TYPE, DateAndTime, 8) + TEST_FIELD_ALIGN (GOPHER_MOD_DATE_ATTRIBUTE_TYPE, DateAndTime, 4) + TEST_FIELD_OFFSET(GOPHER_MOD_DATE_ATTRIBUTE_TYPE, DateAndTime, 0) +} + +static void test_pack_GOPHER_ORGANIZATION_ATTRIBUTE_TYPEA(void) +{ + /* GOPHER_ORGANIZATION_ATTRIBUTE_TYPEA */ + TEST_TYPE_SIZE (GOPHER_ORGANIZATION_ATTRIBUTE_TYPEA, 8) + TEST_TYPE_ALIGN (GOPHER_ORGANIZATION_ATTRIBUTE_TYPEA, 8) + TEST_FIELD_SIZE (GOPHER_ORGANIZATION_ATTRIBUTE_TYPEA, Organization, 8) + TEST_FIELD_ALIGN (GOPHER_ORGANIZATION_ATTRIBUTE_TYPEA, Organization, 8) + TEST_FIELD_OFFSET(GOPHER_ORGANIZATION_ATTRIBUTE_TYPEA, Organization, 0) +} + +static void test_pack_GOPHER_ORGANIZATION_ATTRIBUTE_TYPEW(void) +{ + /* GOPHER_ORGANIZATION_ATTRIBUTE_TYPEW */ + TEST_TYPE_SIZE (GOPHER_ORGANIZATION_ATTRIBUTE_TYPEW, 8) + TEST_TYPE_ALIGN (GOPHER_ORGANIZATION_ATTRIBUTE_TYPEW, 8) + TEST_FIELD_SIZE (GOPHER_ORGANIZATION_ATTRIBUTE_TYPEW, Organization, 8) + TEST_FIELD_ALIGN (GOPHER_ORGANIZATION_ATTRIBUTE_TYPEW, Organization, 8) + TEST_FIELD_OFFSET(GOPHER_ORGANIZATION_ATTRIBUTE_TYPEW, Organization, 0) +} + +static void test_pack_GOPHER_PROVIDER_ATTRIBUTE_TYPEA(void) +{ + /* GOPHER_PROVIDER_ATTRIBUTE_TYPEA */ + TEST_TYPE_SIZE (GOPHER_PROVIDER_ATTRIBUTE_TYPEA, 8) + TEST_TYPE_ALIGN (GOPHER_PROVIDER_ATTRIBUTE_TYPEA, 8) + TEST_FIELD_SIZE (GOPHER_PROVIDER_ATTRIBUTE_TYPEA, Provider, 8) + TEST_FIELD_ALIGN (GOPHER_PROVIDER_ATTRIBUTE_TYPEA, Provider, 8) + TEST_FIELD_OFFSET(GOPHER_PROVIDER_ATTRIBUTE_TYPEA, Provider, 0) +} + +static void test_pack_GOPHER_PROVIDER_ATTRIBUTE_TYPEW(void) +{ + /* GOPHER_PROVIDER_ATTRIBUTE_TYPEW */ + TEST_TYPE_SIZE (GOPHER_PROVIDER_ATTRIBUTE_TYPEW, 8) + TEST_TYPE_ALIGN (GOPHER_PROVIDER_ATTRIBUTE_TYPEW, 8) + TEST_FIELD_SIZE (GOPHER_PROVIDER_ATTRIBUTE_TYPEW, Provider, 8) + TEST_FIELD_ALIGN (GOPHER_PROVIDER_ATTRIBUTE_TYPEW, Provider, 8) + TEST_FIELD_OFFSET(GOPHER_PROVIDER_ATTRIBUTE_TYPEW, Provider, 0) +} + +static void test_pack_GOPHER_SCORE_ATTRIBUTE_TYPE(void) +{ + /* GOPHER_SCORE_ATTRIBUTE_TYPE */ + TEST_TYPE_SIZE (GOPHER_SCORE_ATTRIBUTE_TYPE, 4) + TEST_TYPE_ALIGN (GOPHER_SCORE_ATTRIBUTE_TYPE, 4) + TEST_FIELD_SIZE (GOPHER_SCORE_ATTRIBUTE_TYPE, Score, 4) + TEST_FIELD_ALIGN (GOPHER_SCORE_ATTRIBUTE_TYPE, Score, 4) + TEST_FIELD_OFFSET(GOPHER_SCORE_ATTRIBUTE_TYPE, Score, 0) +} + +static void test_pack_GOPHER_SCORE_RANGE_ATTRIBUTE_TYPE(void) +{ + /* GOPHER_SCORE_RANGE_ATTRIBUTE_TYPE */ + TEST_TYPE_SIZE (GOPHER_SCORE_RANGE_ATTRIBUTE_TYPE, 8) + TEST_TYPE_ALIGN (GOPHER_SCORE_RANGE_ATTRIBUTE_TYPE, 4) + TEST_FIELD_SIZE (GOPHER_SCORE_RANGE_ATTRIBUTE_TYPE, LowerBound, 4) + TEST_FIELD_ALIGN (GOPHER_SCORE_RANGE_ATTRIBUTE_TYPE, LowerBound, 4) + TEST_FIELD_OFFSET(GOPHER_SCORE_RANGE_ATTRIBUTE_TYPE, LowerBound, 0) + TEST_FIELD_SIZE (GOPHER_SCORE_RANGE_ATTRIBUTE_TYPE, UpperBound, 4) + TEST_FIELD_ALIGN (GOPHER_SCORE_RANGE_ATTRIBUTE_TYPE, UpperBound, 4) + TEST_FIELD_OFFSET(GOPHER_SCORE_RANGE_ATTRIBUTE_TYPE, UpperBound, 4) +} + +static void test_pack_GOPHER_SITE_ATTRIBUTE_TYPEA(void) +{ + /* GOPHER_SITE_ATTRIBUTE_TYPEA */ + TEST_TYPE_SIZE (GOPHER_SITE_ATTRIBUTE_TYPEA, 8) + TEST_TYPE_ALIGN (GOPHER_SITE_ATTRIBUTE_TYPEA, 8) + TEST_FIELD_SIZE (GOPHER_SITE_ATTRIBUTE_TYPEA, Site, 8) + TEST_FIELD_ALIGN (GOPHER_SITE_ATTRIBUTE_TYPEA, Site, 8) + TEST_FIELD_OFFSET(GOPHER_SITE_ATTRIBUTE_TYPEA, Site, 0) +} + +static void test_pack_GOPHER_SITE_ATTRIBUTE_TYPEW(void) +{ + /* GOPHER_SITE_ATTRIBUTE_TYPEW */ + TEST_TYPE_SIZE (GOPHER_SITE_ATTRIBUTE_TYPEW, 8) + TEST_TYPE_ALIGN (GOPHER_SITE_ATTRIBUTE_TYPEW, 8) + TEST_FIELD_SIZE (GOPHER_SITE_ATTRIBUTE_TYPEW, Site, 8) + TEST_FIELD_ALIGN (GOPHER_SITE_ATTRIBUTE_TYPEW, Site, 8) + TEST_FIELD_OFFSET(GOPHER_SITE_ATTRIBUTE_TYPEW, Site, 0) +} + +static void test_pack_GOPHER_TIMEZONE_ATTRIBUTE_TYPE(void) +{ + /* GOPHER_TIMEZONE_ATTRIBUTE_TYPE */ + TEST_TYPE_SIZE (GOPHER_TIMEZONE_ATTRIBUTE_TYPE, 4) + TEST_TYPE_ALIGN (GOPHER_TIMEZONE_ATTRIBUTE_TYPE, 4) + TEST_FIELD_SIZE (GOPHER_TIMEZONE_ATTRIBUTE_TYPE, Zone, 4) + TEST_FIELD_ALIGN (GOPHER_TIMEZONE_ATTRIBUTE_TYPE, Zone, 4) + TEST_FIELD_OFFSET(GOPHER_TIMEZONE_ATTRIBUTE_TYPE, Zone, 0) +} + +static void test_pack_GOPHER_TTL_ATTRIBUTE_TYPE(void) +{ + /* GOPHER_TTL_ATTRIBUTE_TYPE */ + TEST_TYPE_SIZE (GOPHER_TTL_ATTRIBUTE_TYPE, 4) + TEST_TYPE_ALIGN (GOPHER_TTL_ATTRIBUTE_TYPE, 4) + TEST_FIELD_SIZE (GOPHER_TTL_ATTRIBUTE_TYPE, Ttl, 4) + TEST_FIELD_ALIGN (GOPHER_TTL_ATTRIBUTE_TYPE, Ttl, 4) + TEST_FIELD_OFFSET(GOPHER_TTL_ATTRIBUTE_TYPE, Ttl, 0) +} + +static void test_pack_GOPHER_UNKNOWN_ATTRIBUTE_TYPEA(void) +{ + /* GOPHER_UNKNOWN_ATTRIBUTE_TYPEA */ + TEST_TYPE_SIZE (GOPHER_UNKNOWN_ATTRIBUTE_TYPEA, 8) + TEST_TYPE_ALIGN (GOPHER_UNKNOWN_ATTRIBUTE_TYPEA, 8) + TEST_FIELD_SIZE (GOPHER_UNKNOWN_ATTRIBUTE_TYPEA, Text, 8) + TEST_FIELD_ALIGN (GOPHER_UNKNOWN_ATTRIBUTE_TYPEA, Text, 8) + TEST_FIELD_OFFSET(GOPHER_UNKNOWN_ATTRIBUTE_TYPEA, Text, 0) +} + +static void test_pack_GOPHER_UNKNOWN_ATTRIBUTE_TYPEW(void) +{ + /* GOPHER_UNKNOWN_ATTRIBUTE_TYPEW */ + TEST_TYPE_SIZE (GOPHER_UNKNOWN_ATTRIBUTE_TYPEW, 8) + TEST_TYPE_ALIGN (GOPHER_UNKNOWN_ATTRIBUTE_TYPEW, 8) + TEST_FIELD_SIZE (GOPHER_UNKNOWN_ATTRIBUTE_TYPEW, Text, 8) + TEST_FIELD_ALIGN (GOPHER_UNKNOWN_ATTRIBUTE_TYPEW, Text, 8) + TEST_FIELD_OFFSET(GOPHER_UNKNOWN_ATTRIBUTE_TYPEW, Text, 0) +} + +static void test_pack_GOPHER_VERONICA_ATTRIBUTE_TYPE(void) +{ + /* GOPHER_VERONICA_ATTRIBUTE_TYPE */ + TEST_TYPE_SIZE (GOPHER_VERONICA_ATTRIBUTE_TYPE, 4) + TEST_TYPE_ALIGN (GOPHER_VERONICA_ATTRIBUTE_TYPE, 4) + TEST_FIELD_SIZE (GOPHER_VERONICA_ATTRIBUTE_TYPE, TreeWalk, 4) + TEST_FIELD_ALIGN (GOPHER_VERONICA_ATTRIBUTE_TYPE, TreeWalk, 4) + TEST_FIELD_OFFSET(GOPHER_VERONICA_ATTRIBUTE_TYPE, TreeWalk, 0) +} + +static void test_pack_GOPHER_VERSION_ATTRIBUTE_TYPEA(void) +{ + /* GOPHER_VERSION_ATTRIBUTE_TYPEA */ + TEST_TYPE_SIZE (GOPHER_VERSION_ATTRIBUTE_TYPEA, 8) + TEST_TYPE_ALIGN (GOPHER_VERSION_ATTRIBUTE_TYPEA, 8) + TEST_FIELD_SIZE (GOPHER_VERSION_ATTRIBUTE_TYPEA, Version, 8) + TEST_FIELD_ALIGN (GOPHER_VERSION_ATTRIBUTE_TYPEA, Version, 8) + TEST_FIELD_OFFSET(GOPHER_VERSION_ATTRIBUTE_TYPEA, Version, 0) +} + +static void test_pack_GOPHER_VERSION_ATTRIBUTE_TYPEW(void) +{ + /* GOPHER_VERSION_ATTRIBUTE_TYPEW */ + TEST_TYPE_SIZE (GOPHER_VERSION_ATTRIBUTE_TYPEW, 8) + TEST_TYPE_ALIGN (GOPHER_VERSION_ATTRIBUTE_TYPEW, 8) + TEST_FIELD_SIZE (GOPHER_VERSION_ATTRIBUTE_TYPEW, Version, 8) + TEST_FIELD_ALIGN (GOPHER_VERSION_ATTRIBUTE_TYPEW, Version, 8) + TEST_FIELD_OFFSET(GOPHER_VERSION_ATTRIBUTE_TYPEW, Version, 0) +} + +static void test_pack_GOPHER_VIEW_ATTRIBUTE_TYPEA(void) +{ + /* GOPHER_VIEW_ATTRIBUTE_TYPEA */ + TEST_TYPE_SIZE (GOPHER_VIEW_ATTRIBUTE_TYPEA, 24) + TEST_TYPE_ALIGN (GOPHER_VIEW_ATTRIBUTE_TYPEA, 8) + TEST_FIELD_SIZE (GOPHER_VIEW_ATTRIBUTE_TYPEA, ContentType, 8) + TEST_FIELD_ALIGN (GOPHER_VIEW_ATTRIBUTE_TYPEA, ContentType, 8) + TEST_FIELD_OFFSET(GOPHER_VIEW_ATTRIBUTE_TYPEA, ContentType, 0) + TEST_FIELD_SIZE (GOPHER_VIEW_ATTRIBUTE_TYPEA, Language, 8) + TEST_FIELD_ALIGN (GOPHER_VIEW_ATTRIBUTE_TYPEA, Language, 8) + TEST_FIELD_OFFSET(GOPHER_VIEW_ATTRIBUTE_TYPEA, Language, 8) + TEST_FIELD_SIZE (GOPHER_VIEW_ATTRIBUTE_TYPEA, Size, 4) + TEST_FIELD_ALIGN (GOPHER_VIEW_ATTRIBUTE_TYPEA, Size, 4) + TEST_FIELD_OFFSET(GOPHER_VIEW_ATTRIBUTE_TYPEA, Size, 16) +} + +static void test_pack_GOPHER_VIEW_ATTRIBUTE_TYPEW(void) +{ + /* GOPHER_VIEW_ATTRIBUTE_TYPEW */ + TEST_TYPE_SIZE (GOPHER_VIEW_ATTRIBUTE_TYPEW, 24) + TEST_TYPE_ALIGN (GOPHER_VIEW_ATTRIBUTE_TYPEW, 8) + TEST_FIELD_SIZE (GOPHER_VIEW_ATTRIBUTE_TYPEW, ContentType, 8) + TEST_FIELD_ALIGN (GOPHER_VIEW_ATTRIBUTE_TYPEW, ContentType, 8) + TEST_FIELD_OFFSET(GOPHER_VIEW_ATTRIBUTE_TYPEW, ContentType, 0) + TEST_FIELD_SIZE (GOPHER_VIEW_ATTRIBUTE_TYPEW, Language, 8) + TEST_FIELD_ALIGN (GOPHER_VIEW_ATTRIBUTE_TYPEW, Language, 8) + TEST_FIELD_OFFSET(GOPHER_VIEW_ATTRIBUTE_TYPEW, Language, 8) + TEST_FIELD_SIZE (GOPHER_VIEW_ATTRIBUTE_TYPEW, Size, 4) + TEST_FIELD_ALIGN (GOPHER_VIEW_ATTRIBUTE_TYPEW, Size, 4) + TEST_FIELD_OFFSET(GOPHER_VIEW_ATTRIBUTE_TYPEW, Size, 16) +} + +static void test_pack_GROUPID(void) +{ + /* GROUPID */ + TEST_TYPE_SIZE (GROUPID, 8) + TEST_TYPE_ALIGN (GROUPID, 8) + TEST_TYPE_SIGNED(GROUPID) +} + +static void test_pack_HINTERNET(void) +{ + /* HINTERNET */ + TEST_TYPE_SIZE (HINTERNET, 8) + TEST_TYPE_ALIGN (HINTERNET, 8) +} + +static void test_pack_HTTP_VERSION_INFO(void) +{ + /* HTTP_VERSION_INFO */ + TEST_TYPE_SIZE (HTTP_VERSION_INFO, 8) + TEST_TYPE_ALIGN (HTTP_VERSION_INFO, 4) + TEST_FIELD_SIZE (HTTP_VERSION_INFO, dwMajorVersion, 4) + TEST_FIELD_ALIGN (HTTP_VERSION_INFO, dwMajorVersion, 4) + TEST_FIELD_OFFSET(HTTP_VERSION_INFO, dwMajorVersion, 0) + TEST_FIELD_SIZE (HTTP_VERSION_INFO, dwMinorVersion, 4) + TEST_FIELD_ALIGN (HTTP_VERSION_INFO, dwMinorVersion, 4) + TEST_FIELD_OFFSET(HTTP_VERSION_INFO, dwMinorVersion, 4) +} + +static void test_pack_INTERNET_ASYNC_RESULT(void) +{ + /* INTERNET_ASYNC_RESULT */ + TEST_TYPE_SIZE (INTERNET_ASYNC_RESULT, 16) + TEST_TYPE_ALIGN (INTERNET_ASYNC_RESULT, 8) + TEST_FIELD_SIZE (INTERNET_ASYNC_RESULT, dwResult, 8) + TEST_FIELD_ALIGN (INTERNET_ASYNC_RESULT, dwResult, 8) + TEST_FIELD_OFFSET(INTERNET_ASYNC_RESULT, dwResult, 0) + TEST_FIELD_SIZE (INTERNET_ASYNC_RESULT, dwError, 4) + TEST_FIELD_ALIGN (INTERNET_ASYNC_RESULT, dwError, 4) + TEST_FIELD_OFFSET(INTERNET_ASYNC_RESULT, dwError, 8) +} + +static void test_pack_INTERNET_AUTH_NOTIFY_DATA(void) +{ + /* INTERNET_AUTH_NOTIFY_DATA */ + TEST_TYPE_SIZE (INTERNET_AUTH_NOTIFY_DATA, 24) + TEST_TYPE_ALIGN (INTERNET_AUTH_NOTIFY_DATA, 8) + TEST_FIELD_SIZE (INTERNET_AUTH_NOTIFY_DATA, cbStruct, 4) + TEST_FIELD_ALIGN (INTERNET_AUTH_NOTIFY_DATA, cbStruct, 4) + TEST_FIELD_OFFSET(INTERNET_AUTH_NOTIFY_DATA, cbStruct, 0) + TEST_FIELD_SIZE (INTERNET_AUTH_NOTIFY_DATA, dwOptions, 4) + TEST_FIELD_ALIGN (INTERNET_AUTH_NOTIFY_DATA, dwOptions, 4) + TEST_FIELD_OFFSET(INTERNET_AUTH_NOTIFY_DATA, dwOptions, 4) + TEST_FIELD_SIZE (INTERNET_AUTH_NOTIFY_DATA, pfnNotify, 8) + TEST_FIELD_ALIGN (INTERNET_AUTH_NOTIFY_DATA, pfnNotify, 8) + TEST_FIELD_OFFSET(INTERNET_AUTH_NOTIFY_DATA, pfnNotify, 8) + TEST_FIELD_SIZE (INTERNET_AUTH_NOTIFY_DATA, dwContext, 8) + TEST_FIELD_ALIGN (INTERNET_AUTH_NOTIFY_DATA, dwContext, 8) + TEST_FIELD_OFFSET(INTERNET_AUTH_NOTIFY_DATA, dwContext, 16) +} + +static void test_pack_INTERNET_BUFFERSA(void) +{ + /* INTERNET_BUFFERSA */ + TEST_TYPE_SIZE (INTERNET_BUFFERSA, 56) + TEST_TYPE_ALIGN (INTERNET_BUFFERSA, 8) + TEST_FIELD_SIZE (INTERNET_BUFFERSA, dwStructSize, 4) + TEST_FIELD_ALIGN (INTERNET_BUFFERSA, dwStructSize, 4) + TEST_FIELD_OFFSET(INTERNET_BUFFERSA, dwStructSize, 0) + TEST_FIELD_SIZE (INTERNET_BUFFERSA, Next, 8) + TEST_FIELD_ALIGN (INTERNET_BUFFERSA, Next, 8) + TEST_FIELD_OFFSET(INTERNET_BUFFERSA, Next, 8) + TEST_FIELD_SIZE (INTERNET_BUFFERSA, lpcszHeader, 8) + TEST_FIELD_ALIGN (INTERNET_BUFFERSA, lpcszHeader, 8) + TEST_FIELD_OFFSET(INTERNET_BUFFERSA, lpcszHeader, 16) + TEST_FIELD_SIZE (INTERNET_BUFFERSA, dwHeadersLength, 4) + TEST_FIELD_ALIGN (INTERNET_BUFFERSA, dwHeadersLength, 4) + TEST_FIELD_OFFSET(INTERNET_BUFFERSA, dwHeadersLength, 24) + TEST_FIELD_SIZE (INTERNET_BUFFERSA, dwHeadersTotal, 4) + TEST_FIELD_ALIGN (INTERNET_BUFFERSA, dwHeadersTotal, 4) + TEST_FIELD_OFFSET(INTERNET_BUFFERSA, dwHeadersTotal, 28) + TEST_FIELD_SIZE (INTERNET_BUFFERSA, lpvBuffer, 8) + TEST_FIELD_ALIGN (INTERNET_BUFFERSA, lpvBuffer, 8) + TEST_FIELD_OFFSET(INTERNET_BUFFERSA, lpvBuffer, 32) + TEST_FIELD_SIZE (INTERNET_BUFFERSA, dwBufferLength, 4) + TEST_FIELD_ALIGN (INTERNET_BUFFERSA, dwBufferLength, 4) + TEST_FIELD_OFFSET(INTERNET_BUFFERSA, dwBufferLength, 40) + TEST_FIELD_SIZE (INTERNET_BUFFERSA, dwBufferTotal, 4) + TEST_FIELD_ALIGN (INTERNET_BUFFERSA, dwBufferTotal, 4) + TEST_FIELD_OFFSET(INTERNET_BUFFERSA, dwBufferTotal, 44) + TEST_FIELD_SIZE (INTERNET_BUFFERSA, dwOffsetLow, 4) + TEST_FIELD_ALIGN (INTERNET_BUFFERSA, dwOffsetLow, 4) + TEST_FIELD_OFFSET(INTERNET_BUFFERSA, dwOffsetLow, 48) + TEST_FIELD_SIZE (INTERNET_BUFFERSA, dwOffsetHigh, 4) + TEST_FIELD_ALIGN (INTERNET_BUFFERSA, dwOffsetHigh, 4) + TEST_FIELD_OFFSET(INTERNET_BUFFERSA, dwOffsetHigh, 52) +} + +static void test_pack_INTERNET_BUFFERSW(void) +{ + /* INTERNET_BUFFERSW */ + TEST_TYPE_SIZE (INTERNET_BUFFERSW, 56) + TEST_TYPE_ALIGN (INTERNET_BUFFERSW, 8) + TEST_FIELD_SIZE (INTERNET_BUFFERSW, dwStructSize, 4) + TEST_FIELD_ALIGN (INTERNET_BUFFERSW, dwStructSize, 4) + TEST_FIELD_OFFSET(INTERNET_BUFFERSW, dwStructSize, 0) + TEST_FIELD_SIZE (INTERNET_BUFFERSW, Next, 8) + TEST_FIELD_ALIGN (INTERNET_BUFFERSW, Next, 8) + TEST_FIELD_OFFSET(INTERNET_BUFFERSW, Next, 8) + TEST_FIELD_SIZE (INTERNET_BUFFERSW, lpcszHeader, 8) + TEST_FIELD_ALIGN (INTERNET_BUFFERSW, lpcszHeader, 8) + TEST_FIELD_OFFSET(INTERNET_BUFFERSW, lpcszHeader, 16) + TEST_FIELD_SIZE (INTERNET_BUFFERSW, dwHeadersLength, 4) + TEST_FIELD_ALIGN (INTERNET_BUFFERSW, dwHeadersLength, 4) + TEST_FIELD_OFFSET(INTERNET_BUFFERSW, dwHeadersLength, 24) + TEST_FIELD_SIZE (INTERNET_BUFFERSW, dwHeadersTotal, 4) + TEST_FIELD_ALIGN (INTERNET_BUFFERSW, dwHeadersTotal, 4) + TEST_FIELD_OFFSET(INTERNET_BUFFERSW, dwHeadersTotal, 28) + TEST_FIELD_SIZE (INTERNET_BUFFERSW, lpvBuffer, 8) + TEST_FIELD_ALIGN (INTERNET_BUFFERSW, lpvBuffer, 8) + TEST_FIELD_OFFSET(INTERNET_BUFFERSW, lpvBuffer, 32) + TEST_FIELD_SIZE (INTERNET_BUFFERSW, dwBufferLength, 4) + TEST_FIELD_ALIGN (INTERNET_BUFFERSW, dwBufferLength, 4) + TEST_FIELD_OFFSET(INTERNET_BUFFERSW, dwBufferLength, 40) + TEST_FIELD_SIZE (INTERNET_BUFFERSW, dwBufferTotal, 4) + TEST_FIELD_ALIGN (INTERNET_BUFFERSW, dwBufferTotal, 4) + TEST_FIELD_OFFSET(INTERNET_BUFFERSW, dwBufferTotal, 44) + TEST_FIELD_SIZE (INTERNET_BUFFERSW, dwOffsetLow, 4) + TEST_FIELD_ALIGN (INTERNET_BUFFERSW, dwOffsetLow, 4) + TEST_FIELD_OFFSET(INTERNET_BUFFERSW, dwOffsetLow, 48) + TEST_FIELD_SIZE (INTERNET_BUFFERSW, dwOffsetHigh, 4) + TEST_FIELD_ALIGN (INTERNET_BUFFERSW, dwOffsetHigh, 4) + TEST_FIELD_OFFSET(INTERNET_BUFFERSW, dwOffsetHigh, 52) +} + +static void test_pack_INTERNET_CACHE_ENTRY_INFOA(void) +{ + /* INTERNET_CACHE_ENTRY_INFOA */ + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOA, dwStructSize, 4) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOA, dwStructSize, 4) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOA, dwStructSize, 0) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOA, lpszSourceUrlName, 8) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOA, lpszSourceUrlName, 8) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOA, lpszSourceUrlName, 8) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOA, lpszLocalFileName, 8) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOA, lpszLocalFileName, 8) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOA, lpszLocalFileName, 16) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOA, CacheEntryType, 4) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOA, CacheEntryType, 4) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOA, CacheEntryType, 24) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOA, dwUseCount, 4) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOA, dwUseCount, 4) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOA, dwUseCount, 28) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOA, dwHitRate, 4) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOA, dwHitRate, 4) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOA, dwHitRate, 32) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOA, dwSizeLow, 4) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOA, dwSizeLow, 4) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOA, dwSizeLow, 36) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOA, dwSizeHigh, 4) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOA, dwSizeHigh, 4) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOA, dwSizeHigh, 40) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOA, LastModifiedTime, 8) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOA, LastModifiedTime, 4) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOA, LastModifiedTime, 44) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOA, ExpireTime, 8) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOA, ExpireTime, 4) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOA, ExpireTime, 52) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOA, LastAccessTime, 8) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOA, LastAccessTime, 4) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOA, LastAccessTime, 60) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOA, LastSyncTime, 8) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOA, LastSyncTime, 4) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOA, LastSyncTime, 68) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOA, lpHeaderInfo, 8) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOA, lpHeaderInfo, 8) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOA, lpHeaderInfo, 80) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOA, dwHeaderInfoSize, 4) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOA, dwHeaderInfoSize, 4) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOA, dwHeaderInfoSize, 88) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOA, lpszFileExtension, 8) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOA, lpszFileExtension, 8) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOA, lpszFileExtension, 96) +} + +static void test_pack_INTERNET_CACHE_ENTRY_INFOW(void) +{ + /* INTERNET_CACHE_ENTRY_INFOW */ + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOW, dwStructSize, 4) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOW, dwStructSize, 4) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOW, dwStructSize, 0) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOW, lpszSourceUrlName, 8) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOW, lpszSourceUrlName, 8) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOW, lpszSourceUrlName, 8) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOW, lpszLocalFileName, 8) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOW, lpszLocalFileName, 8) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOW, lpszLocalFileName, 16) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOW, CacheEntryType, 4) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOW, CacheEntryType, 4) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOW, CacheEntryType, 24) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOW, dwUseCount, 4) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOW, dwUseCount, 4) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOW, dwUseCount, 28) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOW, dwHitRate, 4) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOW, dwHitRate, 4) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOW, dwHitRate, 32) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOW, dwSizeLow, 4) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOW, dwSizeLow, 4) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOW, dwSizeLow, 36) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOW, dwSizeHigh, 4) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOW, dwSizeHigh, 4) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOW, dwSizeHigh, 40) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOW, LastModifiedTime, 8) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOW, LastModifiedTime, 4) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOW, LastModifiedTime, 44) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOW, ExpireTime, 8) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOW, ExpireTime, 4) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOW, ExpireTime, 52) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOW, LastAccessTime, 8) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOW, LastAccessTime, 4) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOW, LastAccessTime, 60) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOW, LastSyncTime, 8) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOW, LastSyncTime, 4) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOW, LastSyncTime, 68) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOW, lpHeaderInfo, 8) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOW, lpHeaderInfo, 8) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOW, lpHeaderInfo, 80) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOW, dwHeaderInfoSize, 4) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOW, dwHeaderInfoSize, 4) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOW, dwHeaderInfoSize, 88) + TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOW, lpszFileExtension, 8) + TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOW, lpszFileExtension, 8) + TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOW, lpszFileExtension, 96) +} + +static void test_pack_INTERNET_CERTIFICATE_INFOA(void) +{ + /* INTERNET_CERTIFICATE_INFOA */ + TEST_TYPE_SIZE (INTERNET_CERTIFICATE_INFOA, 64) + TEST_TYPE_ALIGN (INTERNET_CERTIFICATE_INFOA, 8) + TEST_FIELD_SIZE (INTERNET_CERTIFICATE_INFOA, ftExpiry, 8) + TEST_FIELD_ALIGN (INTERNET_CERTIFICATE_INFOA, ftExpiry, 4) + TEST_FIELD_OFFSET(INTERNET_CERTIFICATE_INFOA, ftExpiry, 0) + TEST_FIELD_SIZE (INTERNET_CERTIFICATE_INFOA, ftStart, 8) + TEST_FIELD_ALIGN (INTERNET_CERTIFICATE_INFOA, ftStart, 4) + TEST_FIELD_OFFSET(INTERNET_CERTIFICATE_INFOA, ftStart, 8) + TEST_FIELD_SIZE (INTERNET_CERTIFICATE_INFOA, lpszSubjectInfo, 8) + TEST_FIELD_ALIGN (INTERNET_CERTIFICATE_INFOA, lpszSubjectInfo, 8) + TEST_FIELD_OFFSET(INTERNET_CERTIFICATE_INFOA, lpszSubjectInfo, 16) + TEST_FIELD_SIZE (INTERNET_CERTIFICATE_INFOA, lpszIssuerInfo, 8) + TEST_FIELD_ALIGN (INTERNET_CERTIFICATE_INFOA, lpszIssuerInfo, 8) + TEST_FIELD_OFFSET(INTERNET_CERTIFICATE_INFOA, lpszIssuerInfo, 24) + TEST_FIELD_SIZE (INTERNET_CERTIFICATE_INFOA, lpszProtocolName, 8) + TEST_FIELD_ALIGN (INTERNET_CERTIFICATE_INFOA, lpszProtocolName, 8) + TEST_FIELD_OFFSET(INTERNET_CERTIFICATE_INFOA, lpszProtocolName, 32) + TEST_FIELD_SIZE (INTERNET_CERTIFICATE_INFOA, lpszSignatureAlgName, 8) + TEST_FIELD_ALIGN (INTERNET_CERTIFICATE_INFOA, lpszSignatureAlgName, 8) + TEST_FIELD_OFFSET(INTERNET_CERTIFICATE_INFOA, lpszSignatureAlgName, 40) + TEST_FIELD_SIZE (INTERNET_CERTIFICATE_INFOA, lpszEncryptionAlgName, 8) + TEST_FIELD_ALIGN (INTERNET_CERTIFICATE_INFOA, lpszEncryptionAlgName, 8) + TEST_FIELD_OFFSET(INTERNET_CERTIFICATE_INFOA, lpszEncryptionAlgName, 48) + TEST_FIELD_SIZE (INTERNET_CERTIFICATE_INFOA, dwKeySize, 4) + TEST_FIELD_ALIGN (INTERNET_CERTIFICATE_INFOA, dwKeySize, 4) + TEST_FIELD_OFFSET(INTERNET_CERTIFICATE_INFOA, dwKeySize, 56) +} + +static void test_pack_INTERNET_CERTIFICATE_INFOW(void) +{ + /* INTERNET_CERTIFICATE_INFOW */ + TEST_TYPE_SIZE (INTERNET_CERTIFICATE_INFOW, 64) + TEST_TYPE_ALIGN (INTERNET_CERTIFICATE_INFOW, 8) + TEST_FIELD_SIZE (INTERNET_CERTIFICATE_INFOW, ftExpiry, 8) + TEST_FIELD_ALIGN (INTERNET_CERTIFICATE_INFOW, ftExpiry, 4) + TEST_FIELD_OFFSET(INTERNET_CERTIFICATE_INFOW, ftExpiry, 0) + TEST_FIELD_SIZE (INTERNET_CERTIFICATE_INFOW, ftStart, 8) + TEST_FIELD_ALIGN (INTERNET_CERTIFICATE_INFOW, ftStart, 4) + TEST_FIELD_OFFSET(INTERNET_CERTIFICATE_INFOW, ftStart, 8) + TEST_FIELD_SIZE (INTERNET_CERTIFICATE_INFOW, lpszSubjectInfo, 8) + TEST_FIELD_ALIGN (INTERNET_CERTIFICATE_INFOW, lpszSubjectInfo, 8) + TEST_FIELD_OFFSET(INTERNET_CERTIFICATE_INFOW, lpszSubjectInfo, 16) + TEST_FIELD_SIZE (INTERNET_CERTIFICATE_INFOW, lpszIssuerInfo, 8) + TEST_FIELD_ALIGN (INTERNET_CERTIFICATE_INFOW, lpszIssuerInfo, 8) + TEST_FIELD_OFFSET(INTERNET_CERTIFICATE_INFOW, lpszIssuerInfo, 24) + TEST_FIELD_SIZE (INTERNET_CERTIFICATE_INFOW, lpszProtocolName, 8) + TEST_FIELD_ALIGN (INTERNET_CERTIFICATE_INFOW, lpszProtocolName, 8) + TEST_FIELD_OFFSET(INTERNET_CERTIFICATE_INFOW, lpszProtocolName, 32) + TEST_FIELD_SIZE (INTERNET_CERTIFICATE_INFOW, lpszSignatureAlgName, 8) + TEST_FIELD_ALIGN (INTERNET_CERTIFICATE_INFOW, lpszSignatureAlgName, 8) + TEST_FIELD_OFFSET(INTERNET_CERTIFICATE_INFOW, lpszSignatureAlgName, 40) + TEST_FIELD_SIZE (INTERNET_CERTIFICATE_INFOW, lpszEncryptionAlgName, 8) + TEST_FIELD_ALIGN (INTERNET_CERTIFICATE_INFOW, lpszEncryptionAlgName, 8) + TEST_FIELD_OFFSET(INTERNET_CERTIFICATE_INFOW, lpszEncryptionAlgName, 48) + TEST_FIELD_SIZE (INTERNET_CERTIFICATE_INFOW, dwKeySize, 4) + TEST_FIELD_ALIGN (INTERNET_CERTIFICATE_INFOW, dwKeySize, 4) + TEST_FIELD_OFFSET(INTERNET_CERTIFICATE_INFOW, dwKeySize, 56) +} + +static void test_pack_INTERNET_CONNECTED_INFO(void) +{ + /* INTERNET_CONNECTED_INFO */ + TEST_TYPE_SIZE (INTERNET_CONNECTED_INFO, 8) + TEST_TYPE_ALIGN (INTERNET_CONNECTED_INFO, 4) + TEST_FIELD_SIZE (INTERNET_CONNECTED_INFO, dwConnectedState, 4) + TEST_FIELD_ALIGN (INTERNET_CONNECTED_INFO, dwConnectedState, 4) + TEST_FIELD_OFFSET(INTERNET_CONNECTED_INFO, dwConnectedState, 0) + TEST_FIELD_SIZE (INTERNET_CONNECTED_INFO, dwFlags, 4) + TEST_FIELD_ALIGN (INTERNET_CONNECTED_INFO, dwFlags, 4) + TEST_FIELD_OFFSET(INTERNET_CONNECTED_INFO, dwFlags, 4) +} + +static void test_pack_INTERNET_PORT(void) +{ + /* INTERNET_PORT */ + TEST_TYPE_SIZE (INTERNET_PORT, 2) + TEST_TYPE_ALIGN (INTERNET_PORT, 2) + TEST_TYPE_UNSIGNED(INTERNET_PORT) +} + +static void test_pack_INTERNET_PROXY_INFOA(void) +{ + /* INTERNET_PROXY_INFOA */ + TEST_TYPE_SIZE (INTERNET_PROXY_INFOA, 24) + TEST_TYPE_ALIGN (INTERNET_PROXY_INFOA, 8) + TEST_FIELD_SIZE (INTERNET_PROXY_INFOA, dwAccessType, 4) + TEST_FIELD_ALIGN (INTERNET_PROXY_INFOA, dwAccessType, 4) + TEST_FIELD_OFFSET(INTERNET_PROXY_INFOA, dwAccessType, 0) + TEST_FIELD_SIZE (INTERNET_PROXY_INFOA, lpszProxy, 8) + TEST_FIELD_ALIGN (INTERNET_PROXY_INFOA, lpszProxy, 8) + TEST_FIELD_OFFSET(INTERNET_PROXY_INFOA, lpszProxy, 8) + TEST_FIELD_SIZE (INTERNET_PROXY_INFOA, lpszProxyBypass, 8) + TEST_FIELD_ALIGN (INTERNET_PROXY_INFOA, lpszProxyBypass, 8) + TEST_FIELD_OFFSET(INTERNET_PROXY_INFOA, lpszProxyBypass, 16) +} + +static void test_pack_INTERNET_PROXY_INFOW(void) +{ + /* INTERNET_PROXY_INFOW */ + TEST_TYPE_SIZE (INTERNET_PROXY_INFOW, 24) + TEST_TYPE_ALIGN (INTERNET_PROXY_INFOW, 8) + TEST_FIELD_SIZE (INTERNET_PROXY_INFOW, dwAccessType, 4) + TEST_FIELD_ALIGN (INTERNET_PROXY_INFOW, dwAccessType, 4) + TEST_FIELD_OFFSET(INTERNET_PROXY_INFOW, dwAccessType, 0) + TEST_FIELD_SIZE (INTERNET_PROXY_INFOW, lpszProxy, 8) + TEST_FIELD_ALIGN (INTERNET_PROXY_INFOW, lpszProxy, 8) + TEST_FIELD_OFFSET(INTERNET_PROXY_INFOW, lpszProxy, 8) + TEST_FIELD_SIZE (INTERNET_PROXY_INFOW, lpszProxyBypass, 8) + TEST_FIELD_ALIGN (INTERNET_PROXY_INFOW, lpszProxyBypass, 8) + TEST_FIELD_OFFSET(INTERNET_PROXY_INFOW, lpszProxyBypass, 16) +} + +static void test_pack_INTERNET_STATUS_CALLBACK(void) +{ + /* INTERNET_STATUS_CALLBACK */ + TEST_TYPE_SIZE (INTERNET_STATUS_CALLBACK, 8) + TEST_TYPE_ALIGN (INTERNET_STATUS_CALLBACK, 8) +} + +static void test_pack_INTERNET_VERSION_INFO(void) +{ + /* INTERNET_VERSION_INFO */ + TEST_TYPE_SIZE (INTERNET_VERSION_INFO, 8) + TEST_TYPE_ALIGN (INTERNET_VERSION_INFO, 4) + TEST_FIELD_SIZE (INTERNET_VERSION_INFO, dwMajorVersion, 4) + TEST_FIELD_ALIGN (INTERNET_VERSION_INFO, dwMajorVersion, 4) + TEST_FIELD_OFFSET(INTERNET_VERSION_INFO, dwMajorVersion, 0) + TEST_FIELD_SIZE (INTERNET_VERSION_INFO, dwMinorVersion, 4) + TEST_FIELD_ALIGN (INTERNET_VERSION_INFO, dwMinorVersion, 4) + TEST_FIELD_OFFSET(INTERNET_VERSION_INFO, dwMinorVersion, 4) +} + +static void test_pack_LPGOPHER_ABSTRACT_ATTRIBUTE_TYPEA(void) +{ + /* LPGOPHER_ABSTRACT_ATTRIBUTE_TYPEA */ + TEST_TYPE_SIZE (LPGOPHER_ABSTRACT_ATTRIBUTE_TYPEA, 8) + TEST_TYPE_ALIGN (LPGOPHER_ABSTRACT_ATTRIBUTE_TYPEA, 8) + TEST_TARGET_SIZE (LPGOPHER_ABSTRACT_ATTRIBUTE_TYPEA, 16) + TEST_TARGET_ALIGN(LPGOPHER_ABSTRACT_ATTRIBUTE_TYPEA, 8) +} + +static void test_pack_LPGOPHER_ABSTRACT_ATTRIBUTE_TYPEW(void) +{ + /* LPGOPHER_ABSTRACT_ATTRIBUTE_TYPEW */ + TEST_TYPE_SIZE (LPGOPHER_ABSTRACT_ATTRIBUTE_TYPEW, 8) + TEST_TYPE_ALIGN (LPGOPHER_ABSTRACT_ATTRIBUTE_TYPEW, 8) + TEST_TARGET_SIZE (LPGOPHER_ABSTRACT_ATTRIBUTE_TYPEW, 16) + TEST_TARGET_ALIGN(LPGOPHER_ABSTRACT_ATTRIBUTE_TYPEW, 8) +} + +static void test_pack_LPGOPHER_ADMIN_ATTRIBUTE_TYPEA(void) +{ + /* LPGOPHER_ADMIN_ATTRIBUTE_TYPEA */ + TEST_TYPE_SIZE (LPGOPHER_ADMIN_ATTRIBUTE_TYPEA, 8) + TEST_TYPE_ALIGN (LPGOPHER_ADMIN_ATTRIBUTE_TYPEA, 8) + TEST_TARGET_SIZE (LPGOPHER_ADMIN_ATTRIBUTE_TYPEA, 16) + TEST_TARGET_ALIGN(LPGOPHER_ADMIN_ATTRIBUTE_TYPEA, 8) +} + +static void test_pack_LPGOPHER_ADMIN_ATTRIBUTE_TYPEW(void) +{ + /* LPGOPHER_ADMIN_ATTRIBUTE_TYPEW */ + TEST_TYPE_SIZE (LPGOPHER_ADMIN_ATTRIBUTE_TYPEW, 8) + TEST_TYPE_ALIGN (LPGOPHER_ADMIN_ATTRIBUTE_TYPEW, 8) + TEST_TARGET_SIZE (LPGOPHER_ADMIN_ATTRIBUTE_TYPEW, 16) + TEST_TARGET_ALIGN(LPGOPHER_ADMIN_ATTRIBUTE_TYPEW, 8) +} + +static void test_pack_LPGOPHER_ASK_ATTRIBUTE_TYPEA(void) +{ + /* LPGOPHER_ASK_ATTRIBUTE_TYPEA */ + TEST_TYPE_SIZE (LPGOPHER_ASK_ATTRIBUTE_TYPEA, 8) + TEST_TYPE_ALIGN (LPGOPHER_ASK_ATTRIBUTE_TYPEA, 8) + TEST_TARGET_SIZE (LPGOPHER_ASK_ATTRIBUTE_TYPEA, 16) + TEST_TARGET_ALIGN(LPGOPHER_ASK_ATTRIBUTE_TYPEA, 8) +} + +static void test_pack_LPGOPHER_ASK_ATTRIBUTE_TYPEW(void) +{ + /* LPGOPHER_ASK_ATTRIBUTE_TYPEW */ + TEST_TYPE_SIZE (LPGOPHER_ASK_ATTRIBUTE_TYPEW, 8) + TEST_TYPE_ALIGN (LPGOPHER_ASK_ATTRIBUTE_TYPEW, 8) + TEST_TARGET_SIZE (LPGOPHER_ASK_ATTRIBUTE_TYPEW, 16) + TEST_TARGET_ALIGN(LPGOPHER_ASK_ATTRIBUTE_TYPEW, 8) +} + +static void test_pack_LPGOPHER_ATTRIBUTE_TYPEA(void) +{ + /* LPGOPHER_ATTRIBUTE_TYPEA */ + TEST_TYPE_SIZE (LPGOPHER_ATTRIBUTE_TYPEA, 8) + TEST_TYPE_ALIGN (LPGOPHER_ATTRIBUTE_TYPEA, 8) +} + +static void test_pack_LPGOPHER_ATTRIBUTE_TYPEW(void) +{ + /* LPGOPHER_ATTRIBUTE_TYPEW */ + TEST_TYPE_SIZE (LPGOPHER_ATTRIBUTE_TYPEW, 8) + TEST_TYPE_ALIGN (LPGOPHER_ATTRIBUTE_TYPEW, 8) +} + +static void test_pack_LPGOPHER_FIND_DATAA(void) +{ + /* LPGOPHER_FIND_DATAA */ + TEST_TYPE_SIZE (LPGOPHER_FIND_DATAA, 8) + TEST_TYPE_ALIGN (LPGOPHER_FIND_DATAA, 8) + TEST_TARGET_SIZE (LPGOPHER_FIND_DATAA, 808) + TEST_TARGET_ALIGN(LPGOPHER_FIND_DATAA, 4) +} + +static void test_pack_LPGOPHER_FIND_DATAW(void) +{ + /* LPGOPHER_FIND_DATAW */ + TEST_TYPE_SIZE (LPGOPHER_FIND_DATAW, 8) + TEST_TYPE_ALIGN (LPGOPHER_FIND_DATAW, 8) + TEST_TARGET_SIZE (LPGOPHER_FIND_DATAW, 1588) + TEST_TARGET_ALIGN(LPGOPHER_FIND_DATAW, 4) +} + +static void test_pack_LPGOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE(void) +{ + /* LPGOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE */ + TEST_TYPE_SIZE (LPGOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, 8) + TEST_TYPE_ALIGN (LPGOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, 8) + TEST_TARGET_SIZE (LPGOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, 24) + TEST_TARGET_ALIGN(LPGOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, 4) +} + +static void test_pack_LPGOPHER_LOCATION_ATTRIBUTE_TYPEA(void) +{ + /* LPGOPHER_LOCATION_ATTRIBUTE_TYPEA */ + TEST_TYPE_SIZE (LPGOPHER_LOCATION_ATTRIBUTE_TYPEA, 8) + TEST_TYPE_ALIGN (LPGOPHER_LOCATION_ATTRIBUTE_TYPEA, 8) + TEST_TARGET_SIZE (LPGOPHER_LOCATION_ATTRIBUTE_TYPEA, 8) + TEST_TARGET_ALIGN(LPGOPHER_LOCATION_ATTRIBUTE_TYPEA, 8) +} + +static void test_pack_LPGOPHER_LOCATION_ATTRIBUTE_TYPEW(void) +{ + /* LPGOPHER_LOCATION_ATTRIBUTE_TYPEW */ + TEST_TYPE_SIZE (LPGOPHER_LOCATION_ATTRIBUTE_TYPEW, 8) + TEST_TYPE_ALIGN (LPGOPHER_LOCATION_ATTRIBUTE_TYPEW, 8) + TEST_TARGET_SIZE (LPGOPHER_LOCATION_ATTRIBUTE_TYPEW, 8) + TEST_TARGET_ALIGN(LPGOPHER_LOCATION_ATTRIBUTE_TYPEW, 8) +} + +static void test_pack_LPGOPHER_MOD_DATE_ATTRIBUTE_TYPE(void) +{ + /* LPGOPHER_MOD_DATE_ATTRIBUTE_TYPE */ + TEST_TYPE_SIZE (LPGOPHER_MOD_DATE_ATTRIBUTE_TYPE, 8) + TEST_TYPE_ALIGN (LPGOPHER_MOD_DATE_ATTRIBUTE_TYPE, 8) + TEST_TARGET_SIZE (LPGOPHER_MOD_DATE_ATTRIBUTE_TYPE, 8) + TEST_TARGET_ALIGN(LPGOPHER_MOD_DATE_ATTRIBUTE_TYPE, 4) +} + +static void test_pack_LPGOPHER_ORGANIZATION_ATTRIBUTE_TYPEA(void) +{ + /* LPGOPHER_ORGANIZATION_ATTRIBUTE_TYPEA */ + TEST_TYPE_SIZE (LPGOPHER_ORGANIZATION_ATTRIBUTE_TYPEA, 8) + TEST_TYPE_ALIGN (LPGOPHER_ORGANIZATION_ATTRIBUTE_TYPEA, 8) + TEST_TARGET_SIZE (LPGOPHER_ORGANIZATION_ATTRIBUTE_TYPEA, 8) + TEST_TARGET_ALIGN(LPGOPHER_ORGANIZATION_ATTRIBUTE_TYPEA, 8) +} + +static void test_pack_LPGOPHER_ORGANIZATION_ATTRIBUTE_TYPEW(void) +{ + /* LPGOPHER_ORGANIZATION_ATTRIBUTE_TYPEW */ + TEST_TYPE_SIZE (LPGOPHER_ORGANIZATION_ATTRIBUTE_TYPEW, 8) + TEST_TYPE_ALIGN (LPGOPHER_ORGANIZATION_ATTRIBUTE_TYPEW, 8) + TEST_TARGET_SIZE (LPGOPHER_ORGANIZATION_ATTRIBUTE_TYPEW, 8) + TEST_TARGET_ALIGN(LPGOPHER_ORGANIZATION_ATTRIBUTE_TYPEW, 8) +} + +static void test_pack_LPGOPHER_PROVIDER_ATTRIBUTE_TYPEA(void) +{ + /* LPGOPHER_PROVIDER_ATTRIBUTE_TYPEA */ + TEST_TYPE_SIZE (LPGOPHER_PROVIDER_ATTRIBUTE_TYPEA, 8) + TEST_TYPE_ALIGN (LPGOPHER_PROVIDER_ATTRIBUTE_TYPEA, 8) + TEST_TARGET_SIZE (LPGOPHER_PROVIDER_ATTRIBUTE_TYPEA, 8) + TEST_TARGET_ALIGN(LPGOPHER_PROVIDER_ATTRIBUTE_TYPEA, 8) +} + +static void test_pack_LPGOPHER_PROVIDER_ATTRIBUTE_TYPEW(void) +{ + /* LPGOPHER_PROVIDER_ATTRIBUTE_TYPEW */ + TEST_TYPE_SIZE (LPGOPHER_PROVIDER_ATTRIBUTE_TYPEW, 8) + TEST_TYPE_ALIGN (LPGOPHER_PROVIDER_ATTRIBUTE_TYPEW, 8) + TEST_TARGET_SIZE (LPGOPHER_PROVIDER_ATTRIBUTE_TYPEW, 8) + TEST_TARGET_ALIGN(LPGOPHER_PROVIDER_ATTRIBUTE_TYPEW, 8) +} + +static void test_pack_LPGOPHER_SCORE_ATTRIBUTE_TYPE(void) +{ + /* LPGOPHER_SCORE_ATTRIBUTE_TYPE */ + TEST_TYPE_SIZE (LPGOPHER_SCORE_ATTRIBUTE_TYPE, 8) + TEST_TYPE_ALIGN (LPGOPHER_SCORE_ATTRIBUTE_TYPE, 8) + TEST_TARGET_SIZE (LPGOPHER_SCORE_ATTRIBUTE_TYPE, 4) + TEST_TARGET_ALIGN(LPGOPHER_SCORE_ATTRIBUTE_TYPE, 4) +} + +static void test_pack_LPGOPHER_SCORE_RANGE_ATTRIBUTE_TYPE(void) +{ + /* LPGOPHER_SCORE_RANGE_ATTRIBUTE_TYPE */ + TEST_TYPE_SIZE (LPGOPHER_SCORE_RANGE_ATTRIBUTE_TYPE, 8) + TEST_TYPE_ALIGN (LPGOPHER_SCORE_RANGE_ATTRIBUTE_TYPE, 8) + TEST_TARGET_SIZE (LPGOPHER_SCORE_RANGE_ATTRIBUTE_TYPE, 8) + TEST_TARGET_ALIGN(LPGOPHER_SCORE_RANGE_ATTRIBUTE_TYPE, 4) +} + +static void test_pack_LPGOPHER_SITE_ATTRIBUTE_TYPEA(void) +{ + /* LPGOPHER_SITE_ATTRIBUTE_TYPEA */ + TEST_TYPE_SIZE (LPGOPHER_SITE_ATTRIBUTE_TYPEA, 8) + TEST_TYPE_ALIGN (LPGOPHER_SITE_ATTRIBUTE_TYPEA, 8) + TEST_TARGET_SIZE (LPGOPHER_SITE_ATTRIBUTE_TYPEA, 8) + TEST_TARGET_ALIGN(LPGOPHER_SITE_ATTRIBUTE_TYPEA, 8) +} + +static void test_pack_LPGOPHER_SITE_ATTRIBUTE_TYPEW(void) +{ + /* LPGOPHER_SITE_ATTRIBUTE_TYPEW */ + TEST_TYPE_SIZE (LPGOPHER_SITE_ATTRIBUTE_TYPEW, 8) + TEST_TYPE_ALIGN (LPGOPHER_SITE_ATTRIBUTE_TYPEW, 8) + TEST_TARGET_SIZE (LPGOPHER_SITE_ATTRIBUTE_TYPEW, 8) + TEST_TARGET_ALIGN(LPGOPHER_SITE_ATTRIBUTE_TYPEW, 8) +} + +static void test_pack_LPGOPHER_TIMEZONE_ATTRIBUTE_TYPE(void) +{ + /* LPGOPHER_TIMEZONE_ATTRIBUTE_TYPE */ + TEST_TYPE_SIZE (LPGOPHER_TIMEZONE_ATTRIBUTE_TYPE, 8) + TEST_TYPE_ALIGN (LPGOPHER_TIMEZONE_ATTRIBUTE_TYPE, 8) + TEST_TARGET_SIZE (LPGOPHER_TIMEZONE_ATTRIBUTE_TYPE, 4) + TEST_TARGET_ALIGN(LPGOPHER_TIMEZONE_ATTRIBUTE_TYPE, 4) +} + +static void test_pack_LPGOPHER_TTL_ATTRIBUTE_TYPE(void) +{ + /* LPGOPHER_TTL_ATTRIBUTE_TYPE */ + TEST_TYPE_SIZE (LPGOPHER_TTL_ATTRIBUTE_TYPE, 8) + TEST_TYPE_ALIGN (LPGOPHER_TTL_ATTRIBUTE_TYPE, 8) + TEST_TARGET_SIZE (LPGOPHER_TTL_ATTRIBUTE_TYPE, 4) + TEST_TARGET_ALIGN(LPGOPHER_TTL_ATTRIBUTE_TYPE, 4) +} + +static void test_pack_LPGOPHER_UNKNOWN_ATTRIBUTE_TYPEA(void) +{ + /* LPGOPHER_UNKNOWN_ATTRIBUTE_TYPEA */ + TEST_TYPE_SIZE (LPGOPHER_UNKNOWN_ATTRIBUTE_TYPEA, 8) + TEST_TYPE_ALIGN (LPGOPHER_UNKNOWN_ATTRIBUTE_TYPEA, 8) + TEST_TARGET_SIZE (LPGOPHER_UNKNOWN_ATTRIBUTE_TYPEA, 8) + TEST_TARGET_ALIGN(LPGOPHER_UNKNOWN_ATTRIBUTE_TYPEA, 8) +} + +static void test_pack_LPGOPHER_UNKNOWN_ATTRIBUTE_TYPEW(void) +{ + /* LPGOPHER_UNKNOWN_ATTRIBUTE_TYPEW */ + TEST_TYPE_SIZE (LPGOPHER_UNKNOWN_ATTRIBUTE_TYPEW, 8) + TEST_TYPE_ALIGN (LPGOPHER_UNKNOWN_ATTRIBUTE_TYPEW, 8) + TEST_TARGET_SIZE (LPGOPHER_UNKNOWN_ATTRIBUTE_TYPEW, 8) + TEST_TARGET_ALIGN(LPGOPHER_UNKNOWN_ATTRIBUTE_TYPEW, 8) +} + +static void test_pack_LPGOPHER_VERONICA_ATTRIBUTE_TYPE(void) +{ + /* LPGOPHER_VERONICA_ATTRIBUTE_TYPE */ + TEST_TYPE_SIZE (LPGOPHER_VERONICA_ATTRIBUTE_TYPE, 8) + TEST_TYPE_ALIGN (LPGOPHER_VERONICA_ATTRIBUTE_TYPE, 8) + TEST_TARGET_SIZE (LPGOPHER_VERONICA_ATTRIBUTE_TYPE, 4) + TEST_TARGET_ALIGN(LPGOPHER_VERONICA_ATTRIBUTE_TYPE, 4) +} + +static void test_pack_LPGOPHER_VERSION_ATTRIBUTE_TYPEA(void) +{ + /* LPGOPHER_VERSION_ATTRIBUTE_TYPEA */ + TEST_TYPE_SIZE (LPGOPHER_VERSION_ATTRIBUTE_TYPEA, 8) + TEST_TYPE_ALIGN (LPGOPHER_VERSION_ATTRIBUTE_TYPEA, 8) + TEST_TARGET_SIZE (LPGOPHER_VERSION_ATTRIBUTE_TYPEA, 8) + TEST_TARGET_ALIGN(LPGOPHER_VERSION_ATTRIBUTE_TYPEA, 8) +} + +static void test_pack_LPGOPHER_VERSION_ATTRIBUTE_TYPEW(void) +{ + /* LPGOPHER_VERSION_ATTRIBUTE_TYPEW */ + TEST_TYPE_SIZE (LPGOPHER_VERSION_ATTRIBUTE_TYPEW, 8) + TEST_TYPE_ALIGN (LPGOPHER_VERSION_ATTRIBUTE_TYPEW, 8) + TEST_TARGET_SIZE (LPGOPHER_VERSION_ATTRIBUTE_TYPEW, 8) + TEST_TARGET_ALIGN(LPGOPHER_VERSION_ATTRIBUTE_TYPEW, 8) +} + +static void test_pack_LPGOPHER_VIEW_ATTRIBUTE_TYPEA(void) +{ + /* LPGOPHER_VIEW_ATTRIBUTE_TYPEA */ + TEST_TYPE_SIZE (LPGOPHER_VIEW_ATTRIBUTE_TYPEA, 8) + TEST_TYPE_ALIGN (LPGOPHER_VIEW_ATTRIBUTE_TYPEA, 8) + TEST_TARGET_SIZE (LPGOPHER_VIEW_ATTRIBUTE_TYPEA, 24) + TEST_TARGET_ALIGN(LPGOPHER_VIEW_ATTRIBUTE_TYPEA, 8) +} + +static void test_pack_LPGOPHER_VIEW_ATTRIBUTE_TYPEW(void) +{ + /* LPGOPHER_VIEW_ATTRIBUTE_TYPEW */ + TEST_TYPE_SIZE (LPGOPHER_VIEW_ATTRIBUTE_TYPEW, 8) + TEST_TYPE_ALIGN (LPGOPHER_VIEW_ATTRIBUTE_TYPEW, 8) + TEST_TARGET_SIZE (LPGOPHER_VIEW_ATTRIBUTE_TYPEW, 24) + TEST_TARGET_ALIGN(LPGOPHER_VIEW_ATTRIBUTE_TYPEW, 8) +} + +static void test_pack_LPHINTERNET(void) +{ + /* LPHINTERNET */ + TEST_TYPE_SIZE (LPHINTERNET, 8) + TEST_TYPE_ALIGN (LPHINTERNET, 8) + TEST_TARGET_SIZE (LPHINTERNET, 8) + TEST_TARGET_ALIGN(LPHINTERNET, 8) +} + +static void test_pack_LPHTTP_VERSION_INFO(void) +{ + /* LPHTTP_VERSION_INFO */ + TEST_TYPE_SIZE (LPHTTP_VERSION_INFO, 8) + TEST_TYPE_ALIGN (LPHTTP_VERSION_INFO, 8) + TEST_TARGET_SIZE (LPHTTP_VERSION_INFO, 8) + TEST_TARGET_ALIGN(LPHTTP_VERSION_INFO, 4) +} + +static void test_pack_LPINTERNET_ASYNC_RESULT(void) +{ + /* LPINTERNET_ASYNC_RESULT */ + TEST_TYPE_SIZE (LPINTERNET_ASYNC_RESULT, 8) + TEST_TYPE_ALIGN (LPINTERNET_ASYNC_RESULT, 8) + TEST_TARGET_SIZE (LPINTERNET_ASYNC_RESULT, 16) + TEST_TARGET_ALIGN(LPINTERNET_ASYNC_RESULT, 8) +} + +static void test_pack_LPINTERNET_BUFFERSA(void) +{ + /* LPINTERNET_BUFFERSA */ + TEST_TYPE_SIZE (LPINTERNET_BUFFERSA, 8) + TEST_TYPE_ALIGN (LPINTERNET_BUFFERSA, 8) + TEST_TARGET_SIZE (LPINTERNET_BUFFERSA, 56) + TEST_TARGET_ALIGN(LPINTERNET_BUFFERSA, 8) +} + +static void test_pack_LPINTERNET_BUFFERSW(void) +{ + /* LPINTERNET_BUFFERSW */ + TEST_TYPE_SIZE (LPINTERNET_BUFFERSW, 8) + TEST_TYPE_ALIGN (LPINTERNET_BUFFERSW, 8) + TEST_TARGET_SIZE (LPINTERNET_BUFFERSW, 56) + TEST_TARGET_ALIGN(LPINTERNET_BUFFERSW, 8) +} + +static void test_pack_LPINTERNET_CACHE_ENTRY_INFOA(void) +{ + /* LPINTERNET_CACHE_ENTRY_INFOA */ + TEST_TYPE_SIZE (LPINTERNET_CACHE_ENTRY_INFOA, 8) + TEST_TYPE_ALIGN (LPINTERNET_CACHE_ENTRY_INFOA, 8) +} + +static void test_pack_LPINTERNET_CACHE_ENTRY_INFOW(void) +{ + /* LPINTERNET_CACHE_ENTRY_INFOW */ + TEST_TYPE_SIZE (LPINTERNET_CACHE_ENTRY_INFOW, 8) + TEST_TYPE_ALIGN (LPINTERNET_CACHE_ENTRY_INFOW, 8) +} + +static void test_pack_LPINTERNET_CERTIFICATE_INFOA(void) +{ + /* LPINTERNET_CERTIFICATE_INFOA */ + TEST_TYPE_SIZE (LPINTERNET_CERTIFICATE_INFOA, 8) + TEST_TYPE_ALIGN (LPINTERNET_CERTIFICATE_INFOA, 8) + TEST_TARGET_SIZE (LPINTERNET_CERTIFICATE_INFOA, 64) + TEST_TARGET_ALIGN(LPINTERNET_CERTIFICATE_INFOA, 8) +} + +static void test_pack_LPINTERNET_CERTIFICATE_INFOW(void) +{ + /* LPINTERNET_CERTIFICATE_INFOW */ + TEST_TYPE_SIZE (LPINTERNET_CERTIFICATE_INFOW, 8) + TEST_TYPE_ALIGN (LPINTERNET_CERTIFICATE_INFOW, 8) + TEST_TARGET_SIZE (LPINTERNET_CERTIFICATE_INFOW, 64) + TEST_TARGET_ALIGN(LPINTERNET_CERTIFICATE_INFOW, 8) +} + +static void test_pack_LPINTERNET_CONNECTED_INFO(void) +{ + /* LPINTERNET_CONNECTED_INFO */ + TEST_TYPE_SIZE (LPINTERNET_CONNECTED_INFO, 8) + TEST_TYPE_ALIGN (LPINTERNET_CONNECTED_INFO, 8) + TEST_TARGET_SIZE (LPINTERNET_CONNECTED_INFO, 8) + TEST_TARGET_ALIGN(LPINTERNET_CONNECTED_INFO, 4) +} + +static void test_pack_LPINTERNET_PORT(void) +{ + /* LPINTERNET_PORT */ + TEST_TYPE_SIZE (LPINTERNET_PORT, 8) + TEST_TYPE_ALIGN (LPINTERNET_PORT, 8) + TEST_TARGET_SIZE (LPINTERNET_PORT, 2) + TEST_TARGET_ALIGN(LPINTERNET_PORT, 2) +} + +static void test_pack_LPINTERNET_PROXY_INFOA(void) +{ + /* LPINTERNET_PROXY_INFOA */ + TEST_TYPE_SIZE (LPINTERNET_PROXY_INFOA, 8) + TEST_TYPE_ALIGN (LPINTERNET_PROXY_INFOA, 8) + TEST_TARGET_SIZE (LPINTERNET_PROXY_INFOA, 24) + TEST_TARGET_ALIGN(LPINTERNET_PROXY_INFOA, 8) +} + +static void test_pack_LPINTERNET_PROXY_INFOW(void) +{ + /* LPINTERNET_PROXY_INFOW */ + TEST_TYPE_SIZE (LPINTERNET_PROXY_INFOW, 8) + TEST_TYPE_ALIGN (LPINTERNET_PROXY_INFOW, 8) + TEST_TARGET_SIZE (LPINTERNET_PROXY_INFOW, 24) + TEST_TARGET_ALIGN(LPINTERNET_PROXY_INFOW, 8) +} + +static void test_pack_LPINTERNET_STATUS_CALLBACK(void) +{ + /* LPINTERNET_STATUS_CALLBACK */ + TEST_TYPE_SIZE (LPINTERNET_STATUS_CALLBACK, 8) + TEST_TYPE_ALIGN (LPINTERNET_STATUS_CALLBACK, 8) + TEST_TARGET_SIZE (LPINTERNET_STATUS_CALLBACK, 8) + TEST_TARGET_ALIGN(LPINTERNET_STATUS_CALLBACK, 8) +} + +static void test_pack_LPINTERNET_VERSION_INFO(void) +{ + /* LPINTERNET_VERSION_INFO */ + TEST_TYPE_SIZE (LPINTERNET_VERSION_INFO, 8) + TEST_TYPE_ALIGN (LPINTERNET_VERSION_INFO, 8) + TEST_TARGET_SIZE (LPINTERNET_VERSION_INFO, 8) + TEST_TARGET_ALIGN(LPINTERNET_VERSION_INFO, 4) +} + +static void test_pack_LPURL_COMPONENTSA(void) +{ + /* LPURL_COMPONENTSA */ + TEST_TYPE_SIZE (LPURL_COMPONENTSA, 8) + TEST_TYPE_ALIGN (LPURL_COMPONENTSA, 8) +} + +static void test_pack_LPURL_COMPONENTSW(void) +{ + /* LPURL_COMPONENTSW */ + TEST_TYPE_SIZE (LPURL_COMPONENTSW, 8) + TEST_TYPE_ALIGN (LPURL_COMPONENTSW, 8) +} + +static void test_pack_PFN_AUTH_NOTIFY(void) +{ + /* PFN_AUTH_NOTIFY */ + TEST_TYPE_SIZE (PFN_AUTH_NOTIFY, 8) + TEST_TYPE_ALIGN (PFN_AUTH_NOTIFY, 8) +} + +static void test_pack_PFN_DIAL_HANDLER(void) +{ + /* PFN_DIAL_HANDLER */ + TEST_TYPE_SIZE (PFN_DIAL_HANDLER, 8) + TEST_TYPE_ALIGN (PFN_DIAL_HANDLER, 8) +} + +static void test_pack_URL_COMPONENTSA(void) +{ + /* URL_COMPONENTSA */ + TEST_FIELD_SIZE (URL_COMPONENTSA, dwStructSize, 4) + TEST_FIELD_ALIGN (URL_COMPONENTSA, dwStructSize, 4) + TEST_FIELD_OFFSET(URL_COMPONENTSA, dwStructSize, 0) + TEST_FIELD_SIZE (URL_COMPONENTSA, lpszScheme, 8) + TEST_FIELD_ALIGN (URL_COMPONENTSA, lpszScheme, 8) + TEST_FIELD_OFFSET(URL_COMPONENTSA, lpszScheme, 8) + TEST_FIELD_SIZE (URL_COMPONENTSA, dwSchemeLength, 4) + TEST_FIELD_ALIGN (URL_COMPONENTSA, dwSchemeLength, 4) + TEST_FIELD_OFFSET(URL_COMPONENTSA, dwSchemeLength, 16) +} + +static void test_pack_URL_COMPONENTSW(void) +{ + /* URL_COMPONENTSW */ + TEST_FIELD_SIZE (URL_COMPONENTSW, dwStructSize, 4) + TEST_FIELD_ALIGN (URL_COMPONENTSW, dwStructSize, 4) + TEST_FIELD_OFFSET(URL_COMPONENTSW, dwStructSize, 0) + TEST_FIELD_SIZE (URL_COMPONENTSW, lpszScheme, 8) + TEST_FIELD_ALIGN (URL_COMPONENTSW, lpszScheme, 8) + TEST_FIELD_OFFSET(URL_COMPONENTSW, lpszScheme, 8) + TEST_FIELD_SIZE (URL_COMPONENTSW, dwSchemeLength, 4) + TEST_FIELD_ALIGN (URL_COMPONENTSW, dwSchemeLength, 4) + TEST_FIELD_OFFSET(URL_COMPONENTSW, dwSchemeLength, 16) +} + +#else /* _WIN64 */ + +static void test_pack_GOPHER_ABSTRACT_ATTRIBUTE_TYPEA(void) +{ + /* GOPHER_ABSTRACT_ATTRIBUTE_TYPEA */ TEST_TYPE_SIZE (GOPHER_ABSTRACT_ATTRIBUTE_TYPEA, 8) TEST_TYPE_ALIGN (GOPHER_ABSTRACT_ATTRIBUTE_TYPEA, 4) TEST_FIELD_SIZE (GOPHER_ABSTRACT_ATTRIBUTE_TYPEA, ShortAbstract, 4) @@ -106,7 +1333,7 @@ static void test_pack_GOPHER_ABSTRACT_ATTRIBUTE_TYPEA(void) static void test_pack_GOPHER_ABSTRACT_ATTRIBUTE_TYPEW(void) { - /* GOPHER_ABSTRACT_ATTRIBUTE_TYPEW (pack 4) */ + /* GOPHER_ABSTRACT_ATTRIBUTE_TYPEW */ TEST_TYPE_SIZE (GOPHER_ABSTRACT_ATTRIBUTE_TYPEW, 8) TEST_TYPE_ALIGN (GOPHER_ABSTRACT_ATTRIBUTE_TYPEW, 4) TEST_FIELD_SIZE (GOPHER_ABSTRACT_ATTRIBUTE_TYPEW, ShortAbstract, 4) @@ -119,7 +1346,7 @@ static void test_pack_GOPHER_ABSTRACT_ATTRIBUTE_TYPEW(void) static void test_pack_GOPHER_ADMIN_ATTRIBUTE_TYPEA(void) { - /* GOPHER_ADMIN_ATTRIBUTE_TYPEA (pack 4) */ + /* GOPHER_ADMIN_ATTRIBUTE_TYPEA */ TEST_TYPE_SIZE (GOPHER_ADMIN_ATTRIBUTE_TYPEA, 8) TEST_TYPE_ALIGN (GOPHER_ADMIN_ATTRIBUTE_TYPEA, 4) TEST_FIELD_SIZE (GOPHER_ADMIN_ATTRIBUTE_TYPEA, Comment, 4) @@ -132,7 +1359,7 @@ static void test_pack_GOPHER_ADMIN_ATTRIBUTE_TYPEA(void) static void test_pack_GOPHER_ADMIN_ATTRIBUTE_TYPEW(void) { - /* GOPHER_ADMIN_ATTRIBUTE_TYPEW (pack 4) */ + /* GOPHER_ADMIN_ATTRIBUTE_TYPEW */ TEST_TYPE_SIZE (GOPHER_ADMIN_ATTRIBUTE_TYPEW, 8) TEST_TYPE_ALIGN (GOPHER_ADMIN_ATTRIBUTE_TYPEW, 4) TEST_FIELD_SIZE (GOPHER_ADMIN_ATTRIBUTE_TYPEW, Comment, 4) @@ -145,7 +1372,7 @@ static void test_pack_GOPHER_ADMIN_ATTRIBUTE_TYPEW(void) static void test_pack_GOPHER_ASK_ATTRIBUTE_TYPEA(void) { - /* GOPHER_ASK_ATTRIBUTE_TYPEA (pack 4) */ + /* GOPHER_ASK_ATTRIBUTE_TYPEA */ TEST_TYPE_SIZE (GOPHER_ASK_ATTRIBUTE_TYPEA, 8) TEST_TYPE_ALIGN (GOPHER_ASK_ATTRIBUTE_TYPEA, 4) TEST_FIELD_SIZE (GOPHER_ASK_ATTRIBUTE_TYPEA, QuestionType, 4) @@ -158,7 +1385,7 @@ static void test_pack_GOPHER_ASK_ATTRIBUTE_TYPEA(void) static void test_pack_GOPHER_ASK_ATTRIBUTE_TYPEW(void) { - /* GOPHER_ASK_ATTRIBUTE_TYPEW (pack 4) */ + /* GOPHER_ASK_ATTRIBUTE_TYPEW */ TEST_TYPE_SIZE (GOPHER_ASK_ATTRIBUTE_TYPEW, 8) TEST_TYPE_ALIGN (GOPHER_ASK_ATTRIBUTE_TYPEW, 4) TEST_FIELD_SIZE (GOPHER_ASK_ATTRIBUTE_TYPEW, QuestionType, 4) @@ -185,7 +1412,7 @@ static void test_pack_GOPHER_ATTRIBUTE_ENUMERATORW(void) static void test_pack_GOPHER_ATTRIBUTE_TYPEA(void) { - /* GOPHER_ATTRIBUTE_TYPEA (pack 4) */ + /* GOPHER_ATTRIBUTE_TYPEA */ TEST_FIELD_SIZE (GOPHER_ATTRIBUTE_TYPEA, CategoryId, 4) TEST_FIELD_ALIGN (GOPHER_ATTRIBUTE_TYPEA, CategoryId, 4) TEST_FIELD_OFFSET(GOPHER_ATTRIBUTE_TYPEA, CategoryId, 0) @@ -196,7 +1423,7 @@ static void test_pack_GOPHER_ATTRIBUTE_TYPEA(void) static void test_pack_GOPHER_ATTRIBUTE_TYPEW(void) { - /* GOPHER_ATTRIBUTE_TYPEW (pack 4) */ + /* GOPHER_ATTRIBUTE_TYPEW */ TEST_FIELD_SIZE (GOPHER_ATTRIBUTE_TYPEW, CategoryId, 4) TEST_FIELD_ALIGN (GOPHER_ATTRIBUTE_TYPEW, CategoryId, 4) TEST_FIELD_OFFSET(GOPHER_ATTRIBUTE_TYPEW, CategoryId, 0) @@ -207,7 +1434,7 @@ static void test_pack_GOPHER_ATTRIBUTE_TYPEW(void) static void test_pack_GOPHER_FIND_DATAA(void) { - /* GOPHER_FIND_DATAA (pack 4) */ + /* GOPHER_FIND_DATAA */ TEST_TYPE_SIZE (GOPHER_FIND_DATAA, 808) TEST_TYPE_ALIGN (GOPHER_FIND_DATAA, 4) TEST_FIELD_SIZE (GOPHER_FIND_DATAA, DisplayString, 129) @@ -232,7 +1459,7 @@ static void test_pack_GOPHER_FIND_DATAA(void) static void test_pack_GOPHER_FIND_DATAW(void) { - /* GOPHER_FIND_DATAW (pack 4) */ + /* GOPHER_FIND_DATAW */ TEST_TYPE_SIZE (GOPHER_FIND_DATAW, 1588) TEST_TYPE_ALIGN (GOPHER_FIND_DATAW, 4) TEST_FIELD_SIZE (GOPHER_FIND_DATAW, DisplayString, 258) @@ -257,7 +1484,7 @@ static void test_pack_GOPHER_FIND_DATAW(void) static void test_pack_GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE(void) { - /* GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE (pack 4) */ + /* GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE */ TEST_TYPE_SIZE (GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, 24) TEST_TYPE_ALIGN (GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, 4) TEST_FIELD_SIZE (GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE, DegreesNorth, 4) @@ -282,7 +1509,7 @@ static void test_pack_GOPHER_GEOGRAPHICAL_LOCATION_ATTRIBUTE_TYPE(void) static void test_pack_GOPHER_LOCATION_ATTRIBUTE_TYPEA(void) { - /* GOPHER_LOCATION_ATTRIBUTE_TYPEA (pack 4) */ + /* GOPHER_LOCATION_ATTRIBUTE_TYPEA */ TEST_TYPE_SIZE (GOPHER_LOCATION_ATTRIBUTE_TYPEA, 4) TEST_TYPE_ALIGN (GOPHER_LOCATION_ATTRIBUTE_TYPEA, 4) TEST_FIELD_SIZE (GOPHER_LOCATION_ATTRIBUTE_TYPEA, Location, 4) @@ -292,7 +1519,7 @@ static void test_pack_GOPHER_LOCATION_ATTRIBUTE_TYPEA(void) static void test_pack_GOPHER_LOCATION_ATTRIBUTE_TYPEW(void) { - /* GOPHER_LOCATION_ATTRIBUTE_TYPEW (pack 4) */ + /* GOPHER_LOCATION_ATTRIBUTE_TYPEW */ TEST_TYPE_SIZE (GOPHER_LOCATION_ATTRIBUTE_TYPEW, 4) TEST_TYPE_ALIGN (GOPHER_LOCATION_ATTRIBUTE_TYPEW, 4) TEST_FIELD_SIZE (GOPHER_LOCATION_ATTRIBUTE_TYPEW, Location, 4) @@ -302,7 +1529,7 @@ static void test_pack_GOPHER_LOCATION_ATTRIBUTE_TYPEW(void) static void test_pack_GOPHER_MOD_DATE_ATTRIBUTE_TYPE(void) { - /* GOPHER_MOD_DATE_ATTRIBUTE_TYPE (pack 4) */ + /* GOPHER_MOD_DATE_ATTRIBUTE_TYPE */ TEST_TYPE_SIZE (GOPHER_MOD_DATE_ATTRIBUTE_TYPE, 8) TEST_TYPE_ALIGN (GOPHER_MOD_DATE_ATTRIBUTE_TYPE, 4) TEST_FIELD_SIZE (GOPHER_MOD_DATE_ATTRIBUTE_TYPE, DateAndTime, 8) @@ -312,7 +1539,7 @@ static void test_pack_GOPHER_MOD_DATE_ATTRIBUTE_TYPE(void) static void test_pack_GOPHER_ORGANIZATION_ATTRIBUTE_TYPEA(void) { - /* GOPHER_ORGANIZATION_ATTRIBUTE_TYPEA (pack 4) */ + /* GOPHER_ORGANIZATION_ATTRIBUTE_TYPEA */ TEST_TYPE_SIZE (GOPHER_ORGANIZATION_ATTRIBUTE_TYPEA, 4) TEST_TYPE_ALIGN (GOPHER_ORGANIZATION_ATTRIBUTE_TYPEA, 4) TEST_FIELD_SIZE (GOPHER_ORGANIZATION_ATTRIBUTE_TYPEA, Organization, 4) @@ -322,7 +1549,7 @@ static void test_pack_GOPHER_ORGANIZATION_ATTRIBUTE_TYPEA(void) static void test_pack_GOPHER_ORGANIZATION_ATTRIBUTE_TYPEW(void) { - /* GOPHER_ORGANIZATION_ATTRIBUTE_TYPEW (pack 4) */ + /* GOPHER_ORGANIZATION_ATTRIBUTE_TYPEW */ TEST_TYPE_SIZE (GOPHER_ORGANIZATION_ATTRIBUTE_TYPEW, 4) TEST_TYPE_ALIGN (GOPHER_ORGANIZATION_ATTRIBUTE_TYPEW, 4) TEST_FIELD_SIZE (GOPHER_ORGANIZATION_ATTRIBUTE_TYPEW, Organization, 4) @@ -332,7 +1559,7 @@ static void test_pack_GOPHER_ORGANIZATION_ATTRIBUTE_TYPEW(void) static void test_pack_GOPHER_PROVIDER_ATTRIBUTE_TYPEA(void) { - /* GOPHER_PROVIDER_ATTRIBUTE_TYPEA (pack 4) */ + /* GOPHER_PROVIDER_ATTRIBUTE_TYPEA */ TEST_TYPE_SIZE (GOPHER_PROVIDER_ATTRIBUTE_TYPEA, 4) TEST_TYPE_ALIGN (GOPHER_PROVIDER_ATTRIBUTE_TYPEA, 4) TEST_FIELD_SIZE (GOPHER_PROVIDER_ATTRIBUTE_TYPEA, Provider, 4) @@ -342,7 +1569,7 @@ static void test_pack_GOPHER_PROVIDER_ATTRIBUTE_TYPEA(void) static void test_pack_GOPHER_PROVIDER_ATTRIBUTE_TYPEW(void) { - /* GOPHER_PROVIDER_ATTRIBUTE_TYPEW (pack 4) */ + /* GOPHER_PROVIDER_ATTRIBUTE_TYPEW */ TEST_TYPE_SIZE (GOPHER_PROVIDER_ATTRIBUTE_TYPEW, 4) TEST_TYPE_ALIGN (GOPHER_PROVIDER_ATTRIBUTE_TYPEW, 4) TEST_FIELD_SIZE (GOPHER_PROVIDER_ATTRIBUTE_TYPEW, Provider, 4) @@ -352,7 +1579,7 @@ static void test_pack_GOPHER_PROVIDER_ATTRIBUTE_TYPEW(void) static void test_pack_GOPHER_SCORE_ATTRIBUTE_TYPE(void) { - /* GOPHER_SCORE_ATTRIBUTE_TYPE (pack 4) */ + /* GOPHER_SCORE_ATTRIBUTE_TYPE */ TEST_TYPE_SIZE (GOPHER_SCORE_ATTRIBUTE_TYPE, 4) TEST_TYPE_ALIGN (GOPHER_SCORE_ATTRIBUTE_TYPE, 4) TEST_FIELD_SIZE (GOPHER_SCORE_ATTRIBUTE_TYPE, Score, 4) @@ -362,7 +1589,7 @@ static void test_pack_GOPHER_SCORE_ATTRIBUTE_TYPE(void) static void test_pack_GOPHER_SCORE_RANGE_ATTRIBUTE_TYPE(void) { - /* GOPHER_SCORE_RANGE_ATTRIBUTE_TYPE (pack 4) */ + /* GOPHER_SCORE_RANGE_ATTRIBUTE_TYPE */ TEST_TYPE_SIZE (GOPHER_SCORE_RANGE_ATTRIBUTE_TYPE, 8) TEST_TYPE_ALIGN (GOPHER_SCORE_RANGE_ATTRIBUTE_TYPE, 4) TEST_FIELD_SIZE (GOPHER_SCORE_RANGE_ATTRIBUTE_TYPE, LowerBound, 4) @@ -375,7 +1602,7 @@ static void test_pack_GOPHER_SCORE_RANGE_ATTRIBUTE_TYPE(void) static void test_pack_GOPHER_SITE_ATTRIBUTE_TYPEA(void) { - /* GOPHER_SITE_ATTRIBUTE_TYPEA (pack 4) */ + /* GOPHER_SITE_ATTRIBUTE_TYPEA */ TEST_TYPE_SIZE (GOPHER_SITE_ATTRIBUTE_TYPEA, 4) TEST_TYPE_ALIGN (GOPHER_SITE_ATTRIBUTE_TYPEA, 4) TEST_FIELD_SIZE (GOPHER_SITE_ATTRIBUTE_TYPEA, Site, 4) @@ -385,7 +1612,7 @@ static void test_pack_GOPHER_SITE_ATTRIBUTE_TYPEA(void) static void test_pack_GOPHER_SITE_ATTRIBUTE_TYPEW(void) { - /* GOPHER_SITE_ATTRIBUTE_TYPEW (pack 4) */ + /* GOPHER_SITE_ATTRIBUTE_TYPEW */ TEST_TYPE_SIZE (GOPHER_SITE_ATTRIBUTE_TYPEW, 4) TEST_TYPE_ALIGN (GOPHER_SITE_ATTRIBUTE_TYPEW, 4) TEST_FIELD_SIZE (GOPHER_SITE_ATTRIBUTE_TYPEW, Site, 4) @@ -395,7 +1622,7 @@ static void test_pack_GOPHER_SITE_ATTRIBUTE_TYPEW(void) static void test_pack_GOPHER_TIMEZONE_ATTRIBUTE_TYPE(void) { - /* GOPHER_TIMEZONE_ATTRIBUTE_TYPE (pack 4) */ + /* GOPHER_TIMEZONE_ATTRIBUTE_TYPE */ TEST_TYPE_SIZE (GOPHER_TIMEZONE_ATTRIBUTE_TYPE, 4) TEST_TYPE_ALIGN (GOPHER_TIMEZONE_ATTRIBUTE_TYPE, 4) TEST_FIELD_SIZE (GOPHER_TIMEZONE_ATTRIBUTE_TYPE, Zone, 4) @@ -405,7 +1632,7 @@ static void test_pack_GOPHER_TIMEZONE_ATTRIBUTE_TYPE(void) static void test_pack_GOPHER_TTL_ATTRIBUTE_TYPE(void) { - /* GOPHER_TTL_ATTRIBUTE_TYPE (pack 4) */ + /* GOPHER_TTL_ATTRIBUTE_TYPE */ TEST_TYPE_SIZE (GOPHER_TTL_ATTRIBUTE_TYPE, 4) TEST_TYPE_ALIGN (GOPHER_TTL_ATTRIBUTE_TYPE, 4) TEST_FIELD_SIZE (GOPHER_TTL_ATTRIBUTE_TYPE, Ttl, 4) @@ -415,7 +1642,7 @@ static void test_pack_GOPHER_TTL_ATTRIBUTE_TYPE(void) static void test_pack_GOPHER_UNKNOWN_ATTRIBUTE_TYPEA(void) { - /* GOPHER_UNKNOWN_ATTRIBUTE_TYPEA (pack 4) */ + /* GOPHER_UNKNOWN_ATTRIBUTE_TYPEA */ TEST_TYPE_SIZE (GOPHER_UNKNOWN_ATTRIBUTE_TYPEA, 4) TEST_TYPE_ALIGN (GOPHER_UNKNOWN_ATTRIBUTE_TYPEA, 4) TEST_FIELD_SIZE (GOPHER_UNKNOWN_ATTRIBUTE_TYPEA, Text, 4) @@ -425,7 +1652,7 @@ static void test_pack_GOPHER_UNKNOWN_ATTRIBUTE_TYPEA(void) static void test_pack_GOPHER_UNKNOWN_ATTRIBUTE_TYPEW(void) { - /* GOPHER_UNKNOWN_ATTRIBUTE_TYPEW (pack 4) */ + /* GOPHER_UNKNOWN_ATTRIBUTE_TYPEW */ TEST_TYPE_SIZE (GOPHER_UNKNOWN_ATTRIBUTE_TYPEW, 4) TEST_TYPE_ALIGN (GOPHER_UNKNOWN_ATTRIBUTE_TYPEW, 4) TEST_FIELD_SIZE (GOPHER_UNKNOWN_ATTRIBUTE_TYPEW, Text, 4) @@ -435,7 +1662,7 @@ static void test_pack_GOPHER_UNKNOWN_ATTRIBUTE_TYPEW(void) static void test_pack_GOPHER_VERONICA_ATTRIBUTE_TYPE(void) { - /* GOPHER_VERONICA_ATTRIBUTE_TYPE (pack 4) */ + /* GOPHER_VERONICA_ATTRIBUTE_TYPE */ TEST_TYPE_SIZE (GOPHER_VERONICA_ATTRIBUTE_TYPE, 4) TEST_TYPE_ALIGN (GOPHER_VERONICA_ATTRIBUTE_TYPE, 4) TEST_FIELD_SIZE (GOPHER_VERONICA_ATTRIBUTE_TYPE, TreeWalk, 4) @@ -445,7 +1672,7 @@ static void test_pack_GOPHER_VERONICA_ATTRIBUTE_TYPE(void) static void test_pack_GOPHER_VERSION_ATTRIBUTE_TYPEA(void) { - /* GOPHER_VERSION_ATTRIBUTE_TYPEA (pack 4) */ + /* GOPHER_VERSION_ATTRIBUTE_TYPEA */ TEST_TYPE_SIZE (GOPHER_VERSION_ATTRIBUTE_TYPEA, 4) TEST_TYPE_ALIGN (GOPHER_VERSION_ATTRIBUTE_TYPEA, 4) TEST_FIELD_SIZE (GOPHER_VERSION_ATTRIBUTE_TYPEA, Version, 4) @@ -455,7 +1682,7 @@ static void test_pack_GOPHER_VERSION_ATTRIBUTE_TYPEA(void) static void test_pack_GOPHER_VERSION_ATTRIBUTE_TYPEW(void) { - /* GOPHER_VERSION_ATTRIBUTE_TYPEW (pack 4) */ + /* GOPHER_VERSION_ATTRIBUTE_TYPEW */ TEST_TYPE_SIZE (GOPHER_VERSION_ATTRIBUTE_TYPEW, 4) TEST_TYPE_ALIGN (GOPHER_VERSION_ATTRIBUTE_TYPEW, 4) TEST_FIELD_SIZE (GOPHER_VERSION_ATTRIBUTE_TYPEW, Version, 4) @@ -465,7 +1692,7 @@ static void test_pack_GOPHER_VERSION_ATTRIBUTE_TYPEW(void) static void test_pack_GOPHER_VIEW_ATTRIBUTE_TYPEA(void) { - /* GOPHER_VIEW_ATTRIBUTE_TYPEA (pack 4) */ + /* GOPHER_VIEW_ATTRIBUTE_TYPEA */ TEST_TYPE_SIZE (GOPHER_VIEW_ATTRIBUTE_TYPEA, 12) TEST_TYPE_ALIGN (GOPHER_VIEW_ATTRIBUTE_TYPEA, 4) TEST_FIELD_SIZE (GOPHER_VIEW_ATTRIBUTE_TYPEA, ContentType, 4) @@ -481,7 +1708,7 @@ static void test_pack_GOPHER_VIEW_ATTRIBUTE_TYPEA(void) static void test_pack_GOPHER_VIEW_ATTRIBUTE_TYPEW(void) { - /* GOPHER_VIEW_ATTRIBUTE_TYPEW (pack 4) */ + /* GOPHER_VIEW_ATTRIBUTE_TYPEW */ TEST_TYPE_SIZE (GOPHER_VIEW_ATTRIBUTE_TYPEW, 12) TEST_TYPE_ALIGN (GOPHER_VIEW_ATTRIBUTE_TYPEW, 4) TEST_FIELD_SIZE (GOPHER_VIEW_ATTRIBUTE_TYPEW, ContentType, 4) @@ -512,7 +1739,7 @@ static void test_pack_HINTERNET(void) static void test_pack_HTTP_VERSION_INFO(void) { - /* HTTP_VERSION_INFO (pack 4) */ + /* HTTP_VERSION_INFO */ TEST_TYPE_SIZE (HTTP_VERSION_INFO, 8) TEST_TYPE_ALIGN (HTTP_VERSION_INFO, 4) TEST_FIELD_SIZE (HTTP_VERSION_INFO, dwMajorVersion, 4) @@ -525,7 +1752,7 @@ static void test_pack_HTTP_VERSION_INFO(void) static void test_pack_INTERNET_ASYNC_RESULT(void) { - /* INTERNET_ASYNC_RESULT (pack 4) */ + /* INTERNET_ASYNC_RESULT */ TEST_TYPE_SIZE (INTERNET_ASYNC_RESULT, 8) TEST_TYPE_ALIGN (INTERNET_ASYNC_RESULT, 4) TEST_FIELD_SIZE (INTERNET_ASYNC_RESULT, dwResult, 4) @@ -538,7 +1765,7 @@ static void test_pack_INTERNET_ASYNC_RESULT(void) static void test_pack_INTERNET_AUTH_NOTIFY_DATA(void) { - /* INTERNET_AUTH_NOTIFY_DATA (pack 4) */ + /* INTERNET_AUTH_NOTIFY_DATA */ TEST_TYPE_SIZE (INTERNET_AUTH_NOTIFY_DATA, 16) TEST_TYPE_ALIGN (INTERNET_AUTH_NOTIFY_DATA, 4) TEST_FIELD_SIZE (INTERNET_AUTH_NOTIFY_DATA, cbStruct, 4) @@ -557,7 +1784,7 @@ static void test_pack_INTERNET_AUTH_NOTIFY_DATA(void) static void test_pack_INTERNET_BUFFERSA(void) { - /* INTERNET_BUFFERSA (pack 4) */ + /* INTERNET_BUFFERSA */ TEST_TYPE_SIZE (INTERNET_BUFFERSA, 40) TEST_TYPE_ALIGN (INTERNET_BUFFERSA, 4) TEST_FIELD_SIZE (INTERNET_BUFFERSA, dwStructSize, 4) @@ -594,7 +1821,7 @@ static void test_pack_INTERNET_BUFFERSA(void) static void test_pack_INTERNET_BUFFERSW(void) { - /* INTERNET_BUFFERSW (pack 4) */ + /* INTERNET_BUFFERSW */ TEST_TYPE_SIZE (INTERNET_BUFFERSW, 40) TEST_TYPE_ALIGN (INTERNET_BUFFERSW, 4) TEST_FIELD_SIZE (INTERNET_BUFFERSW, dwStructSize, 4) @@ -631,7 +1858,7 @@ static void test_pack_INTERNET_BUFFERSW(void) static void test_pack_INTERNET_CACHE_ENTRY_INFOA(void) { - /* INTERNET_CACHE_ENTRY_INFOA (pack 4) */ + /* INTERNET_CACHE_ENTRY_INFOA */ TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOA, dwStructSize, 4) TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOA, dwStructSize, 4) TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOA, dwStructSize, 0) @@ -681,7 +1908,7 @@ static void test_pack_INTERNET_CACHE_ENTRY_INFOA(void) static void test_pack_INTERNET_CACHE_ENTRY_INFOW(void) { - /* INTERNET_CACHE_ENTRY_INFOW (pack 4) */ + /* INTERNET_CACHE_ENTRY_INFOW */ TEST_FIELD_SIZE (INTERNET_CACHE_ENTRY_INFOW, dwStructSize, 4) TEST_FIELD_ALIGN (INTERNET_CACHE_ENTRY_INFOW, dwStructSize, 4) TEST_FIELD_OFFSET(INTERNET_CACHE_ENTRY_INFOW, dwStructSize, 0) @@ -731,7 +1958,7 @@ static void test_pack_INTERNET_CACHE_ENTRY_INFOW(void) static void test_pack_INTERNET_CERTIFICATE_INFOA(void) { - /* INTERNET_CERTIFICATE_INFOA (pack 4) */ + /* INTERNET_CERTIFICATE_INFOA */ TEST_TYPE_SIZE (INTERNET_CERTIFICATE_INFOA, 40) TEST_TYPE_ALIGN (INTERNET_CERTIFICATE_INFOA, 4) TEST_FIELD_SIZE (INTERNET_CERTIFICATE_INFOA, ftExpiry, 8) @@ -762,7 +1989,7 @@ static void test_pack_INTERNET_CERTIFICATE_INFOA(void) static void test_pack_INTERNET_CERTIFICATE_INFOW(void) { - /* INTERNET_CERTIFICATE_INFOW (pack 4) */ + /* INTERNET_CERTIFICATE_INFOW */ TEST_TYPE_SIZE (INTERNET_CERTIFICATE_INFOW, 40) TEST_TYPE_ALIGN (INTERNET_CERTIFICATE_INFOW, 4) TEST_FIELD_SIZE (INTERNET_CERTIFICATE_INFOW, ftExpiry, 8) @@ -793,7 +2020,7 @@ static void test_pack_INTERNET_CERTIFICATE_INFOW(void) static void test_pack_INTERNET_CONNECTED_INFO(void) { - /* INTERNET_CONNECTED_INFO (pack 4) */ + /* INTERNET_CONNECTED_INFO */ TEST_TYPE_SIZE (INTERNET_CONNECTED_INFO, 8) TEST_TYPE_ALIGN (INTERNET_CONNECTED_INFO, 4) TEST_FIELD_SIZE (INTERNET_CONNECTED_INFO, dwConnectedState, 4) @@ -814,7 +2041,7 @@ static void test_pack_INTERNET_PORT(void) static void test_pack_INTERNET_PROXY_INFOA(void) { - /* INTERNET_PROXY_INFOA (pack 4) */ + /* INTERNET_PROXY_INFOA */ TEST_TYPE_SIZE (INTERNET_PROXY_INFOA, 12) TEST_TYPE_ALIGN (INTERNET_PROXY_INFOA, 4) TEST_FIELD_SIZE (INTERNET_PROXY_INFOA, dwAccessType, 4) @@ -830,7 +2057,7 @@ static void test_pack_INTERNET_PROXY_INFOA(void) static void test_pack_INTERNET_PROXY_INFOW(void) { - /* INTERNET_PROXY_INFOW (pack 4) */ + /* INTERNET_PROXY_INFOW */ TEST_TYPE_SIZE (INTERNET_PROXY_INFOW, 12) TEST_TYPE_ALIGN (INTERNET_PROXY_INFOW, 4) TEST_FIELD_SIZE (INTERNET_PROXY_INFOW, dwAccessType, 4) @@ -853,7 +2080,7 @@ static void test_pack_INTERNET_STATUS_CALLBACK(void) static void test_pack_INTERNET_VERSION_INFO(void) { - /* INTERNET_VERSION_INFO (pack 4) */ + /* INTERNET_VERSION_INFO */ TEST_TYPE_SIZE (INTERNET_VERSION_INFO, 8) TEST_TYPE_ALIGN (INTERNET_VERSION_INFO, 4) TEST_FIELD_SIZE (INTERNET_VERSION_INFO, dwMajorVersion, 4) @@ -1300,7 +2527,7 @@ static void test_pack_PFN_DIAL_HANDLER(void) static void test_pack_URL_COMPONENTSA(void) { - /* URL_COMPONENTSA (pack 4) */ + /* URL_COMPONENTSA */ TEST_FIELD_SIZE (URL_COMPONENTSA, dwStructSize, 4) TEST_FIELD_ALIGN (URL_COMPONENTSA, dwStructSize, 4) TEST_FIELD_OFFSET(URL_COMPONENTSA, dwStructSize, 0) @@ -1314,7 +2541,7 @@ static void test_pack_URL_COMPONENTSA(void) static void test_pack_URL_COMPONENTSW(void) { - /* URL_COMPONENTSW (pack 4) */ + /* URL_COMPONENTSW */ TEST_FIELD_SIZE (URL_COMPONENTSW, dwStructSize, 4) TEST_FIELD_ALIGN (URL_COMPONENTSW, dwStructSize, 4) TEST_FIELD_OFFSET(URL_COMPONENTSW, dwStructSize, 0) @@ -1326,6 +2553,8 @@ static void test_pack_URL_COMPONENTSW(void) TEST_FIELD_OFFSET(URL_COMPONENTSW, dwSchemeLength, 8) } +#endif /* _WIN64 */ + static void test_pack(void) { test_pack_GOPHER_ABSTRACT_ATTRIBUTE_TYPEA(); @@ -1434,9 +2663,5 @@ static void test_pack(void) START_TEST(generated) { -#ifdef _WIN64 - ok(0, "The type size / alignment tests don't support Win64 yet\n"); -#else test_pack(); -#endif } diff --git a/rostests/winetests/wininet/http.c b/rostests/winetests/wininet/http.c index e3c33bd8748..0faeb54dc8a 100644 --- a/rostests/winetests/wininet/http.c +++ b/rostests/winetests/wininet/http.c @@ -105,6 +105,35 @@ static CHAR status_string[MAX_INTERNET_STATUS][MAX_STATUS_NAME]; static HANDLE hCompleteEvent; +#define TESTF_REDIRECT 0x01 +#define TESTF_COMPRESSED 0x02 +#define TESTF_ALLOW_COOKIE 0x04 + +typedef struct { + const char *url; + const char *redirected_url; + const char *host; + const char *path; + DWORD flags; +} test_data_t; + +static const test_data_t test_data[] = { + { + "http://test.winehq.org/testredirect", + "http://test.winehq.org/hello.html", + "test.winehq.org", + "/testredirect", + TESTF_REDIRECT + }, + { + "http://www.codeweavers.com/", + "http://www.codeweavers.com/", + "www.codeweavers.com", + "", + TESTF_COMPRESSED|TESTF_ALLOW_COOKIE + } +}; + static INTERNET_STATUS_CALLBACK (WINAPI *pInternetSetStatusCallbackA)(HINTERNET ,INTERNET_STATUS_CALLBACK); @@ -239,7 +268,7 @@ static VOID WINAPI callback( } } -static void InternetReadFile_test(int flags) +static void InternetReadFile_test(int flags, const test_data_t *test) { BOOL res; CHAR buffer[4000]; @@ -250,10 +279,11 @@ static void InternetReadFile_test(int flags) hCompleteEvent = CreateEvent(NULL, FALSE, FALSE, NULL); - trace("Starting InternetReadFile test with flags 0x%x\n",flags); + trace("Starting InternetReadFile test with flags 0x%x on url %s\n",flags,test->url); trace("InternetOpenA <--\n"); - hi = InternetOpenA("", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, flags); + hi = InternetOpenA((test->flags & TESTF_COMPRESSED) ? "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" : "", + INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, flags); ok((hi != 0x0),"InternetOpen failed with error %u\n", GetLastError()); trace("InternetOpenA -->\n"); @@ -264,7 +294,7 @@ static void InternetReadFile_test(int flags) SET_EXPECT(INTERNET_STATUS_HANDLE_CREATED); trace("InternetConnectA <--\n"); - hic=InternetConnectA(hi, "test.winehq.org", INTERNET_INVALID_PORT_NUMBER, + hic=InternetConnectA(hi, test->host, INTERNET_INVALID_PORT_NUMBER, NULL, NULL, INTERNET_SERVICE_HTTP, 0x0, 0xdeadbeef); ok((hic != 0x0),"InternetConnect failed with error %u\n", GetLastError()); trace("InternetConnectA -->\n"); @@ -275,7 +305,7 @@ static void InternetReadFile_test(int flags) SET_EXPECT(INTERNET_STATUS_HANDLE_CREATED); trace("HttpOpenRequestA <--\n"); - hor = HttpOpenRequestA(hic, "GET", "/testredirect", NULL, NULL, types, + hor = HttpOpenRequestA(hic, "GET", test->path, NULL, NULL, types, INTERNET_FLAG_KEEP_CONNECTION | INTERNET_FLAG_RESYNCHRONIZE, 0xdeadbead); if (hor == 0x0 && GetLastError() == ERROR_INTERNET_NAME_NOT_RESOLVED) { @@ -295,7 +325,7 @@ static void InternetReadFile_test(int flags) length = sizeof(buffer); res = InternetQueryOptionA(hor, INTERNET_OPTION_URL, buffer, &length); ok(res, "InternetQueryOptionA(INTERNET_OPTION_URL) failed: %u\n", GetLastError()); - ok(!strcmp(buffer, "http://test.winehq.org/testredirect"), "Wrong URL %s\n", buffer); + ok(!strcmp(buffer, test->url), "Wrong URL %s, expected %s\n", buffer, test->url); length = sizeof(buffer); res = HttpQueryInfoA(hor, HTTP_QUERY_RAW_HEADERS, buffer, &length, 0x0); @@ -306,6 +336,10 @@ static void InternetReadFile_test(int flags) CHECK_NOTIFIED(INTERNET_STATUS_HANDLE_CREATED); CHECK_NOT_NOTIFIED(INTERNET_STATUS_RESOLVING_NAME); CHECK_NOT_NOTIFIED(INTERNET_STATUS_NAME_RESOLVED); + if(test->flags & TESTF_ALLOW_COOKIE) { + SET_OPTIONAL(INTERNET_STATUS_COOKIE_SENT); + SET_OPTIONAL(INTERNET_STATUS_COOKIE_RECEIVED); + } if (first_connection_to_test_url) { SET_EXPECT(INTERNET_STATUS_RESOLVING_NAME); @@ -322,12 +356,14 @@ static void InternetReadFile_test(int flags) SET_EXPECT(INTERNET_STATUS_CONNECTING_TO_SERVER); SET_WINE_ALLOW(INTERNET_STATUS_CONNECTED_TO_SERVER); SET_EXPECT(INTERNET_STATUS_CONNECTED_TO_SERVER); - SET_EXPECT2(INTERNET_STATUS_SENDING_REQUEST, 2); - SET_EXPECT2(INTERNET_STATUS_REQUEST_SENT, 2); - SET_EXPECT2(INTERNET_STATUS_RECEIVING_RESPONSE, 2); - SET_EXPECT2(INTERNET_STATUS_RESPONSE_RECEIVED, 2); - SET_OPTIONAL2(INTERNET_STATUS_CLOSING_CONNECTION, 2); - SET_OPTIONAL2(INTERNET_STATUS_CONNECTION_CLOSED, 2); + SET_EXPECT2(INTERNET_STATUS_SENDING_REQUEST, (test->flags & TESTF_REDIRECT) ? 2 : 1); + SET_EXPECT2(INTERNET_STATUS_REQUEST_SENT, (test->flags & TESTF_REDIRECT) ? 2 : 1); + SET_EXPECT2(INTERNET_STATUS_RECEIVING_RESPONSE, (test->flags & TESTF_REDIRECT) ? 2 : 1); + SET_EXPECT2(INTERNET_STATUS_RESPONSE_RECEIVED, (test->flags & TESTF_REDIRECT) ? 2 : 1); + if(test->flags & TESTF_REDIRECT) { + SET_OPTIONAL2(INTERNET_STATUS_CLOSING_CONNECTION, 2); + SET_OPTIONAL2(INTERNET_STATUS_CONNECTION_CLOSED, 2); + } SET_EXPECT(INTERNET_STATUS_REDIRECT); SET_OPTIONAL(INTERNET_STATUS_CONNECTING_TO_SERVER); SET_OPTIONAL(INTERNET_STATUS_CONNECTED_TO_SERVER); @@ -336,9 +372,19 @@ static void InternetReadFile_test(int flags) else SET_WINE_ALLOW(INTERNET_STATUS_REQUEST_COMPLETE); + if(test->flags & TESTF_COMPRESSED) { + BOOL b = TRUE; + + res = InternetSetOption(hor, INTERNET_OPTION_HTTP_DECODING, &b, sizeof(b)); + ok(res || broken(!res && GetLastError() == ERROR_INTERNET_INVALID_OPTION), + "InternetSetOption failed: %u\n", GetLastError()); + if(!res) + goto abort; + } + trace("HttpSendRequestA -->\n"); SetLastError(0xdeadbeef); - res = HttpSendRequestA(hor, "", -1, NULL, 0); + res = HttpSendRequestA(hor, (test->flags & TESTF_COMPRESSED) ? "Accept-Encoding: gzip, deflate" : "", -1, NULL, 0); if (flags & INTERNET_FLAG_ASYNC) ok(!res && (GetLastError() == ERROR_IO_PENDING), "Asynchronous HttpSendRequest NOT returning 0 with error ERROR_IO_PENDING\n"); @@ -350,6 +396,10 @@ static void InternetReadFile_test(int flags) if (flags & INTERNET_FLAG_ASYNC) WaitForSingleObject(hCompleteEvent, INFINITE); + if(test->flags & TESTF_ALLOW_COOKIE) { + CLEAR_NOTIFIED(INTERNET_STATUS_COOKIE_SENT); + CLEAR_NOTIFIED(INTERNET_STATUS_COOKIE_RECEIVED); + } if (first_connection_to_test_url) { CHECK_NOTIFIED(INTERNET_STATUS_RESOLVING_NAME); @@ -360,11 +410,12 @@ static void InternetReadFile_test(int flags) CHECK_NOT_NOTIFIED(INTERNET_STATUS_RESOLVING_NAME); CHECK_NOT_NOTIFIED(INTERNET_STATUS_NAME_RESOLVED); } - CHECK_NOTIFIED2(INTERNET_STATUS_SENDING_REQUEST, 2); - CHECK_NOTIFIED2(INTERNET_STATUS_REQUEST_SENT, 2); - CHECK_NOTIFIED2(INTERNET_STATUS_RECEIVING_RESPONSE, 2); - CHECK_NOTIFIED2(INTERNET_STATUS_RESPONSE_RECEIVED, 2); - CHECK_NOTIFIED(INTERNET_STATUS_REDIRECT); + CHECK_NOTIFIED2(INTERNET_STATUS_SENDING_REQUEST, (test->flags & TESTF_REDIRECT) ? 2 : 1); + CHECK_NOTIFIED2(INTERNET_STATUS_REQUEST_SENT, (test->flags & TESTF_REDIRECT) ? 2 : 1); + CHECK_NOTIFIED2(INTERNET_STATUS_RECEIVING_RESPONSE, (test->flags & TESTF_REDIRECT) ? 2 : 1); + CHECK_NOTIFIED2(INTERNET_STATUS_RESPONSE_RECEIVED, (test->flags & TESTF_REDIRECT) ? 2 : 1); + if(test->flags & TESTF_REDIRECT) + CHECK_NOTIFIED(INTERNET_STATUS_REDIRECT); if (flags & INTERNET_FLAG_ASYNC) CHECK_NOTIFIED(INTERNET_STATUS_REQUEST_COMPLETE); else @@ -389,16 +440,24 @@ static void InternetReadFile_test(int flags) length = sizeof(buffer); res = InternetQueryOptionA(hor, INTERNET_OPTION_URL, buffer, &length); ok(res, "InternetQueryOptionA(INTERNET_OPTION_URL) failed: %u\n", GetLastError()); - ok(!strcmp(buffer, "http://test.winehq.org/hello.html"), "Wrong URL %s\n", buffer); + ok(!strcmp(buffer, test->redirected_url), "Wrong URL %s\n", buffer); length = 16; res = HttpQueryInfoA(hor,HTTP_QUERY_CONTENT_LENGTH,&buffer,&length,0x0); - trace("Option 0x5 -> %i %s (%u)\n",res,buffer,GetLastError()); + trace("Option HTTP_QUERY_CONTENT_LENGTH -> %i %s (%u)\n",res,buffer,GetLastError()); + if(test->flags & TESTF_COMPRESSED) + ok(!res && GetLastError() == ERROR_HTTP_HEADER_NOT_FOUND, + "expected ERROR_HTTP_HEADER_NOT_FOUND, got %x (%u)\n", res, GetLastError()); length = 100; res = HttpQueryInfoA(hor,HTTP_QUERY_CONTENT_TYPE,buffer,&length,0x0); buffer[length]=0; - trace("Option 0x1 -> %i %s\n",res,buffer); + trace("Option HTTP_QUERY_CONTENT_TYPE -> %i %s\n",res,buffer); + + length = 100; + res = HttpQueryInfoA(hor,HTTP_QUERY_CONTENT_ENCODING,buffer,&length,0x0); + buffer[length]=0; + trace("Option HTTP_QUERY_CONTENT_ENCODING -> %i %s\n",res,buffer); SetLastError(0xdeadbeef); res = InternetReadFile(NULL, buffer, 100, &length); @@ -447,8 +506,10 @@ static void InternetReadFile_test(int flags) if (length == 0) break; } - CHECK_NOTIFIED2(INTERNET_STATUS_CLOSING_CONNECTION, 2); - CHECK_NOTIFIED2(INTERNET_STATUS_CONNECTION_CLOSED, 2); + if(test->flags & TESTF_REDIRECT) { + CHECK_NOTIFIED2(INTERNET_STATUS_CLOSING_CONNECTION, 2); + CHECK_NOTIFIED2(INTERNET_STATUS_CONNECTION_CLOSED, 2); + } abort: trace("aborting\n"); SET_EXPECT2(INTERNET_STATUS_HANDLE_CLOSING, (hor != 0x0) + (hic != 0x0)); @@ -493,6 +554,114 @@ abort: first_connection_to_test_url = FALSE; } +static void InternetReadFile_chunked_test(void) +{ + BOOL res; + CHAR buffer[4000]; + DWORD length; + const char *types[2] = { "*", NULL }; + HINTERNET hi, hic = 0, hor = 0; + + trace("Starting InternetReadFile chunked test\n"); + + trace("InternetOpenA <--\n"); + hi = InternetOpenA("", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0); + ok((hi != 0x0),"InternetOpen failed with error %u\n", GetLastError()); + trace("InternetOpenA -->\n"); + + if (hi == 0x0) goto abort; + + trace("InternetConnectA <--\n"); + hic=InternetConnectA(hi, "test.winehq.org", INTERNET_INVALID_PORT_NUMBER, + NULL, NULL, INTERNET_SERVICE_HTTP, 0x0, 0xdeadbeef); + ok((hic != 0x0),"InternetConnect failed with error %u\n", GetLastError()); + trace("InternetConnectA -->\n"); + + if (hic == 0x0) goto abort; + + trace("HttpOpenRequestA <--\n"); + hor = HttpOpenRequestA(hic, "GET", "/testchunked", NULL, NULL, types, + INTERNET_FLAG_KEEP_CONNECTION | INTERNET_FLAG_RESYNCHRONIZE, + 0xdeadbead); + if (hor == 0x0 && GetLastError() == ERROR_INTERNET_NAME_NOT_RESOLVED) { + /* + * If the internet name can't be resolved we are probably behind + * a firewall or in some other way not directly connected to the + * Internet. Not enough reason to fail the test. Just ignore and + * abort. + */ + } else { + ok((hor != 0x0),"HttpOpenRequest failed with error %u\n", GetLastError()); + } + trace("HttpOpenRequestA -->\n"); + + if (hor == 0x0) goto abort; + + trace("HttpSendRequestA -->\n"); + SetLastError(0xdeadbeef); + res = HttpSendRequestA(hor, "", -1, NULL, 0); + ok(res || (GetLastError() == ERROR_INTERNET_NAME_NOT_RESOLVED), + "Synchronous HttpSendRequest returning 0, error %u\n", GetLastError()); + trace("HttpSendRequestA <--\n"); + + length = 100; + res = HttpQueryInfoA(hor,HTTP_QUERY_CONTENT_TYPE,buffer,&length,0x0); + buffer[length]=0; + trace("Option CONTENT_TYPE -> %i %s\n",res,buffer); + + SetLastError( 0xdeadbeef ); + length = 100; + res = HttpQueryInfoA(hor,HTTP_QUERY_TRANSFER_ENCODING,buffer,&length,0x0); + buffer[length]=0; + trace("Option TRANSFER_ENCODING -> %i %s\n",res,buffer); + ok( res, "Failed to get TRANSFER_ENCODING option, error %u\n", GetLastError() ); + ok( !strcmp( buffer, "chunked" ), "Wrong transfer encoding '%s'\n", buffer ); + + SetLastError( 0xdeadbeef ); + length = 16; + res = HttpQueryInfoA(hor,HTTP_QUERY_CONTENT_LENGTH,&buffer,&length,0x0); + ok( !res, "Found CONTENT_LENGTH option '%s'\n", buffer ); + ok( GetLastError() == ERROR_HTTP_HEADER_NOT_FOUND, "Wrong error %u\n", GetLastError() ); + + length = 100; + trace("Entering Query loop\n"); + + while (TRUE) + { + res = InternetQueryDataAvailable(hor,&length,0x0,0x0); + ok(!(!res && length != 0),"InternetQueryDataAvailable failed with non-zero length\n"); + ok(res, "InternetQueryDataAvailable failed, error %d\n", GetLastError()); + trace("got %u available\n",length); + if (length) + { + DWORD got; + char *buffer = HeapAlloc(GetProcessHeap(),0,length+1); + + res = InternetReadFile(hor,buffer,length,&got); + + buffer[got]=0; + trace("ReadFile -> %i %i\n",res,got); + ok( length == got, "only got %u of %u available\n", got, length ); + ok( buffer[got-1] == '\n', "received partial line '%s'\n", buffer ); + + HeapFree(GetProcessHeap(),0,buffer); + if (!got) break; + } + if (length == 0) + break; + } +abort: + trace("aborting\n"); + if (hor != 0x0) { + res = InternetCloseHandle(hor); + ok (res, "InternetCloseHandle of handle opened by HttpOpenRequestA failed\n"); + } + if (hi != 0x0) { + res = InternetCloseHandle(hi); + ok (res, "InternetCloseHandle of handle opened by InternetOpenA failed\n"); + } +} + static void InternetReadFileExA_test(int flags) { DWORD rc; @@ -802,8 +971,7 @@ static void HttpSendRequestEx_test(void) HINTERNET hRequest; INTERNET_BUFFERS BufferIn; - DWORD dwBytesWritten; - DWORD dwBytesRead; + DWORD dwBytesWritten, dwBytesRead, error; CHAR szBuffer[256]; int i; BOOL ret; @@ -839,8 +1007,11 @@ static void HttpSendRequestEx_test(void) BufferIn.dwOffsetLow = 0; BufferIn.dwOffsetHigh = 0; + SetLastError(0xdeadbeef); ret = HttpSendRequestEx(hRequest, &BufferIn, NULL, 0 ,0); - ok(ret, "HttpSendRequestEx Failed with error %u\n", GetLastError()); + error = GetLastError(); + ok(ret, "HttpSendRequestEx Failed with error %u\n", error); + ok(error == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", error); for (i = 3; szPostData[i]; i++) ok(InternetWriteFile(hRequest, &szPostData[i], 1, &dwBytesWritten), @@ -942,7 +1113,7 @@ static void test_http_cache(void) size = sizeof(url); ret = InternetQueryOptionA(request, INTERNET_OPTION_URL, url, &size); - ok(ret, "InternetQueryOptionA(INTERNET_OPTION_url) failed: %u\n", GetLastError()); + ok(ret, "InternetQueryOptionA(INTERNET_OPTION_URL) failed: %u\n", GetLastError()); ok(!strcmp(url, "http://test.winehq.org/hello.html"), "Wrong URL %s\n", url); size = sizeof(file_name); @@ -977,7 +1148,7 @@ static void test_http_cache(void) file = CreateFile(file_name, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); - todo_wine ok(file != INVALID_HANDLE_VALUE, "CreateFile succeeded\n"); + ok(file != INVALID_HANDLE_VALUE, "Could not create file: %u\n", GetLastError()); CloseHandle(file); request = HttpOpenRequestA(connect, NULL, "/", NULL, NULL, types, INTERNET_FLAG_NO_CACHE_WRITE, 0); @@ -993,13 +1164,20 @@ static void test_http_cache(void) ok(ret, "HttpSendRequest failed: %u\n", GetLastError()); size = sizeof(file_name); + file_name[0] = 0; ret = InternetQueryOptionA(request, INTERNET_OPTION_DATAFILE_NAME, file_name, &size); - todo_wine ok(ret, "InternetQueryOptionA(INTERNET_OPTION_DATAFILE_NAME) failed %u\n", GetLastError()); - - file = CreateFile(file_name, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, + if (ret) + { + file = CreateFile(file_name, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); - todo_wine ok(file != INVALID_HANDLE_VALUE, "CreateFile succeeded\n"); - CloseHandle(file); + ok(file != INVALID_HANDLE_VALUE, "Could not create file: %u\n", GetLastError()); + CloseHandle(file); + } + else + { + /* < IE8 */ + ok(file_name[0] == 0, "Didn't expect a file name\n"); + } ok(InternetCloseHandle(request), "Close request handle failed\n"); ok(InternetCloseHandle(connect), "Close connect handle failed\n"); @@ -1284,15 +1462,47 @@ static void HttpHeaders_test(void) ok(index == 1, "Index was not incremented\n"); ok(strcmp(buffer,"value")==0, "incorrect string was returned(%s)\n",buffer); + /* Ensure that malformed header separators are ignored and don't cause a failure */ + ok(HttpAddRequestHeaders(hRequest,"\r\rMalformedTest:value\n\nMalformedTestTwo: value2\rMalformedTestThree: value3\n\n\r\r\n",-1, HTTP_ADDREQ_FLAG_ADD|HTTP_ADDREQ_FLAG_REPLACE), + "Failed to add header with malformed entries in list\n"); + + index = 0; + len = sizeof(buffer); + strcpy(buffer,"MalformedTest"); + ok(HttpQueryInfo(hRequest,HTTP_QUERY_CUSTOM|HTTP_QUERY_FLAG_REQUEST_HEADERS, buffer,&len,&index),"Unable to query header\n"); + ok(index == 1, "Index was not incremented\n"); + ok(strcmp(buffer,"value")==0, "incorrect string was returned(%s)\n",buffer); + index = 0; + len = sizeof(buffer); + strcpy(buffer,"MalformedTestTwo"); + ok(HttpQueryInfo(hRequest,HTTP_QUERY_CUSTOM|HTTP_QUERY_FLAG_REQUEST_HEADERS, buffer,&len,&index),"Unable to query header\n"); + ok(index == 1, "Index was not incremented\n"); + ok(strcmp(buffer,"value2")==0, "incorrect string was returned(%s)\n",buffer); + index = 0; + len = sizeof(buffer); + strcpy(buffer,"MalformedTestThree"); + ok(HttpQueryInfo(hRequest,HTTP_QUERY_CUSTOM|HTTP_QUERY_FLAG_REQUEST_HEADERS, buffer,&len,&index),"Unable to query header\n"); + ok(index == 1, "Index was not incremented\n"); + ok(strcmp(buffer,"value3")==0, "incorrect string was returned(%s)\n",buffer); + ok(InternetCloseHandle(hRequest), "Close request handle failed\n"); done: ok(InternetCloseHandle(hConnect), "Close connect handle failed\n"); ok(InternetCloseHandle(hSession), "Close session handle failed\n"); } +static const char garbagemsg[] = +"Garbage: Header\r\n"; + static const char contmsg[] = "HTTP/1.1 100 Continue\r\n"; +static const char expandcontmsg[] = +"HTTP/1.1 100 Continue\r\n" +"Server: winecontinue\r\n" +"Tag: something witty\r\n" +"\r\n"; + static const char okmsg[] = "HTTP/1.1 200 OK\r\n" "Server: winetest\r\n" @@ -1518,6 +1728,19 @@ static DWORD CALLBACK server_thread(LPVOID param) send(c, page1, sizeof page1-1, 0); last_request = 1; } + if (strstr(buffer, "GET /testF")) + { + send(c, expandcontmsg, sizeof expandcontmsg-1, 0); + send(c, garbagemsg, sizeof garbagemsg-1, 0); + send(c, contmsg, sizeof contmsg-1, 0); + send(c, garbagemsg, sizeof garbagemsg-1, 0); + send(c, okmsg, sizeof okmsg-1, 0); + send(c, page1, sizeof page1-1, 0); + } + if (strstr(buffer, "GET /testG")) + { + send(c, page1, sizeof page1-1, 0); + } shutdown(c, 2); closesocket(c); @@ -1558,6 +1781,32 @@ static void test_basic_request(int port, const char *verb, const char *url) InternetCloseHandle(hi); } +static void test_last_error(int port) +{ + HINTERNET hi, hc, hr; + DWORD error; + BOOL r; + + hi = InternetOpen(NULL, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0); + ok(hi != NULL, "open failed\n"); + + hc = InternetConnect(hi, "localhost", port, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0); + ok(hc != NULL, "connect failed\n"); + + hr = HttpOpenRequest(hc, NULL, "/test1", NULL, NULL, NULL, 0, 0); + ok(hr != NULL, "HttpOpenRequest failed\n"); + + SetLastError(0xdeadbeef); + r = HttpSendRequest(hr, NULL, 0, NULL, 0); + error = GetLastError(); + ok(r, "HttpSendRequest failed\n"); + ok(error == ERROR_SUCCESS || broken(error != ERROR_SUCCESS), "expected ERROR_SUCCESS, got %u\n", error); + + InternetCloseHandle(hr); + InternetCloseHandle(hc); + InternetCloseHandle(hi); +} + static void test_proxy_indirect(int port) { HINTERNET hi, hc, hr; @@ -1578,7 +1827,12 @@ static void test_proxy_indirect(int port) sz = sizeof buffer; r = HttpQueryInfo(hr, HTTP_QUERY_PROXY_AUTHENTICATE, buffer, &sz, NULL); - ok(r, "HttpQueryInfo failed\n"); + ok(r || GetLastError() == ERROR_HTTP_HEADER_NOT_FOUND, "HttpQueryInfo failed: %d\n", GetLastError()); + if (!r) + { + skip("missing proxy header, not testing remaining proxy headers\n"); + goto out; + } ok(!strcmp(buffer, "Basic realm=\"placebo\""), "proxy auth info wrong\n"); sz = sizeof buffer; @@ -1611,6 +1865,7 @@ static void test_proxy_indirect(int port) ok(GetLastError() == ERROR_HTTP_HEADER_NOT_FOUND, "HttpQueryInfo should fail\n"); ok(r == FALSE, "HttpQueryInfo failed\n"); +out: InternetCloseHandle(hr); InternetCloseHandle(hc); InternetCloseHandle(hi); @@ -1829,7 +2084,6 @@ static void test_http1_1(int port) ok(req != NULL, "HttpOpenRequest failed\n"); ret = HttpSendRequest(req, NULL, 0, NULL, 0); - todo_wine ok(ret, "HttpSendRequest failed\n"); } @@ -1995,6 +2249,69 @@ static void test_invalid_response_headers(int port) InternetCloseHandle(session); } +static void test_response_without_headers(int port) +{ + HINTERNET hi, hc, hr; + DWORD r, count, size, status; + char buffer[1024]; + + SetLastError(0xdeadbeef); + hi = InternetOpen(NULL, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0); + ok(hi != NULL, "open failed %u\n", GetLastError()); + + SetLastError(0xdeadbeef); + hc = InternetConnect(hi, "localhost", port, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0); + ok(hc != NULL, "connect failed %u\n", GetLastError()); + + SetLastError(0xdeadbeef); + hr = HttpOpenRequest(hc, NULL, "/testG", NULL, NULL, NULL, 0, 0); + ok(hr != NULL, "HttpOpenRequest failed %u\n", GetLastError()); + + SetLastError(0xdeadbeef); + r = HttpSendRequest(hr, NULL, 0, NULL, 0); + ok(r, "HttpSendRequest failed %u\n", GetLastError()); + + count = 0; + memset(buffer, 0, sizeof buffer); + SetLastError(0xdeadbeef); + r = InternetReadFile(hr, buffer, sizeof buffer, &count); + ok(r, "InternetReadFile failed %u\n", GetLastError()); + todo_wine ok(count == sizeof page1 - 1, "count was wrong\n"); + todo_wine ok(!memcmp(buffer, page1, sizeof page1), "http data wrong\n"); + + status = 0; + size = sizeof(status); + SetLastError(0xdeadbeef); + r = HttpQueryInfo(hr, HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER, &status, &size, NULL ); + todo_wine ok(r, "HttpQueryInfo failed %u\n", GetLastError()); + todo_wine ok(status == 200, "expected status 200 got %u\n", status); + + buffer[0] = 0; + size = sizeof(buffer); + SetLastError(0xdeadbeef); + r = HttpQueryInfo(hr, HTTP_QUERY_STATUS_TEXT, buffer, &size, NULL ); + ok(r, "HttpQueryInfo failed %u\n", GetLastError()); + ok(!strcmp(buffer, "OK"), "expected OK got: \"%s\"\n", buffer); + + buffer[0] = 0; + size = sizeof(buffer); + SetLastError(0xdeadbeef); + r = HttpQueryInfo(hr, HTTP_QUERY_VERSION, buffer, &size, NULL); + ok(r, "HttpQueryInfo failed %u\n", GetLastError()); + ok(!strcmp(buffer, "HTTP/1.0"), "expected HTTP/1.0 got: \"%s\"\n", buffer); + + buffer[0] = 0; + size = sizeof(buffer); + SetLastError(0xdeadbeef); + r = HttpQueryInfo(hr, HTTP_QUERY_RAW_HEADERS, buffer, &size, NULL); + ok(r, "HttpQueryInfo failed %u\n", GetLastError()); + ok(!strcmp(buffer, "HTTP/1.0 200 OK"), "raw headers wrong: \"%s\"\n", buffer); + + InternetCloseHandle(hr); + InternetCloseHandle(hc); + InternetCloseHandle(hi); +} + static void test_HttpQueryInfo(int port) { HINTERNET hi, hc, hr; @@ -2124,13 +2441,16 @@ static void test_http_connection(void) test_basic_request(si.port, "RPC_IN_DATA", "/test5"); test_basic_request(si.port, "RPC_OUT_DATA", "/test5"); test_basic_request(si.port, "GET", "/test6"); + test_basic_request(si.port, "GET", "/testF"); test_connection_header(si.port); test_http1_1(si.port); test_cookie_header(si.port); test_basic_authentication(si.port); test_invalid_response_headers(si.port); + test_response_without_headers(si.port); test_HttpQueryInfo(si.port); test_HttpSendRequestW(si.port); + test_last_error(si.port); /* send the basic request again to shutdown the server thread */ test_basic_request(si.port, "GET", "/quit"); @@ -2321,6 +2641,7 @@ struct notification unsigned int status; /* status received */ int async; /* delivered from another thread? */ int todo; + int optional; }; struct info @@ -2356,6 +2677,13 @@ static void CALLBACK check_notification( HINTERNET handle, DWORD_PTR context, DW return; } + while (info->test[i].status != status && info->test[i].optional && + i < info->count - 1 && + info->test[i].function == info->test[i + 1].function) + { + i++; + } + status_ok = (info->test[i].status == status); function_ok = (info->test[i].function == info->function); @@ -2375,7 +2703,7 @@ static void CALLBACK check_notification( HINTERNET handle, DWORD_PTR context, DW todo_wine ok( function_ok, "%u: expected function %u got %u\n", info->line, info->test[i].function, info->function ); } if (i == info->count - 1 || info->test[i].function != info->test[i + 1].function) SetEvent( info->wait ); - info->index++; + info->index = i+1; LeaveCriticalSection( ¬ification_cs ); } @@ -2390,6 +2718,7 @@ static const struct notification async_send_request_ex_test[] = { { internet_connect, INTERNET_STATUS_HANDLE_CREATED, 0 }, { http_open_request, INTERNET_STATUS_HANDLE_CREATED, 0 }, + { http_send_request_ex, INTERNET_STATUS_DETECTING_PROXY, 1, 0, 1 }, { http_send_request_ex, INTERNET_STATUS_RESOLVING_NAME, 1 }, { http_send_request_ex, INTERNET_STATUS_NAME_RESOLVED, 1 }, { http_send_request_ex, INTERNET_STATUS_CONNECTING_TO_SERVER, 1 }, @@ -2493,6 +2822,7 @@ static void test_async_HttpSendRequestEx(void) InternetCloseHandle( ses ); WaitForSingleObject( info.wait, 10000 ); + Sleep(100); CloseHandle( info.wait ); } @@ -2548,8 +2878,11 @@ START_TEST(http) else { init_status_tests(); - InternetReadFile_test(INTERNET_FLAG_ASYNC); - InternetReadFile_test(0); + InternetReadFile_test(INTERNET_FLAG_ASYNC, &test_data[0]); + InternetReadFile_test(0, &test_data[0]); + first_connection_to_test_url = TRUE; + InternetReadFile_test(INTERNET_FLAG_ASYNC, &test_data[1]); + InternetReadFile_test(0, &test_data[1]); InternetReadFileExA_test(INTERNET_FLAG_ASYNC); test_open_url_async(); test_async_HttpSendRequestEx(); @@ -2557,9 +2890,10 @@ START_TEST(http) InternetOpenRequest_test(); test_http_cache(); InternetOpenUrlA_test(); - HttpSendRequestEx_test(); HttpHeaders_test(); test_http_connection(); test_user_agent_header(); test_bogus_accept_types_array(); + InternetReadFile_chunked_test(); + HttpSendRequestEx_test(); } diff --git a/rostests/winetests/wininet/internet.c b/rostests/winetests/wininet/internet.c index 176f3d8f648..fa28b0cbbb4 100644 --- a/rostests/winetests/wininet/internet.c +++ b/rostests/winetests/wininet/internet.c @@ -24,6 +24,7 @@ #include "winbase.h" #include "wininet.h" #include "winerror.h" +#include "winreg.h" #include "wine/test.h" @@ -36,6 +37,18 @@ static BOOL (WINAPI *pInternetTimeFromSystemTimeW)(CONST SYSTEMTIME *,DWORD ,LPW static BOOL (WINAPI *pInternetTimeToSystemTimeA)(LPCSTR ,SYSTEMTIME *,DWORD); static BOOL (WINAPI *pInternetTimeToSystemTimeW)(LPCWSTR ,SYSTEMTIME *,DWORD); static BOOL (WINAPI *pIsDomainLegalCookieDomainW)(LPCWSTR, LPCWSTR); +static DWORD (WINAPI *pPrivacyGetZonePreferenceW)(DWORD, DWORD, LPDWORD, LPWSTR, LPDWORD); +static DWORD (WINAPI *pPrivacySetZonePreferenceW)(DWORD, DWORD, DWORD, LPCWSTR); + +/* Win9x and WinMe don't have lstrcmpW */ +static int strcmp_ww(const WCHAR *str1, const WCHAR *str2) +{ + DWORD len1 = lstrlenW(str1); + DWORD len2 = lstrlenW(str2); + + if (len1 != len2) return 1; + return memcmp(str1, str2, len1 * sizeof(WCHAR)); +} /* ############################### */ @@ -182,7 +195,7 @@ static void test_InternetQueryOptionA(void) if (retval) { ok(!strcmp(useragent,buffer),"Got wrong user agent string %s instead of %s\n",buffer,useragent); - todo_wine ok(len == strlen(useragent),"Got wrong user agent length %d instead of %d\n",len,lstrlenA(useragent)); + ok(len == strlen(useragent),"Got wrong user agent length %d instead of %d\n",len,lstrlenA(useragent)); } ok(err == 0xdeadbeef, "Got wrong error code %d\n",err); HeapFree(GetProcessHeap(),0,buffer); @@ -229,7 +242,7 @@ static void test_InternetQueryOptionA(void) len=0; retval=InternetQueryOptionA(hinet,INTERNET_OPTION_USER_AGENT,NULL,&len); err=GetLastError(); - todo_wine ok(len == 1,"Got wrong user agent length %d instead of %d\n",len,1); + ok(len == 1,"Got wrong user agent length %d instead of %d\n",len,1); ok(retval == 0,"Got wrong return value %d\n",retval); ok(err == ERROR_INSUFFICIENT_BUFFER, "Got wrong error code%d\n",err); @@ -463,7 +476,7 @@ static void test_null(void) ok( sz == 1 + lstrlenW(buffer) || sz == lstrlenW(buffer), "sz wrong %d\n", sz); /* before XP SP2, buffer is "server; server" */ - ok( !lstrcmpW(szExpect, buffer) || !lstrcmpW(szServer, buffer), "cookie data wrong\n"); + ok( !strcmp_ww(szExpect, buffer) || !strcmp_ww(szServer, buffer), "cookie data wrong\n"); sz = sizeof(buffer); r = InternetQueryOptionA(NULL, INTERNET_OPTION_CONNECTED_STATE, buffer, &sz); @@ -742,8 +755,9 @@ static void test_IsDomainLegalCookieDomainW(void) error = GetLastError(); ok(!ret, "IsDomainLegalCookieDomainW succeeded\n"); ok(error == ERROR_SXS_KEY_NOT_FOUND || + error == ERROR_SUCCESS || /* IE8 on W2K3 */ error == 0xdeadbeef, /* up to IE7 */ - "got %u expected ERROR_SXS_KEY_NOT_FOUND or 0xdeadbeef\n", error); + "unexpected error: %u\n", error); ret = pIsDomainLegalCookieDomainW(gmail_com, gmail_com); ok(ret, "IsDomainLegalCookieDomainW failed\n"); @@ -754,9 +768,9 @@ static void test_IsDomainLegalCookieDomainW(void) ok(!ret, "IsDomainLegalCookieDomainW succeeded\n"); ok(error == ERROR_SXS_KEY_NOT_FOUND || /* IE8 on XP */ error == ERROR_FILE_NOT_FOUND || /* IE8 on Vista */ + error == ERROR_SUCCESS || /* IE8 on W2K3 */ error == 0xdeadbeef, /* up to IE7 */ - "got %u expected ERROR_SXS_KEY_NOT_FOUND, ERROR_FILE_NOT_FOUND or " - "0xdeadbeef\n", error); + "unexpected error: %u\n", error); ret = pIsDomainLegalCookieDomainW(uk, co_uk); ok(!ret, "IsDomainLegalCookieDomainW succeeded\n"); @@ -794,6 +808,273 @@ static void test_IsDomainLegalCookieDomainW(void) ok(!ret, "IsDomainLegalCookieDomainW succeeded\n"); } +static void test_PrivacyGetSetZonePreferenceW(void) +{ + DWORD ret, zone, type, template, old_template; + + zone = 3; + type = 0; + ret = pPrivacyGetZonePreferenceW(zone, type, NULL, NULL, NULL); + ok(ret == 0, "expected ret == 0, got %u\n", ret); + + old_template = 0; + ret = pPrivacyGetZonePreferenceW(zone, type, &old_template, NULL, NULL); + ok(ret == 0, "expected ret == 0, got %u\n", ret); + + template = 5; + ret = pPrivacySetZonePreferenceW(zone, type, template, NULL); + ok(ret == 0, "expected ret == 0, got %u\n", ret); + + template = 0; + ret = pPrivacyGetZonePreferenceW(zone, type, &template, NULL, NULL); + ok(ret == 0, "expected ret == 0, got %u\n", ret); + ok(template == 5, "expected template == 5, got %u\n", template); + + template = 5; + ret = pPrivacySetZonePreferenceW(zone, type, old_template, NULL); + ok(ret == 0, "expected ret == 0, got %u\n", ret); +} + +static void test_Option_Policy(void) +{ + HINTERNET hinet; + BOOL ret; + + hinet = InternetOpen(NULL, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0); + ok(hinet != 0, "InternetOpen failed: 0x%08x\n", GetLastError()); + + SetLastError(0xdeadbeef); + ret = InternetSetOptionW(hinet, INTERNET_OPTION_POLICY, NULL, 0); + ok(ret == FALSE, "InternetSetOption should've failed\n"); + ok(GetLastError() == ERROR_INVALID_PARAMETER, "GetLastError should've " + "given ERROR_INVALID_PARAMETER, gave: 0x%08x\n", GetLastError()); + + SetLastError(0xdeadbeef); + ret = InternetQueryOptionW(hinet, INTERNET_OPTION_POLICY, NULL, 0); + ok(ret == FALSE, "InternetQueryOption should've failed\n"); + ok(GetLastError() == ERROR_INVALID_PARAMETER, "GetLastError should've " + "given ERROR_INVALID_PARAMETER, gave: 0x%08x\n", GetLastError()); + + ret = InternetCloseHandle(hinet); + ok(ret == TRUE, "InternetCloseHandle failed: 0x%08x\n", GetLastError()); +} + +#define verifyProxyEnable(e) r_verifyProxyEnable(__LINE__, e) +static void r_verifyProxyEnable(LONG l, DWORD exp) +{ + HKEY hkey; + DWORD type, val, size = sizeof(DWORD); + LONG ret; + static const CHAR szInternetSettings[] = "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings"; + static const CHAR szProxyEnable[] = "ProxyEnable"; + + ret = RegOpenKeyA(HKEY_CURRENT_USER, szInternetSettings, &hkey); + ok_(__FILE__,l) (!ret, "RegOpenKeyA failed: 0x%08x\n", ret); + + ret = RegQueryValueExA(hkey, szProxyEnable, 0, &type, (BYTE*)&val, &size); + ok_(__FILE__,l) (!ret, "RegQueryValueExA failed: 0x%08x\n", ret); + ok_(__FILE__,l) (type == REG_DWORD, "Expected regtype to be REG_DWORD, was: %d\n", type); + ok_(__FILE__,l) (val == exp, "Expected ProxyEnabled to be %d, got: %d\n", exp, val); + + ret = RegCloseKey(hkey); + ok_(__FILE__,l) (!ret, "RegCloseKey failed: 0x%08x\n", ret); +} + +static void test_Option_PerConnectionOption(void) +{ + BOOL ret; + DWORD size = sizeof(INTERNET_PER_CONN_OPTION_LISTW); + INTERNET_PER_CONN_OPTION_LISTW list = {size}; + INTERNET_PER_CONN_OPTIONW *orig_settings; + static WCHAR proxy_srvW[] = {'p','r','o','x','y','.','e','x','a','m','p','l','e',0}; + + /* get the global IE proxy server info, to restore later */ + list.dwOptionCount = 2; + list.pOptions = HeapAlloc(GetProcessHeap(), 0, 2 * sizeof(INTERNET_PER_CONN_OPTIONW)); + + list.pOptions[0].dwOption = INTERNET_PER_CONN_PROXY_SERVER; + list.pOptions[1].dwOption = INTERNET_PER_CONN_FLAGS; + + ret = InternetQueryOptionW(NULL, INTERNET_OPTION_PER_CONNECTION_OPTION, + &list, &size); + ok(ret == TRUE, "InternetQueryOption should've succeeded\n"); + orig_settings = list.pOptions; + + /* set the global IE proxy server */ + list.dwOptionCount = 2; + list.pOptions = HeapAlloc(GetProcessHeap(), 0, 2 * sizeof(INTERNET_PER_CONN_OPTIONW)); + + list.pOptions[0].dwOption = INTERNET_PER_CONN_PROXY_SERVER; + list.pOptions[0].Value.pszValue = proxy_srvW; + list.pOptions[1].dwOption = INTERNET_PER_CONN_FLAGS; + list.pOptions[1].Value.dwValue = PROXY_TYPE_PROXY; + + ret = InternetSetOptionW(NULL, INTERNET_OPTION_PER_CONNECTION_OPTION, + &list, size); + ok(ret == TRUE, "InternetSetOption should've succeeded\n"); + + HeapFree(GetProcessHeap(), 0, list.pOptions); + + /* get & verify the global IE proxy server */ + list.dwOptionCount = 2; + list.dwOptionError = 0; + list.pOptions = HeapAlloc(GetProcessHeap(), 0, 2 * sizeof(INTERNET_PER_CONN_OPTIONW)); + + list.pOptions[0].dwOption = INTERNET_PER_CONN_PROXY_SERVER; + list.pOptions[1].dwOption = INTERNET_PER_CONN_FLAGS; + + ret = InternetQueryOptionW(NULL, INTERNET_OPTION_PER_CONNECTION_OPTION, + &list, &size); + ok(ret == TRUE, "InternetQueryOption should've succeeded\n"); + ok(!strcmp_ww(list.pOptions[0].Value.pszValue, proxy_srvW), + "Retrieved proxy server should've been %s, was: %s\n", + wine_dbgstr_w(proxy_srvW), wine_dbgstr_w(list.pOptions[0].Value.pszValue)); + ok(list.pOptions[1].Value.dwValue == PROXY_TYPE_PROXY, + "Retrieved flags should've been PROXY_TYPE_PROXY, was: %d\n", + list.pOptions[1].Value.dwValue); + verifyProxyEnable(1); + + HeapFree(GetProcessHeap(), 0, list.pOptions[0].Value.pszValue); + HeapFree(GetProcessHeap(), 0, list.pOptions); + + /* disable the proxy server */ + list.dwOptionCount = 1; + list.pOptions = HeapAlloc(GetProcessHeap(), 0, sizeof(INTERNET_PER_CONN_OPTIONW)); + + list.pOptions[0].dwOption = INTERNET_PER_CONN_FLAGS; + list.pOptions[0].Value.dwValue = PROXY_TYPE_DIRECT; + + ret = InternetSetOptionW(NULL, INTERNET_OPTION_PER_CONNECTION_OPTION, + &list, size); + ok(ret == TRUE, "InternetSetOption should've succeeded\n"); + + HeapFree(GetProcessHeap(), 0, list.pOptions); + + /* verify that the proxy is disabled */ + list.dwOptionCount = 1; + list.dwOptionError = 0; + list.pOptions = HeapAlloc(GetProcessHeap(), 0, sizeof(INTERNET_PER_CONN_OPTIONW)); + + list.pOptions[0].dwOption = INTERNET_PER_CONN_FLAGS; + + ret = InternetQueryOptionW(NULL, INTERNET_OPTION_PER_CONNECTION_OPTION, + &list, &size); + ok(ret == TRUE, "InternetQueryOption should've succeeded\n"); + ok(list.pOptions[0].Value.dwValue == PROXY_TYPE_DIRECT, + "Retrieved flags should've been PROXY_TYPE_DIRECT, was: %d\n", + list.pOptions[0].Value.dwValue); + verifyProxyEnable(0); + + HeapFree(GetProcessHeap(), 0, list.pOptions); + + /* set the proxy flags to 'invalid' value */ + list.dwOptionCount = 1; + list.pOptions = HeapAlloc(GetProcessHeap(), 0, sizeof(INTERNET_PER_CONN_OPTIONW)); + + list.pOptions[0].dwOption = INTERNET_PER_CONN_FLAGS; + list.pOptions[0].Value.dwValue = PROXY_TYPE_PROXY | PROXY_TYPE_DIRECT; + + ret = InternetSetOptionW(NULL, INTERNET_OPTION_PER_CONNECTION_OPTION, + &list, size); + ok(ret == TRUE, "InternetSetOption should've succeeded\n"); + + HeapFree(GetProcessHeap(), 0, list.pOptions); + + /* verify that the proxy is enabled */ + list.dwOptionCount = 1; + list.dwOptionError = 0; + list.pOptions = HeapAlloc(GetProcessHeap(), 0, sizeof(INTERNET_PER_CONN_OPTIONW)); + + list.pOptions[0].dwOption = INTERNET_PER_CONN_FLAGS; + + ret = InternetQueryOptionW(NULL, INTERNET_OPTION_PER_CONNECTION_OPTION, + &list, &size); + ok(ret == TRUE, "InternetQueryOption should've succeeded\n"); + todo_wine ok(list.pOptions[0].Value.dwValue == (PROXY_TYPE_PROXY | PROXY_TYPE_DIRECT), + "Retrieved flags should've been PROXY_TYPE_PROXY | PROXY_TYPE_DIRECT, was: %d\n", + list.pOptions[0].Value.dwValue); + verifyProxyEnable(1); + + HeapFree(GetProcessHeap(), 0, list.pOptions); + + /* restore original settings */ + list.dwOptionCount = 2; + list.pOptions = orig_settings; + + ret = InternetSetOptionW(NULL, INTERNET_OPTION_PER_CONNECTION_OPTION, + &list, size); + ok(ret == TRUE, "InternetSetOption should've succeeded\n"); + + HeapFree(GetProcessHeap(), 0, list.pOptions); +} + +static void test_Option_PerConnectionOptionA(void) +{ + BOOL ret; + DWORD size = sizeof(INTERNET_PER_CONN_OPTION_LISTA); + INTERNET_PER_CONN_OPTION_LISTA list = {size}; + INTERNET_PER_CONN_OPTIONA *orig_settings; + char proxy_srv[] = "proxy.example"; + + /* get the global IE proxy server info, to restore later */ + list.dwOptionCount = 2; + list.pOptions = HeapAlloc(GetProcessHeap(), 0, 2 * sizeof(INTERNET_PER_CONN_OPTIONA)); + + list.pOptions[0].dwOption = INTERNET_PER_CONN_PROXY_SERVER; + list.pOptions[1].dwOption = INTERNET_PER_CONN_FLAGS; + + ret = InternetQueryOptionA(NULL, INTERNET_OPTION_PER_CONNECTION_OPTION, + &list, &size); + ok(ret == TRUE, "InternetQueryOption should've succeeded\n"); + orig_settings = list.pOptions; + + /* set the global IE proxy server */ + list.dwOptionCount = 2; + list.pOptions = HeapAlloc(GetProcessHeap(), 0, 2 * sizeof(INTERNET_PER_CONN_OPTIONA)); + + list.pOptions[0].dwOption = INTERNET_PER_CONN_PROXY_SERVER; + list.pOptions[0].Value.pszValue = proxy_srv; + list.pOptions[1].dwOption = INTERNET_PER_CONN_FLAGS; + list.pOptions[1].Value.dwValue = PROXY_TYPE_PROXY; + + ret = InternetSetOptionA(NULL, INTERNET_OPTION_PER_CONNECTION_OPTION, + &list, size); + ok(ret == TRUE, "InternetSetOption should've succeeded\n"); + + HeapFree(GetProcessHeap(), 0, list.pOptions); + + /* get & verify the global IE proxy server */ + list.dwOptionCount = 2; + list.dwOptionError = 0; + list.pOptions = HeapAlloc(GetProcessHeap(), 0, 2 * sizeof(INTERNET_PER_CONN_OPTIONA)); + + list.pOptions[0].dwOption = INTERNET_PER_CONN_PROXY_SERVER; + list.pOptions[1].dwOption = INTERNET_PER_CONN_FLAGS; + + ret = InternetQueryOptionA(NULL, INTERNET_OPTION_PER_CONNECTION_OPTION, + &list, &size); + ok(ret == TRUE, "InternetQueryOption should've succeeded\n"); + ok(!lstrcmpA(list.pOptions[0].Value.pszValue, "proxy.example"), + "Retrieved proxy server should've been \"%s\", was: \"%s\"\n", + proxy_srv, list.pOptions[0].Value.pszValue); + ok(list.pOptions[1].Value.dwValue == PROXY_TYPE_PROXY, + "Retrieved flags should've been PROXY_TYPE_PROXY, was: %d\n", + list.pOptions[1].Value.dwValue); + + HeapFree(GetProcessHeap(), 0, list.pOptions[0].Value.pszValue); + HeapFree(GetProcessHeap(), 0, list.pOptions); + + /* restore original settings */ + list.dwOptionCount = 2; + list.pOptions = orig_settings; + + ret = InternetSetOptionA(NULL, INTERNET_OPTION_PER_CONNECTION_OPTION, + &list, size); + ok(ret == TRUE, "InternetSetOption should've succeeded\n"); + + HeapFree(GetProcessHeap(), 0, list.pOptions); +} + /* ############################### */ START_TEST(internet) @@ -807,6 +1088,8 @@ START_TEST(internet) pInternetTimeToSystemTimeA = (void*)GetProcAddress(hdll, "InternetTimeToSystemTimeA"); pInternetTimeToSystemTimeW = (void*)GetProcAddress(hdll, "InternetTimeToSystemTimeW"); pIsDomainLegalCookieDomainW = (void*)GetProcAddress(hdll, (LPCSTR)117); + pPrivacyGetZonePreferenceW = (void*)GetProcAddress(hdll, "PrivacyGetZonePreferenceW"); + pPrivacySetZonePreferenceW = (void*)GetProcAddress(hdll, "PrivacySetZonePreferenceW"); test_InternetCanonicalizeUrlA(); test_InternetQueryOptionA(); @@ -814,6 +1097,9 @@ START_TEST(internet) test_complicated_cookie(); test_version(); test_null(); + test_Option_Policy(); + test_Option_PerConnectionOption(); + test_Option_PerConnectionOptionA(); if (!pInternetTimeFromSystemTimeA) win_skip("skipping the InternetTime tests\n"); @@ -832,4 +1118,9 @@ START_TEST(internet) win_skip("IsDomainLegalCookieDomainW (or ordinal 117) is not available\n"); else test_IsDomainLegalCookieDomainW(); + + if (pPrivacyGetZonePreferenceW && pPrivacySetZonePreferenceW) + test_PrivacyGetSetZonePreferenceW(); + else + win_skip("Privacy[SG]etZonePreferenceW are not available\n"); } diff --git a/rostests/winetests/wininet/url.c b/rostests/winetests/wininet/url.c index 39c02863351..1f012f01422 100644 --- a/rostests/winetests/wininet/url.c +++ b/rostests/winetests/wininet/url.c @@ -23,21 +23,16 @@ #include #include #include +#include #include "windef.h" #include "winbase.h" +#include "winnls.h" #include "wininet.h" #include "wine/test.h" -#define TEST_URL "http://www.winehq.org/site/about" -#define TEST_URL_HOST "www.winehq.org" -#define TEST_URL_PATH "/site/about" -#define TEST_URL2 "http://www.myserver.com/myscript.php?arg=1" -#define TEST_URL2_SERVER "www.myserver.com" -#define TEST_URL2_PATH "/myscript.php" -#define TEST_URL2_PATHEXTRA "/myscript.php?arg=1" -#define TEST_URL2_EXTRA "?arg=1" +#define TEST_URL "http://www.winehq.org/site/about#hi" #define TEST_URL3 "file:///C:/Program%20Files/Atmel/AVR%20Tools/STK500/STK500.xml" #define CREATE_URL1 "http://username:password@www.winehq.org/site/about" @@ -94,6 +89,190 @@ static void zero_compsA( SetLastError(0xfaceabad); } +typedef struct { + const char *url; + int scheme_off; + int scheme_len; + INTERNET_SCHEME scheme; + int host_off; + int host_len; + int host_skip_broken; + INTERNET_PORT port; + int user_off; + int user_len; + int pass_off; + int pass_len; + int path_off; + int path_len; + int extra_off; + int extra_len; +} crack_url_test_t; + +static const crack_url_test_t crack_url_tests[] = { + {"http://www.winehq.org/site/about#hi", + 0, 4, INTERNET_SCHEME_HTTP, 7, 14, -1, 80, -1, 0, -1, 0, 21, 11, 32, 3}, + {"http://www.myserver.com/myscript.php?arg=1", + 0, 4, INTERNET_SCHEME_HTTP, 7, 16, -1, 80, -1, 0, -1, 0, 23, 13, 36, 6}, + {"http://www.winehq.org?test=123", + 0, 4, INTERNET_SCHEME_HTTP, 7, 14, 23, 80, -1, 0, -1, 0, 21, 0, 21, 9}, + {"file:///C:/Program%20Files/Atmel/AVR%20Tools/STK500/STK500.xml", + 0, 4, INTERNET_SCHEME_FILE, -1, 0, -1, 0, -1, 0, -1, 0, 7, 55, -1, 0}, + {"fide:///C:/Program%20Files/Atmel/AVR%20Tools/STK500/STK500.xml", + 0, 4, INTERNET_SCHEME_UNKNOWN, 7, 0, -1, 0, -1, 0, -1, 0, 7, 55, -1, 0}, + {"file://C:/Program%20Files/Atmel/AVR%20Tools/STK500/STK500.xml", + 0, 4, INTERNET_SCHEME_FILE, -1, 0, -1, 0, -1, 0, -1, 0, 7, 54, -1, 0}, +}; + +static void test_crack_url(const crack_url_test_t *test) +{ + WCHAR buf[INTERNET_MAX_URL_LENGTH]; + URL_COMPONENTSW urlw; + URL_COMPONENTSA url; + BOOL b; + + zero_compsA(&url, 1, 1, 1, 1, 1, 1); + + b = InternetCrackUrlA(test->url, strlen(test->url), 0, &url); + ok(b, "InternetCrackUrl failed with error %d\n", GetLastError()); + + if(test->scheme_off == -1) + ok(!url.lpszScheme, "[%s] url.lpszScheme = %p, expected NULL\n", test->url, url.lpszScheme); + else + ok(url.lpszScheme == test->url+test->scheme_off, "[%s] url.lpszScheme = %p, expected %p\n", + test->url, url.lpszScheme, test->url+test->scheme_off); + ok(url.dwSchemeLength == test->scheme_len, "[%s] url.lpszSchemeLength = %d, expected %d\n", + test->url, url.dwSchemeLength, test->scheme_len); + + ok(url.nScheme == test->scheme, "[%s] url.nScheme = %d, expected %d\n", test->url, url.nScheme, test->scheme); + + if(test->host_off == -1) + ok(!url.lpszHostName, "[%s] url.lpszHostName = %p, expected NULL\n", test->url, url.lpszHostName); + else + ok(url.lpszHostName == test->url+test->host_off, "[%s] url.lpszHostName = %p, expected %p\n", + test->url, url.lpszHostName, test->url+test->host_off); + if(test->host_skip_broken != -1 && url.dwHostNameLength == test->host_skip_broken) { + win_skip("skipping broken dwHostNameLength result\n"); + return; + } + ok(url.dwHostNameLength == test->host_len, "[%s] url.lpszHostNameLength = %d, expected %d\n", + test->url, url.dwHostNameLength, test->host_len); + + ok(url.nPort == test->port, "[%s] nPort = %d, expected %d\n", test->url, url.nPort, test->port); + + if(test->user_off == -1) + ok(!url.lpszUserName, "[%s] url.lpszUserName = %p\n", test->url, url.lpszUserName); + else + ok(url.lpszUserName == test->url+test->user_off, "[%s] url.lpszUserName = %p, expected %p\n", + test->url, url.lpszUserName, test->url+test->user_off); + ok(url.dwUserNameLength == test->user_len, "[%s] url.lpszUserNameLength = %d, expected %d\n", + test->url, url.dwUserNameLength, test->user_len); + + if(test->pass_off == -1) + ok(!url.lpszPassword, "[%s] url.lpszPassword = %p\n", test->url, url.lpszPassword); + else + ok(url.lpszPassword == test->url+test->pass_off, "[%s] url.lpszPassword = %p, expected %p\n", + test->url, url.lpszPassword, test->url+test->pass_off); + ok(url.dwPasswordLength == test->pass_len, "[%s] url.lpszPasswordLength = %d, expected %d\n", + test->url, url.dwPasswordLength, test->pass_len); + + if(test->path_off == -1) + ok(!url.lpszUrlPath, "[%s] url.lpszPath = %p, expected NULL\n", test->url, url.lpszUrlPath); + else + ok(url.lpszUrlPath == test->url+test->path_off, "[%s] url.lpszPath = %p, expected %p\n", + test->url, url.lpszUrlPath, test->url+test->path_off); + ok(url.dwUrlPathLength == test->path_len, "[%s] url.lpszUrlPathLength = %d, expected %d\n", + test->url, url.dwUrlPathLength, test->path_len); + + if(test->extra_off == -1) + ok(!url.lpszExtraInfo, "[%s] url.lpszExtraInfo = %p, expected NULL\n", test->url, url.lpszExtraInfo); + else + ok(url.lpszExtraInfo == test->url+test->extra_off, "[%s] url.lpszExtraInfo = %p, expected %p\n", + test->url, url.lpszExtraInfo, test->url+test->extra_off); + ok(url.dwExtraInfoLength == test->extra_len, "[%s] url.lpszExtraInfoLength = %d, expected %d\n", + test->url, url.dwExtraInfoLength, test->extra_len); + + memset(&urlw, 0, sizeof(URL_COMPONENTSW)); + urlw.dwStructSize = sizeof(URL_COMPONENTSW); + urlw.dwSchemeLength = 1; + urlw.dwHostNameLength = 1; + urlw.dwUserNameLength = 1; + urlw.dwPasswordLength = 1; + urlw.dwUrlPathLength = 1; + urlw.dwExtraInfoLength = 1; + + MultiByteToWideChar(CP_ACP, 0, test->url, -1, buf, sizeof(buf)); + b = InternetCrackUrlW(buf, lstrlenW(buf), 0, &urlw); + if(!b && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) { + win_skip("InternetCrackUrlW is not implemented\n"); + return; + } + ok(b, "InternetCrackUrl failed with error %d\n", GetLastError()); + + if(test->scheme_off == -1) + ok(!urlw.lpszScheme, "[%s] urlw.lpszScheme = %p, expected NULL\n", test->url, urlw.lpszScheme); + else + ok(urlw.lpszScheme == buf+test->scheme_off, "[%s] urlw.lpszScheme = %p, expected %p\n", + test->url, urlw.lpszScheme, buf+test->scheme_off); + ok(urlw.dwSchemeLength == test->scheme_len, "[%s] urlw.lpszSchemeLength = %d, expected %d\n", + test->url, urlw.dwSchemeLength, test->scheme_len); + + ok(urlw.nScheme == test->scheme, "[%s] urlw.nScheme = %d, expected %d\n", test->url, urlw.nScheme, test->scheme); + + if(test->host_off == -1) { + ok(!urlw.lpszHostName, "[%s] urlw.lpszHostName = %p, expected NULL\n", test->url, urlw.lpszHostName); + ok(urlw.dwHostNameLength == 0 || broken(urlw.dwHostNameLength == 1), "[%s] urlw.lpszHostNameLength = %d, expected %d\n", + test->url, urlw.dwHostNameLength, test->host_len); + }else { + ok(urlw.lpszHostName == buf+test->host_off, "[%s] urlw.lpszHostName = %p, expected %p\n", + test->url, urlw.lpszHostName, test->url+test->host_off); + ok(urlw.dwHostNameLength == test->host_len, "[%s] urlw.lpszHostNameLength = %d, expected %d\n", + test->url, urlw.dwHostNameLength, test->host_len); + } + + ok(urlw.nPort == test->port, "[%s] nPort = %d, expected %d\n", test->url, urlw.nPort, test->port); + + if(test->user_off == -1) { + ok(!urlw.lpszUserName, "[%s] urlw.lpszUserName = %p\n", test->url, urlw.lpszUserName); + ok(urlw.dwUserNameLength == 0 || broken(urlw.dwUserNameLength == 1), "[%s] urlw.lpszUserNameLength = %d, expected %d\n", + test->url, urlw.dwUserNameLength, test->user_len); + }else { + ok(urlw.lpszUserName == buf+test->user_off, "[%s] urlw.lpszUserName = %p, expected %p\n", + test->url, urlw.lpszUserName, buf+test->user_off); + ok(urlw.dwUserNameLength == test->user_len, "[%s] urlw.lpszUserNameLength = %d, expected %d\n", + test->url, urlw.dwUserNameLength, test->user_len); + } + + if(test->pass_off == -1) { + ok(!urlw.lpszPassword, "[%s] urlw.lpszPassword = %p\n", test->url, urlw.lpszPassword); + ok(urlw.dwPasswordLength == 0 || broken(urlw.dwPasswordLength), "[%s] urlw.lpszPasswordLength = %d, expected %d\n", + test->url, urlw.dwPasswordLength, test->pass_len); + }else { + ok(urlw.lpszPassword == buf+test->pass_off, "[%s] urlw.lpszPassword = %p, expected %p\n", + test->url, urlw.lpszPassword, buf+test->pass_off); + ok(urlw.dwPasswordLength == test->pass_len, "[%s] urlw.lpszPasswordLength = %d, expected %d\n", + test->url, urlw.dwPasswordLength, test->pass_len); + } + + if(test->path_off == -1) + ok(!urlw.lpszUrlPath, "[%s] urlw.lpszPath = %p, expected NULL\n", test->url, urlw.lpszUrlPath); + else + ok(urlw.lpszUrlPath == buf+test->path_off, "[%s] urlw.lpszPath = %p, expected %p\n", + test->url, urlw.lpszUrlPath, buf+test->path_off); + ok(urlw.dwUrlPathLength == test->path_len, "[%s] urlw.lpszUrlPathLength = %d, expected %d\n", + test->url, urlw.dwUrlPathLength, test->path_len); + + if(test->extra_off == -1) { + ok(!urlw.lpszExtraInfo, "[%s] url.lpszExtraInfo = %p, expected NULL\n", test->url, urlw.lpszExtraInfo); + ok(urlw.dwExtraInfoLength == 0 || broken(urlw.dwExtraInfoLength == 1), "[%s] urlw.lpszExtraInfoLength = %d, expected %d\n", + test->url, urlw.dwExtraInfoLength, test->extra_len); + }else { + ok(urlw.lpszExtraInfo == buf+test->extra_off, "[%s] urlw.lpszExtraInfo = %p, expected %p\n", + test->url, urlw.lpszExtraInfo, buf+test->extra_off); + ok(urlw.dwExtraInfoLength == test->extra_len, "[%s] urlw.lpszExtraInfoLength = %d, expected %d\n", + test->url, urlw.dwExtraInfoLength, test->extra_len); + } +} + static void InternetCrackUrl_test(void) { URL_COMPONENTSA urlSrc, urlComponents; @@ -111,51 +290,6 @@ static void InternetCrackUrl_test(void) urlSrc.lpszUrlPath = path; urlSrc.lpszExtraInfo = extra; - copy_compsA(&urlSrc, &urlComponents, 32, 1024, 1024, 1024, 2048, 1024); - ret = InternetCrackUrl(TEST_URL, 0,0,&urlComponents); - ok( ret, "InternetCrackUrl failed, error %d\n",GetLastError()); - ok((strcmp(TEST_URL_PATH,path) == 0),"path cracked wrong\n"); - - /* Bug 1805: Confirm the returned lengths are correct: */ - /* 1. When extra info split out explicitly */ - zero_compsA(&urlComponents, 0, 1, 0, 0, 1, 1); - ok(InternetCrackUrlA(TEST_URL2, 0, 0, &urlComponents),"InternetCrackUrl failed, error %d\n", GetLastError()); - ok(urlComponents.dwUrlPathLength == strlen(TEST_URL2_PATH),".dwUrlPathLength should be %d, but is %d\n", (DWORD)strlen(TEST_URL2_PATH), urlComponents.dwUrlPathLength); - ok(!strncmp(urlComponents.lpszUrlPath,TEST_URL2_PATH,strlen(TEST_URL2_PATH)),"lpszUrlPath should be %s but is %s\n", TEST_URL2_PATH, urlComponents.lpszUrlPath); - ok(urlComponents.dwHostNameLength == strlen(TEST_URL2_SERVER),".dwHostNameLength should be %d, but is %d\n", (DWORD)strlen(TEST_URL2_SERVER), urlComponents.dwHostNameLength); - ok(!strncmp(urlComponents.lpszHostName,TEST_URL2_SERVER,strlen(TEST_URL2_SERVER)),"lpszHostName should be %s but is %s\n", TEST_URL2_SERVER, urlComponents.lpszHostName); - ok(urlComponents.dwExtraInfoLength == strlen(TEST_URL2_EXTRA),".dwExtraInfoLength should be %d, but is %d\n", (DWORD)strlen(TEST_URL2_EXTRA), urlComponents.dwExtraInfoLength); - ok(!strncmp(urlComponents.lpszExtraInfo,TEST_URL2_EXTRA,strlen(TEST_URL2_EXTRA)),"lpszExtraInfo should be %s but is %s\n", TEST_URL2_EXTRA, urlComponents.lpszHostName); - - /* 2. When extra info is not split out explicitly and is in url path */ - zero_compsA(&urlComponents, 0, 1, 0, 0, 1, 0); - ok(InternetCrackUrlA(TEST_URL2, 0, 0, &urlComponents),"InternetCrackUrl failed with GLE %d\n",GetLastError()); - ok(urlComponents.dwUrlPathLength == strlen(TEST_URL2_PATHEXTRA),".dwUrlPathLength should be %d, but is %d\n", (DWORD)strlen(TEST_URL2_PATHEXTRA), urlComponents.dwUrlPathLength); - ok(!strncmp(urlComponents.lpszUrlPath,TEST_URL2_PATHEXTRA,strlen(TEST_URL2_PATHEXTRA)),"lpszUrlPath should be %s but is %s\n", TEST_URL2_PATHEXTRA, urlComponents.lpszUrlPath); - ok(urlComponents.dwHostNameLength == strlen(TEST_URL2_SERVER),".dwHostNameLength should be %d, but is %d\n", (DWORD)strlen(TEST_URL2_SERVER), urlComponents.dwHostNameLength); - ok(!strncmp(urlComponents.lpszHostName,TEST_URL2_SERVER,strlen(TEST_URL2_SERVER)),"lpszHostName should be %s but is %s\n", TEST_URL2_SERVER, urlComponents.lpszHostName); - ok(urlComponents.nPort == INTERNET_DEFAULT_HTTP_PORT,"urlComponents->nPort should have been 80 instead of %d\n", urlComponents.nPort); - ok(urlComponents.nScheme == INTERNET_SCHEME_HTTP,"urlComponents->nScheme should have been INTERNET_SCHEME_HTTP instead of %d\n", urlComponents.nScheme); - - zero_compsA(&urlComponents, 1, 1, 1, 1, 1, 1); - ok(InternetCrackUrlA(TEST_URL, strlen(TEST_URL), 0, &urlComponents),"InternetCrackUrl failed with GLE %d\n",GetLastError()); - ok(urlComponents.dwUrlPathLength == strlen(TEST_URL_PATH),".dwUrlPathLength should be %d, but is %d\n", lstrlenA(TEST_URL_PATH), urlComponents.dwUrlPathLength); - ok(!strncmp(urlComponents.lpszUrlPath,TEST_URL_PATH,strlen(TEST_URL_PATH)),"lpszUrlPath should be %s but is %s\n", TEST_URL_PATH, urlComponents.lpszUrlPath); - ok(urlComponents.dwHostNameLength == strlen(TEST_URL_HOST),".dwHostNameLength should be %d, but is %d\n", lstrlenA(TEST_URL_HOST), urlComponents.dwHostNameLength); - ok(!strncmp(urlComponents.lpszHostName,TEST_URL_HOST,strlen(TEST_URL_HOST)),"lpszHostName should be %s but is %s\n", TEST_URL_HOST, urlComponents.lpszHostName); - ok(urlComponents.nPort == INTERNET_DEFAULT_HTTP_PORT,"urlComponents->nPort should have been 80 instead of %d\n", urlComponents.nPort); - ok(urlComponents.nScheme == INTERNET_SCHEME_HTTP,"urlComponents->nScheme should have been INTERNET_SCHEME_HTTP instead of %d\n", urlComponents.nScheme); - ok(!urlComponents.lpszUserName, ".lpszUserName should have been set to NULL\n"); - ok(!urlComponents.lpszPassword, ".lpszPassword should have been set to NULL\n"); - ok(!urlComponents.lpszExtraInfo, ".lpszExtraInfo should have been set to NULL\n"); - ok(!urlComponents.dwUserNameLength,".dwUserNameLength should be 0, but is %d\n", urlComponents.dwUserNameLength); - ok(!urlComponents.dwPasswordLength,".dwPasswordLength should be 0, but is %d\n", urlComponents.dwPasswordLength); - ok(!urlComponents.dwExtraInfoLength,".dwExtraInfoLength should be 0, but is %d\n", urlComponents.dwExtraInfoLength); - - /*3. Check for %20 */ - copy_compsA(&urlSrc, &urlComponents, 32, 1024, 1024, 1024, 2048, 1024); - ok(InternetCrackUrlA(TEST_URL3, 0, ICU_DECODE, &urlComponents),"InternetCrackUrl failed with GLE %d\n",GetLastError()); - /* Tests for lpsz* members pointing to real strings while * some corresponding length members are set to zero. * As of IE7 (wininet 7.0*?) all members are checked. So we @@ -810,6 +944,11 @@ static void InternetCreateUrlA_test(void) START_TEST(url) { + int i; + + for(i=0; i < sizeof(crack_url_tests)/sizeof(*crack_url_tests); i++) + test_crack_url(crack_url_tests+i); + InternetCrackUrl_test(); InternetCrackUrlW_test(); InternetCreateUrlA_test(); diff --git a/rostests/winetests/wininet/urlcache.c b/rostests/winetests/wininet/urlcache.c index d13597626de..65e433c69de 100644 --- a/rostests/winetests/wininet/urlcache.c +++ b/rostests/winetests/wininet/urlcache.c @@ -25,15 +25,18 @@ #include "windef.h" #include "winbase.h" #include "wininet.h" +#include "winineti.h" #include "wine/test.h" #define TEST_URL "http://urlcachetest.winehq.org/index.html" +#define TEST_URL1 "Visited: user@http://urlcachetest.winehq.org/index.html" static BOOL (WINAPI *pDeleteUrlCacheEntryA)(LPCSTR); static BOOL (WINAPI *pUnlockUrlCacheEntryFileA)(LPCSTR,DWORD); static char filenameA[MAX_PATH + 1]; +static char filenameA1[MAX_PATH + 1]; static void check_cache_entry_infoA(const char *returnedfrom, LPINTERNET_CACHE_ENTRY_INFO lpCacheEntryInfo) { @@ -53,6 +56,7 @@ static void test_find_url_cache_entriesA(void) LPINTERNET_CACHE_ENTRY_INFO lpCacheEntryInfo; cbCacheEntryInfo = 0; + SetLastError(0xdeadbeef); hEnumHandle = FindFirstUrlCacheEntry(NULL, NULL, &cbCacheEntryInfo); ok(!hEnumHandle, "FindFirstUrlCacheEntry should have failed\n"); ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "FindFirstUrlCacheEntry should have set last error to ERROR_INSUFFICIENT_BUFFER instead of %d\n", GetLastError()); @@ -67,6 +71,7 @@ static void test_find_url_cache_entriesA(void) found = TRUE; break; } + SetLastError(0xdeadbeef); cbCacheEntryInfo = cbCacheEntryInfoSaved; ret = FindNextUrlCacheEntry(hEnumHandle, lpCacheEntryInfo, &cbCacheEntryInfo); if (!ret) @@ -94,19 +99,37 @@ static void test_GetUrlCacheEntryInfoExA(void) DWORD cbCacheEntryInfo; LPINTERNET_CACHE_ENTRY_INFO lpCacheEntryInfo; + SetLastError(0xdeadbeef); ret = GetUrlCacheEntryInfoEx(NULL, NULL, NULL, NULL, NULL, NULL, 0); ok(!ret, "GetUrlCacheEntryInfoEx with NULL URL and NULL args should have failed\n"); - ok(GetLastError() == ERROR_INVALID_PARAMETER, "GetUrlCacheEntryInfoEx with NULL URL and NULL args should have set last error to ERROR_INVALID_PARAMETER instead of %d\n", GetLastError()); + ok(GetLastError() == ERROR_INVALID_PARAMETER, + "GetUrlCacheEntryInfoEx with NULL URL and NULL args should have set last error to ERROR_INVALID_PARAMETER instead of %d\n", GetLastError()); + + cbCacheEntryInfo = sizeof(INTERNET_CACHE_ENTRY_INFO); + SetLastError(0xdeadbeef); + ret = GetUrlCacheEntryInfoEx("", NULL, &cbCacheEntryInfo, NULL, NULL, NULL, 0); + ok(!ret, "GetUrlCacheEntryInfoEx with zero-length buffer should fail\n"); + ok(GetLastError() == ERROR_FILE_NOT_FOUND, + "GetUrlCacheEntryInfoEx should have set last error to ERROR_FILE_NOT_FOUND instead of %d\n", GetLastError()); ret = GetUrlCacheEntryInfoEx(TEST_URL, NULL, NULL, NULL, NULL, NULL, 0); ok(ret, "GetUrlCacheEntryInfoEx with NULL args failed with error %d\n", GetLastError()); cbCacheEntryInfo = 0; + SetLastError(0xdeadbeef); ret = GetUrlCacheEntryInfoEx(TEST_URL, NULL, &cbCacheEntryInfo, NULL, NULL, NULL, 0); ok(!ret, "GetUrlCacheEntryInfoEx with zero-length buffer should fail\n"); - ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "GetUrlCacheEntryInfoEx should have set last error to ERROR_INSUFFICIENT_BUFFER instead of %d\n", GetLastError()); + ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, + "GetUrlCacheEntryInfoEx should have set last error to ERROR_INSUFFICIENT_BUFFER instead of %d\n", GetLastError()); lpCacheEntryInfo = HeapAlloc(GetProcessHeap(), 0, cbCacheEntryInfo); + + SetLastError(0xdeadbeef); + ret = GetUrlCacheEntryInfoEx(TEST_URL, lpCacheEntryInfo, &cbCacheEntryInfo, NULL, NULL, NULL, 0x200); + ok(!ret, "GetUrlCacheEntryInfoEx succeeded\n"); + ok(GetLastError() == ERROR_FILE_NOT_FOUND, + "GetUrlCacheEntryInfoEx should have set last error to ERROR_FILE_NOT_FOUND instead of %d\n", GetLastError()); + ret = GetUrlCacheEntryInfoEx(TEST_URL, lpCacheEntryInfo, &cbCacheEntryInfo, NULL, NULL, NULL, 0); ok(ret, "GetUrlCacheEntryInfoEx failed with error %d\n", GetLastError()); @@ -161,6 +184,11 @@ static void test_urlcacheA(void) ret = CreateUrlCacheEntry(TEST_URL, 0, "html", filenameA, 0); ok(ret, "CreateUrlCacheEntry failed with error %d\n", GetLastError()); + ret = CreateUrlCacheEntry(TEST_URL, 0, "html", filenameA1, 0); + ok(ret, "CreateUrlCacheEntry failed with error %d\n", GetLastError()); + + ok(lstrcmpiA(filenameA, filenameA1), "expected a different file name\n"); + hFile = CreateFileA(filenameA, GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); ok(hFile != INVALID_HANDLE_VALUE, "CreateFileA failed with error %d\n", GetLastError()); @@ -170,13 +198,21 @@ static void test_urlcacheA(void) CloseHandle(hFile); + ret = CommitUrlCacheEntry(TEST_URL1, NULL, filetime_zero, filetime_zero, NORMAL_CACHE_ENTRY|URLHISTORY_CACHE_ENTRY, NULL, 0, NULL, NULL); + ok(ret, "CommitUrlCacheEntry failed with error %d\n", GetLastError()); + + ret = CommitUrlCacheEntry(TEST_URL1, NULL, filetime_zero, filetime_zero, NORMAL_CACHE_ENTRY|URLHISTORY_CACHE_ENTRY, NULL, 0, NULL, NULL); + ok(ret, "CommitUrlCacheEntry failed with error %d\n", GetLastError()); + ret = CommitUrlCacheEntry(TEST_URL, filenameA, filetime_zero, filetime_zero, NORMAL_CACHE_ENTRY, NULL, 0, "html", NULL); ok(ret, "CommitUrlCacheEntry failed with error %d\n", GetLastError()); cbCacheEntryInfo = 0; + SetLastError(0xdeadbeef); ret = RetrieveUrlCacheEntryFile(TEST_URL, NULL, &cbCacheEntryInfo, 0); ok(!ret, "RetrieveUrlCacheEntryFile should have failed\n"); - ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "RetrieveUrlCacheEntryFile should have set last error to ERROR_INSUFFICIENT_BUFFER instead of %d\n", GetLastError()); + ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, + "RetrieveUrlCacheEntryFile should have set last error to ERROR_INSUFFICIENT_BUFFER instead of %d\n", GetLastError()); lpCacheEntryInfo = HeapAlloc(GetProcessHeap(), 0, cbCacheEntryInfo); ret = RetrieveUrlCacheEntryFile(TEST_URL, lpCacheEntryInfo, &cbCacheEntryInfo, 0); @@ -186,6 +222,13 @@ static void test_urlcacheA(void) HeapFree(GetProcessHeap(), 0, lpCacheEntryInfo); + cbCacheEntryInfo = 0; + SetLastError(0xdeadbeef); + ret = RetrieveUrlCacheEntryFile(TEST_URL1, NULL, &cbCacheEntryInfo, 0); + ok(!ret, "RetrieveUrlCacheEntryFile should have failed\n"); + ok(GetLastError() == ERROR_INVALID_DATA, + "RetrieveUrlCacheEntryFile should have set last error to ERROR_INVALID_DATA instead of %d\n", GetLastError()); + if (pUnlockUrlCacheEntryFileA) { ret = pUnlockUrlCacheEntryFileA(TEST_URL, 0); @@ -202,8 +245,11 @@ static void test_urlcacheA(void) { ret = pDeleteUrlCacheEntryA(TEST_URL); ok(ret, "DeleteUrlCacheEntryA failed with error %d\n", GetLastError()); + ret = pDeleteUrlCacheEntryA(TEST_URL1); + ok(ret, "DeleteUrlCacheEntryA failed with error %d\n", GetLastError()); } + SetLastError(0xdeadbeef); ret = DeleteFile(filenameA); todo_wine ok(!ret && GetLastError() == ERROR_FILE_NOT_FOUND, "local file should no longer exist\n"); @@ -213,12 +259,54 @@ static void test_FindCloseUrlCache(void) { BOOL r; DWORD err; + + SetLastError(0xdeadbeef); r = FindCloseUrlCache(NULL); err = GetLastError(); ok(0 == r, "expected 0, got %d\n", r); ok(ERROR_INVALID_HANDLE == err, "expected %d, got %d\n", ERROR_INVALID_HANDLE, err); } +static void test_GetDiskInfoA(void) +{ + BOOL ret; + DWORD error, cluster_size; + DWORDLONG free, total; + char path[MAX_PATH], *p; + + GetSystemDirectoryA(path, MAX_PATH); + if ((p = strchr(path, '\\'))) *++p = 0; + + ret = GetDiskInfoA(path, &cluster_size, &free, &total); + ok(ret, "GetDiskInfoA failed %u\n", GetLastError()); + + ret = GetDiskInfoA(path, &cluster_size, &free, NULL); + ok(ret, "GetDiskInfoA failed %u\n", GetLastError()); + + ret = GetDiskInfoA(path, &cluster_size, NULL, NULL); + ok(ret, "GetDiskInfoA failed %u\n", GetLastError()); + + ret = GetDiskInfoA(path, NULL, NULL, NULL); + ok(ret, "GetDiskInfoA failed %u\n", GetLastError()); + + SetLastError(0xdeadbeef); + strcpy(p, "\\non\\existing\\path"); + ret = GetDiskInfoA(path, NULL, NULL, NULL); + error = GetLastError(); + ok(!ret || + broken(ret), /* < IE7 */ + "GetDiskInfoA succeeded\n"); + ok(error == ERROR_PATH_NOT_FOUND || + broken(error == 0xdeadbeef), /* < IE7 */ + "got %u expected ERROR_PATH_NOT_FOUND\n", error); + + SetLastError(0xdeadbeef); + ret = GetDiskInfoA(NULL, NULL, NULL, NULL); + error = GetLastError(); + ok(!ret, "GetDiskInfoA succeeded\n"); + ok(error == ERROR_INVALID_PARAMETER, "got %u expected ERROR_INVALID_PARAMETER\n", error); +} + START_TEST(urlcache) { HMODULE hdll; @@ -227,4 +315,5 @@ START_TEST(urlcache) pUnlockUrlCacheEntryFileA = (void*)GetProcAddress(hdll, "UnlockUrlCacheEntryFileA"); test_urlcacheA(); test_FindCloseUrlCache(); + test_GetDiskInfoA(); } diff --git a/rostests/winetests/wininet/wininet.rbuild b/rostests/winetests/wininet/wininet.rbuild index 4edfeed88fd..f1ce89a34a3 100644 --- a/rostests/winetests/wininet/wininet.rbuild +++ b/rostests/winetests/wininet/wininet.rbuild @@ -3,10 +3,11 @@ . - + wine wininet ws2_32 + advapi32 ntdll ftp.c generated.c From a31725e572e775f05e811aa9f6744e8f6021d010 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Wed, 21 Apr 2010 22:33:11 +0000 Subject: [PATCH 028/131] [NTOSKRNL] - Replace the broken CM_RESOURCE_LIST_SIZE with a better function that actually works with resource lists that have device-specific data in them (fixes missing device specific data when resources are retrieved with IoGetDeviceProperty) - Separate the resource code out of pnpmgr.c and into pnpres.c - Simplify resource assigning to simply calling one function, IopAssignDeviceResources, which takes care of the registry configuration, translation, etc. - Set the DNF_NEED_ENUMERATION_ONLY flag only AFTER the device is actually started not before - Set DNF_START_FAILED if IRP_MN_START_DEVICE fails - Fix a bug in IoReportDetectedDevice that wrote the AllocConfig value to wrong place svn path=/trunk/; revision=46983 --- reactos/ntoskrnl/include/internal/io.h | 30 +- reactos/ntoskrnl/io/pnpmgr/pnpmgr.c | 1149 +-------------------- reactos/ntoskrnl/io/pnpmgr/pnpreport.c | 45 +- reactos/ntoskrnl/io/pnpmgr/pnpres.c | 1158 ++++++++++++++++++++++ reactos/ntoskrnl/ntoskrnl-generic.rbuild | 1 + 5 files changed, 1209 insertions(+), 1174 deletions(-) create mode 100644 reactos/ntoskrnl/io/pnpmgr/pnpres.c diff --git a/reactos/ntoskrnl/include/internal/io.h b/reactos/ntoskrnl/include/internal/io.h index 1faff6bfcea..9398ef1d7ff 100644 --- a/reactos/ntoskrnl/include/internal/io.h +++ b/reactos/ntoskrnl/include/internal/io.h @@ -88,21 +88,6 @@ #define IopFreeMdlFromLookaside \ ObpFreeCapturedAttributes -// -// Returns the size of a CM_RESOURCE_LIST -// -#define CM_RESOURCE_LIST_SIZE(ResList) \ - (ResList->Count == 1) ? \ - FIELD_OFFSET( \ - CM_RESOURCE_LIST, \ - List[0].PartialResourceList. \ - PartialDescriptors[(ResList)-> \ - List[0]. \ - PartialResourceList. \ - Count]) \ - : \ - FIELD_OFFSET(CM_RESOURCE_LIST, List) - // // Determines if the IRP is Synchronous // @@ -506,6 +491,21 @@ typedef struct _DEVICETREE_TRAVERSE_CONTEXT PVOID Context; } DEVICETREE_TRAVERSE_CONTEXT, *PDEVICETREE_TRAVERSE_CONTEXT; +// +// Resource code +// +ULONG +NTAPI +IopCalculateResourceListSize( + IN PCM_RESOURCE_LIST ResourceList +); + +NTSTATUS +NTAPI +IopAssignDeviceResources( + IN PDEVICE_NODE DeviceNode +); + // // PNP Routines // diff --git a/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c b/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c index 35c7447dc41..dbfada18ed9 100644 --- a/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c +++ b/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c @@ -44,21 +44,6 @@ typedef struct _INVALIDATE_DEVICE_RELATION_DATA } INVALIDATE_DEVICE_RELATION_DATA, *PINVALIDATE_DEVICE_RELATION_DATA; /* FUNCTIONS *****************************************************************/ - -NTSTATUS -IopAssignDeviceResources( - IN PDEVICE_NODE DeviceNode, - OUT ULONG *pRequiredSize); - -NTSTATUS -IopTranslateDeviceResources( - IN PDEVICE_NODE DeviceNode, - IN ULONG RequiredSize); - -NTSTATUS -IopUpdateResourceMapForPnPDevice( - IN PDEVICE_NODE DeviceNode); - NTSTATUS NTAPI IopCreateDeviceKeyPath(IN PCUNICODE_STRING RegistryPath, @@ -133,7 +118,6 @@ IopInitializeDevice(PDEVICE_NODE DeviceNode, ObDereferenceObject(Fdo); IopDeviceNodeSetFlag(DeviceNode, DNF_ADDED); - IopDeviceNodeSetFlag(DeviceNode, DNF_NEED_ENUMERATION_ONLY); return STATUS_SUCCESS; } @@ -156,13 +140,9 @@ IopStartDevice2(IN PDEVICE_OBJECT DeviceObject) Stack.MinorFunction = IRP_MN_START_DEVICE; /* Check if we didn't already report the resources */ - // if (!DeviceNode->Flags & DNF_RESOURCE_REPORTED) + if (!(DeviceNode->Flags & DNF_RESOURCE_REPORTED)) { /* Report them */ - if (DeviceNode->Flags & DNF_RESOURCE_REPORTED) - { - DPRINT1("Warning: Setting resource pointers even though DNF_RESOURCE_REPORTED is set\n"); - } Stack.Parameters.StartDevice.AllocatedResources = DeviceNode->ResourceList; Stack.Parameters.StartDevice.AllocatedResourcesTranslated = @@ -176,15 +156,21 @@ IopStartDevice2(IN PDEVICE_OBJECT DeviceObject) Status = IopSynchronousCall(DeviceObject, &Stack, &Dummy); if (!NT_SUCCESS(Status)) { - /* FIXME: TODO */ - DPRINT1("Warning: PnP Start failed\n"); - //ASSERT(FALSE); + /* We failed start */ + DeviceNode->Flags |= DNF_START_FAILED; + + /* TODO: Undo all the stuff we did up to this point */ + + DPRINT1("Warning: PnP Start failed (%wZ)\n", &DeviceNode->InstancePath); return; } /* Otherwise, mark us as started */ DeviceNode->Flags |= DNF_STARTED; - + + /* We reported the resources */ + DeviceNode->Flags |= DNF_RESOURCE_REPORTED; + /* We now need enumeration */ DeviceNode->Flags |= DNF_NEED_ENUMERATION_ONLY; } @@ -198,11 +184,12 @@ IopStartAndEnumerateDevice(IN PDEVICE_NODE DeviceNode) PAGED_CODE(); /* Sanity check */ - // ASSERT((DeviceNode->Flags & DNF_ADDED)); - if (!(DeviceNode->Flags & DNF_ADDED)) DPRINT1("Warning: Starting a device node without DNF_ADDED\n"); + // ASSERT((DeviceNode->Flags & DNF_ADDED) || (DeviceNode->Flags & DNF_ENUMERATED)); + if (!(DeviceNode->Flags & DNF_ADDED) && !(DeviceNode->Flags & DNF_ENUMERATED)) + DPRINT1("Warning: Starting a device node without DNF_ADDED or DNF_ENUMERATED (%wZ)\n", + &DeviceNode->InstancePath); ASSERT((DeviceNode->Flags & (DNF_RESOURCE_ASSIGNED | DNF_RESOURCE_REPORTED | - DNF_NO_RESOURCE_REQUIRED | DNF_NO_RESOURCE_REQUIRED))); ASSERT((!(DeviceNode->Flags & (DNF_HAS_PROBLEM | DNF_STARTED | @@ -212,26 +199,27 @@ IopStartAndEnumerateDevice(IN PDEVICE_NODE DeviceNode) DeviceObject = DeviceNode->PhysicalDeviceObject; /* Check if we're not started yet */ - //if (!DeviceNode->Flags & DNF_STARTED) + if (!(DeviceNode->Flags & DNF_STARTED)) { /* Start us */ IopStartDevice2(DeviceObject); } /* Do we need to query IDs? This happens in the case of manual reporting */ - //if (DeviceNode->Flags & DNF_NEED_QUERY_IDS) - //{ - // DPRINT1("Warning: Device node has DNF_NEED_QUERY_IDS\n"); +#if 0 + if (DeviceNode->Flags & DNF_NEED_QUERY_IDS) + { + DPRINT1("Warning: Device node has DNF_NEED_QUERY_IDS\n"); /* And that case shouldn't happen yet */ - // ASSERT(FALSE); - //} + ASSERT(FALSE); + } +#endif /* Make sure we're started, and check if we need enumeration */ if ((DeviceNode->Flags & DNF_STARTED) && (DeviceNode->Flags & DNF_NEED_ENUMERATION_ONLY)) { /* Enumerate us */ - //Status = IopEnumerateDevice(DeviceObject); IoSynchronousInvalidateDeviceRelations(DeviceObject, BusRelations); IopDeviceNodeClearFlag(DeviceNode, DNF_NEED_ENUMERATION_ONLY); Status = STATUS_SUCCESS; @@ -250,56 +238,12 @@ NTSTATUS IopStartDevice( PDEVICE_NODE DeviceNode) { - IO_STATUS_BLOCK IoStatusBlock; - IO_STACK_LOCATION Stack; - ULONG RequiredLength; NTSTATUS Status; HANDLE InstanceHandle = INVALID_HANDLE_VALUE, ControlHandle = INVALID_HANDLE_VALUE; UNICODE_STRING KeyName; OBJECT_ATTRIBUTES ObjectAttributes; - IopDeviceNodeSetFlag(DeviceNode, DNF_ASSIGNING_RESOURCES); - DPRINT("Sending IRP_MN_FILTER_RESOURCE_REQUIREMENTS to device stack\n"); - Stack.Parameters.FilterResourceRequirements.IoResourceRequirementList = DeviceNode->ResourceRequirements; - Status = IopInitiatePnpIrp( - DeviceNode->PhysicalDeviceObject, - &IoStatusBlock, - IRP_MN_FILTER_RESOURCE_REQUIREMENTS, - &Stack); - if (!NT_SUCCESS(Status) && Status != STATUS_NOT_SUPPORTED) - { - DPRINT("IopInitiatePnpIrp(IRP_MN_FILTER_RESOURCE_REQUIREMENTS) failed\n"); - IopDeviceNodeClearFlag(DeviceNode, DNF_ASSIGNING_RESOURCES); - return Status; - } - else if (NT_SUCCESS(Status)) - { - DeviceNode->ResourceRequirements = (PIO_RESOURCE_REQUIREMENTS_LIST)IoStatusBlock.Information; - } - - Status = IopAssignDeviceResources(DeviceNode, &RequiredLength); - if (NT_SUCCESS(Status)) - { - Status = IopTranslateDeviceResources(DeviceNode, RequiredLength); - if (NT_SUCCESS(Status)) - { - Status = IopUpdateResourceMapForPnPDevice(DeviceNode); - if (!NT_SUCCESS(Status)) - { - DPRINT("IopUpdateResourceMap() failed (Status 0x%08lx)\n", Status); - } - } - else - { - DPRINT("IopTranslateDeviceResources() failed (Status 0x%08lx)\n", Status); - } - } - else - { - DPRINT("IopAssignDeviceResources() failed (Status 0x%08lx)\n", Status); - } - IopDeviceNodeClearFlag(DeviceNode, DNF_ASSIGNING_RESOURCES); - + Status = IopAssignDeviceResources(DeviceNode); if (!NT_SUCCESS(Status)) goto ByeBye; @@ -326,21 +270,8 @@ IopStartDevice( RtlInitUnicodeString(&KeyName, L"ActiveService"); Status = ZwSetValueKey(ControlHandle, &KeyName, 0, REG_SZ, DeviceNode->ServiceName.Buffer, DeviceNode->ServiceName.Length); // } - - /* FIX: Should be done somewhere in resoure code? */ - if (NT_SUCCESS(Status) && DeviceNode->ResourceList) - { - RtlInitUnicodeString(&KeyName, L"AllocConfig"); - Status = ZwSetValueKey(ControlHandle, &KeyName, 0, REG_RESOURCE_LIST, - DeviceNode->ResourceList, CM_RESOURCE_LIST_SIZE(DeviceNode->ResourceList)); - } ByeBye: - if (NT_SUCCESS(Status)) - IopDeviceNodeSetFlag(DeviceNode, DNF_STARTED); - else - IopDeviceNodeSetFlag(DeviceNode, DNF_START_FAILED); - if (ControlHandle != INVALID_HANDLE_VALUE) ZwClose(ControlHandle); @@ -957,135 +888,6 @@ IopCreateDeviceKeyPath(IN PCUNICODE_STRING RegistryPath, return STATUS_UNSUCCESSFUL; } -NTSTATUS -IopUpdateResourceMap(IN PDEVICE_NODE DeviceNode, PWCHAR Level1Key, PWCHAR Level2Key) -{ - NTSTATUS Status; - ULONG Disposition; - HANDLE PnpMgrLevel1, PnpMgrLevel2, ResourceMapKey; - UNICODE_STRING KeyName; - OBJECT_ATTRIBUTES ObjectAttributes; - - RtlInitUnicodeString(&KeyName, - L"\\Registry\\Machine\\HARDWARE\\RESOURCEMAP"); - InitializeObjectAttributes(&ObjectAttributes, - &KeyName, - OBJ_CASE_INSENSITIVE | OBJ_OPENIF, - 0, - NULL); - Status = ZwCreateKey(&ResourceMapKey, - KEY_ALL_ACCESS, - &ObjectAttributes, - 0, - NULL, - REG_OPTION_VOLATILE, - &Disposition); - if (!NT_SUCCESS(Status)) - return Status; - - RtlInitUnicodeString(&KeyName, Level1Key); - InitializeObjectAttributes(&ObjectAttributes, - &KeyName, - OBJ_CASE_INSENSITIVE | OBJ_OPENIF, - ResourceMapKey, - NULL); - Status = ZwCreateKey(&PnpMgrLevel1, - KEY_ALL_ACCESS, - &ObjectAttributes, - 0, - NULL, - REG_OPTION_VOLATILE, - &Disposition); - ZwClose(ResourceMapKey); - if (!NT_SUCCESS(Status)) - return Status; - - RtlInitUnicodeString(&KeyName, Level2Key); - InitializeObjectAttributes(&ObjectAttributes, - &KeyName, - OBJ_CASE_INSENSITIVE | OBJ_OPENIF, - PnpMgrLevel1, - NULL); - Status = ZwCreateKey(&PnpMgrLevel2, - KEY_ALL_ACCESS, - &ObjectAttributes, - 0, - NULL, - REG_OPTION_VOLATILE, - &Disposition); - ZwClose(PnpMgrLevel1); - if (!NT_SUCCESS(Status)) - return Status; - - if (DeviceNode->ResourceList) - { - WCHAR NameBuff[256]; - UNICODE_STRING NameU; - UNICODE_STRING Suffix; - ULONG OldLength; - - ASSERT(DeviceNode->ResourceListTranslated); - - NameU.Buffer = NameBuff; - NameU.Length = 0; - NameU.MaximumLength = 256 * sizeof(WCHAR); - - Status = IoGetDeviceProperty(DeviceNode->PhysicalDeviceObject, - DevicePropertyPhysicalDeviceObjectName, - NameU.MaximumLength, - NameU.Buffer, - &OldLength); - ASSERT(Status == STATUS_SUCCESS); - - NameU.Length = (USHORT)OldLength; - - RtlInitUnicodeString(&Suffix, L".Raw"); - RtlAppendUnicodeStringToString(&NameU, &Suffix); - - Status = ZwSetValueKey(PnpMgrLevel2, - &NameU, - 0, - REG_RESOURCE_LIST, - DeviceNode->ResourceList, - CM_RESOURCE_LIST_SIZE(DeviceNode->ResourceList)); - if (!NT_SUCCESS(Status)) - { - ZwClose(PnpMgrLevel2); - return Status; - } - - /* "Remove" the suffix by setting the length back to what it used to be */ - NameU.Length = (USHORT)OldLength; - - RtlInitUnicodeString(&Suffix, L".Translated"); - RtlAppendUnicodeStringToString(&NameU, &Suffix); - - Status = ZwSetValueKey(PnpMgrLevel2, - &NameU, - 0, - REG_RESOURCE_LIST, - DeviceNode->ResourceListTranslated, - CM_RESOURCE_LIST_SIZE(DeviceNode->ResourceListTranslated)); - ZwClose(PnpMgrLevel2); - if (!NT_SUCCESS(Status)) - return Status; - } - else - { - ZwClose(PnpMgrLevel2); - } - - IopDeviceNodeSetFlag(DeviceNode, DNF_RESOURCE_ASSIGNED); - - return STATUS_SUCCESS; -} - -NTSTATUS -IopUpdateResourceMapForPnPDevice(IN PDEVICE_NODE DeviceNode) -{ - return IopUpdateResourceMap(DeviceNode, L"PnP Manager", L"PnpManager"); -} - NTSTATUS IopSetDeviceInstanceData(HANDLE InstanceKey, PDEVICE_NODE DeviceNode) @@ -1094,7 +896,7 @@ IopSetDeviceInstanceData(HANDLE InstanceKey, UNICODE_STRING KeyName; HANDLE LogConfKey; ULONG ResCount; - ULONG ListSize, ResultLength; + ULONG ResultLength; NTSTATUS Status; HANDLE ControlHandle; @@ -1122,15 +924,13 @@ IopSetDeviceInstanceData(HANDLE InstanceKey, ResCount = DeviceNode->BootResources->Count; if (ResCount != 0) { - ListSize = CM_RESOURCE_LIST_SIZE(DeviceNode->BootResources); - RtlInitUnicodeString(&KeyName, L"BootConfig"); Status = ZwSetValueKey(LogConfKey, &KeyName, 0, REG_RESOURCE_LIST, DeviceNode->BootResources, - ListSize); + IopCalculateResourceListSize(DeviceNode->BootResources)); } } @@ -1187,894 +987,6 @@ IopSetDeviceInstanceData(HANDLE InstanceKey, return Status; } -BOOLEAN -IopCheckResourceDescriptor( - IN PCM_PARTIAL_RESOURCE_DESCRIPTOR ResDesc, - IN PCM_RESOURCE_LIST ResourceList, - IN BOOLEAN Silent, - OUT OPTIONAL PCM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDescriptor) -{ - ULONG i, ii; - BOOLEAN Result = FALSE; - - if (ResDesc->ShareDisposition == CmResourceShareShared) - return FALSE; - - for (i = 0; i < ResourceList->Count; i++) - { - PCM_PARTIAL_RESOURCE_LIST ResList = &ResourceList->List[i].PartialResourceList; - for (ii = 0; ii < ResList->Count; ii++) - { - PCM_PARTIAL_RESOURCE_DESCRIPTOR ResDesc2 = &ResList->PartialDescriptors[ii]; - - /* We don't care about shared resources */ - if (ResDesc->ShareDisposition == CmResourceShareShared && - ResDesc2->ShareDisposition == CmResourceShareShared) - continue; - - /* Make sure we're comparing the same types */ - if (ResDesc->Type != ResDesc2->Type) - continue; - - switch (ResDesc->Type) - { - case CmResourceTypeMemory: - if ((ResDesc->u.Memory.Start.QuadPart < ResDesc2->u.Memory.Start.QuadPart && - ResDesc->u.Memory.Start.QuadPart + ResDesc->u.Memory.Length > - ResDesc2->u.Memory.Start.QuadPart) || (ResDesc2->u.Memory.Start.QuadPart < - ResDesc->u.Memory.Start.QuadPart && ResDesc2->u.Memory.Start.QuadPart + - ResDesc2->u.Memory.Length > ResDesc->u.Memory.Start.QuadPart)) - { - if (!Silent) - { - DPRINT1("Resource conflict: Memory (0x%x to 0x%x vs. 0x%x to 0x%x)\n", - ResDesc->u.Memory.Start.QuadPart, ResDesc->u.Memory.Start.QuadPart + - ResDesc->u.Memory.Length, ResDesc2->u.Memory.Start.QuadPart, - ResDesc2->u.Memory.Start.QuadPart + ResDesc2->u.Memory.Length); - } - - Result = TRUE; - - goto ByeBye; - } - break; - - case CmResourceTypePort: - if ((ResDesc->u.Port.Start.QuadPart < ResDesc2->u.Port.Start.QuadPart && - ResDesc->u.Port.Start.QuadPart + ResDesc->u.Port.Length > - ResDesc2->u.Port.Start.QuadPart) || (ResDesc2->u.Port.Start.QuadPart < - ResDesc->u.Port.Start.QuadPart && ResDesc2->u.Port.Start.QuadPart + - ResDesc2->u.Port.Length > ResDesc->u.Port.Start.QuadPart)) - { - if (!Silent) - { - DPRINT1("Resource conflict: Port (0x%x to 0x%x vs. 0x%x to 0x%x)\n", - ResDesc->u.Port.Start.QuadPart, ResDesc->u.Port.Start.QuadPart + - ResDesc->u.Port.Length, ResDesc2->u.Port.Start.QuadPart, - ResDesc2->u.Port.Start.QuadPart + ResDesc2->u.Port.Length); - } - - Result = TRUE; - - goto ByeBye; - } - break; - - case CmResourceTypeInterrupt: - if (ResDesc->u.Interrupt.Vector == ResDesc2->u.Interrupt.Vector) - { - if (!Silent) - { - DPRINT1("Resource conflict: IRQ (0x%x 0x%x vs. 0x%x 0x%x)\n", - ResDesc->u.Interrupt.Vector, ResDesc->u.Interrupt.Level, - ResDesc2->u.Interrupt.Vector, ResDesc2->u.Interrupt.Level); - } - - Result = TRUE; - - goto ByeBye; - } - break; - - case CmResourceTypeBusNumber: - if ((ResDesc->u.BusNumber.Start < ResDesc2->u.BusNumber.Start && - ResDesc->u.BusNumber.Start + ResDesc->u.BusNumber.Length > - ResDesc2->u.BusNumber.Start) || (ResDesc2->u.BusNumber.Start < - ResDesc->u.BusNumber.Start && ResDesc2->u.BusNumber.Start + - ResDesc2->u.BusNumber.Length > ResDesc->u.BusNumber.Start)) - { - if (!Silent) - { - DPRINT1("Resource conflict: Bus number (0x%x to 0x%x vs. 0x%x to 0x%x)\n", - ResDesc->u.BusNumber.Start, ResDesc->u.BusNumber.Start + - ResDesc->u.BusNumber.Length, ResDesc2->u.BusNumber.Start, - ResDesc2->u.BusNumber.Start + ResDesc2->u.BusNumber.Length); - } - - Result = TRUE; - - goto ByeBye; - } - break; - - case CmResourceTypeDma: - if (ResDesc->u.Dma.Channel == ResDesc2->u.Dma.Channel) - { - if (!Silent) - { - DPRINT1("Resource conflict: Dma (0x%x 0x%x vs. 0x%x 0x%x)\n", - ResDesc->u.Dma.Channel, ResDesc->u.Dma.Port, - ResDesc2->u.Dma.Channel, ResDesc2->u.Dma.Port); - } - - Result = TRUE; - - goto ByeBye; - } - break; - } - } - } - -ByeBye: - - if (Result && ConflictingDescriptor) - { - RtlCopyMemory(ConflictingDescriptor, - ResDesc, - sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR)); - } - - return Result; -} - - -BOOLEAN -IopCheckForResourceConflict( - IN PCM_RESOURCE_LIST ResourceList1, - IN PCM_RESOURCE_LIST ResourceList2, - IN BOOLEAN Silent, - OUT OPTIONAL PCM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDescriptor) -{ - ULONG i, ii; - BOOLEAN Result = FALSE; - - for (i = 0; i < ResourceList1->Count; i++) - { - PCM_PARTIAL_RESOURCE_LIST ResList = &ResourceList1->List[i].PartialResourceList; - for (ii = 0; ii < ResList->Count; ii++) - { - PCM_PARTIAL_RESOURCE_DESCRIPTOR ResDesc = &ResList->PartialDescriptors[ii]; - - Result = IopCheckResourceDescriptor(ResDesc, - ResourceList2, - Silent, - ConflictingDescriptor); - if (Result) goto ByeBye; - } - } - - -ByeBye: - - return Result; -} - -NTSTATUS -IopDetectResourceConflict( - IN PCM_RESOURCE_LIST ResourceList, - IN BOOLEAN Silent, - OUT OPTIONAL PCM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDescriptor) -{ - OBJECT_ATTRIBUTES ObjectAttributes; - UNICODE_STRING KeyName; - HANDLE ResourceMapKey = INVALID_HANDLE_VALUE, ChildKey2 = INVALID_HANDLE_VALUE, ChildKey3 = INVALID_HANDLE_VALUE; - ULONG KeyInformationLength, RequiredLength, KeyValueInformationLength, KeyNameInformationLength; - PKEY_BASIC_INFORMATION KeyInformation; - PKEY_VALUE_PARTIAL_INFORMATION KeyValueInformation; - PKEY_VALUE_BASIC_INFORMATION KeyNameInformation; - ULONG ChildKeyIndex1 = 0, ChildKeyIndex2 = 0, ChildKeyIndex3 = 0; - NTSTATUS Status; - - RtlInitUnicodeString(&KeyName, L"\\Registry\\Machine\\HARDWARE\\RESOURCEMAP"); - InitializeObjectAttributes(&ObjectAttributes, &KeyName, OBJ_CASE_INSENSITIVE, 0, NULL); - Status = ZwOpenKey(&ResourceMapKey, KEY_ENUMERATE_SUB_KEYS | KEY_QUERY_VALUE, &ObjectAttributes); - if (!NT_SUCCESS(Status)) - { - /* The key is missing which means we are the first device */ - return STATUS_SUCCESS; - } - - while (TRUE) - { - Status = ZwEnumerateKey(ResourceMapKey, - ChildKeyIndex1, - KeyBasicInformation, - NULL, - 0, - &RequiredLength); - if (Status == STATUS_NO_MORE_ENTRIES) - break; - else if (Status == STATUS_BUFFER_OVERFLOW || Status == STATUS_BUFFER_TOO_SMALL) - { - KeyInformationLength = RequiredLength; - KeyInformation = ExAllocatePool(PagedPool, KeyInformationLength); - if (!KeyInformation) - { - Status = STATUS_INSUFFICIENT_RESOURCES; - goto cleanup; - } - - Status = ZwEnumerateKey(ResourceMapKey, - ChildKeyIndex1, - KeyBasicInformation, - KeyInformation, - KeyInformationLength, - &RequiredLength); - } - else - goto cleanup; - ChildKeyIndex1++; - if (!NT_SUCCESS(Status)) - goto cleanup; - - KeyName.Buffer = KeyInformation->Name; - KeyName.MaximumLength = KeyName.Length = KeyInformation->NameLength; - InitializeObjectAttributes(&ObjectAttributes, - &KeyName, - OBJ_CASE_INSENSITIVE, - ResourceMapKey, - NULL); - Status = ZwOpenKey(&ChildKey2, KEY_ENUMERATE_SUB_KEYS | KEY_QUERY_VALUE, &ObjectAttributes); - ExFreePool(KeyInformation); - if (!NT_SUCCESS(Status)) - goto cleanup; - - while (TRUE) - { - Status = ZwEnumerateKey(ChildKey2, - ChildKeyIndex2, - KeyBasicInformation, - NULL, - 0, - &RequiredLength); - if (Status == STATUS_NO_MORE_ENTRIES) - break; - else if (Status == STATUS_BUFFER_TOO_SMALL) - { - KeyInformationLength = RequiredLength; - KeyInformation = ExAllocatePool(PagedPool, KeyInformationLength); - if (!KeyInformation) - { - Status = STATUS_INSUFFICIENT_RESOURCES; - goto cleanup; - } - - Status = ZwEnumerateKey(ChildKey2, - ChildKeyIndex2, - KeyBasicInformation, - KeyInformation, - KeyInformationLength, - &RequiredLength); - } - else - goto cleanup; - ChildKeyIndex2++; - if (!NT_SUCCESS(Status)) - goto cleanup; - - KeyName.Buffer = KeyInformation->Name; - KeyName.MaximumLength = KeyName.Length = KeyInformation->NameLength; - InitializeObjectAttributes(&ObjectAttributes, - &KeyName, - OBJ_CASE_INSENSITIVE, - ChildKey2, - NULL); - Status = ZwOpenKey(&ChildKey3, KEY_QUERY_VALUE, &ObjectAttributes); - ExFreePool(KeyInformation); - if (!NT_SUCCESS(Status)) - goto cleanup; - - while (TRUE) - { - Status = ZwEnumerateValueKey(ChildKey3, - ChildKeyIndex3, - KeyValuePartialInformation, - NULL, - 0, - &RequiredLength); - if (Status == STATUS_NO_MORE_ENTRIES) - break; - else if (Status == STATUS_BUFFER_TOO_SMALL) - { - KeyValueInformationLength = RequiredLength; - KeyValueInformation = ExAllocatePool(PagedPool, KeyValueInformationLength); - if (!KeyValueInformation) - { - Status = STATUS_INSUFFICIENT_RESOURCES; - goto cleanup; - } - - Status = ZwEnumerateValueKey(ChildKey3, - ChildKeyIndex3, - KeyValuePartialInformation, - KeyValueInformation, - KeyValueInformationLength, - &RequiredLength); - } - else - goto cleanup; - if (!NT_SUCCESS(Status)) - goto cleanup; - - Status = ZwEnumerateValueKey(ChildKey3, - ChildKeyIndex3, - KeyValueBasicInformation, - NULL, - 0, - &RequiredLength); - if (Status == STATUS_BUFFER_TOO_SMALL) - { - KeyNameInformationLength = RequiredLength; - KeyNameInformation = ExAllocatePool(PagedPool, KeyNameInformationLength + sizeof(WCHAR)); - if (!KeyNameInformation) - { - Status = STATUS_INSUFFICIENT_RESOURCES; - goto cleanup; - } - - Status = ZwEnumerateValueKey(ChildKey3, - ChildKeyIndex3, - KeyValueBasicInformation, - KeyNameInformation, - KeyNameInformationLength, - &RequiredLength); - } - else - goto cleanup; - - ChildKeyIndex3++; - - if (!NT_SUCCESS(Status)) - goto cleanup; - - KeyNameInformation->Name[KeyNameInformation->NameLength / sizeof(WCHAR)] = UNICODE_NULL; - - /* Skip translated entries */ - if (wcsstr(KeyNameInformation->Name, L".Translated")) - { - ExFreePool(KeyNameInformation); - continue; - } - - ExFreePool(KeyNameInformation); - - if (IopCheckForResourceConflict(ResourceList, - (PCM_RESOURCE_LIST)KeyValueInformation->Data, - Silent, - ConflictingDescriptor)) - { - ExFreePool(KeyValueInformation); - Status = STATUS_CONFLICTING_ADDRESSES; - goto cleanup; - } - - ExFreePool(KeyValueInformation); - } - } - } - -cleanup: - if (ResourceMapKey != INVALID_HANDLE_VALUE) - ZwClose(ResourceMapKey); - if (ChildKey2 != INVALID_HANDLE_VALUE) - ZwClose(ChildKey2); - if (ChildKey3 != INVALID_HANDLE_VALUE) - ZwClose(ChildKey3); - - if (Status == STATUS_NO_MORE_ENTRIES) - Status = STATUS_SUCCESS; - - return Status; -} - -BOOLEAN -IopCheckDescriptorForConflict(PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDesc, OPTIONAL PCM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDescriptor) -{ - CM_RESOURCE_LIST CmList; - NTSTATUS Status; - - CmList.Count = 1; - CmList.List[0].InterfaceType = InterfaceTypeUndefined; - CmList.List[0].BusNumber = 0; - CmList.List[0].PartialResourceList.Version = 1; - CmList.List[0].PartialResourceList.Revision = 1; - CmList.List[0].PartialResourceList.Count = 1; - CmList.List[0].PartialResourceList.PartialDescriptors[0] = *CmDesc; - - Status = IopDetectResourceConflict(&CmList, TRUE, ConflictingDescriptor); - if (Status == STATUS_CONFLICTING_ADDRESSES) - return TRUE; - - return FALSE; -} - -BOOLEAN -IopFindBusNumberResource( - IN PIO_RESOURCE_DESCRIPTOR IoDesc, - OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDesc) -{ - ULONG Start; - CM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDesc; - - ASSERT(IoDesc->Type == CmDesc->Type); - ASSERT(IoDesc->Type == CmResourceTypeBusNumber); - - for (Start = IoDesc->u.BusNumber.MinBusNumber; - Start < IoDesc->u.BusNumber.MaxBusNumber; - Start++) - { - CmDesc->u.BusNumber.Length = IoDesc->u.BusNumber.Length; - CmDesc->u.BusNumber.Start = Start; - - if (IopCheckDescriptorForConflict(CmDesc, &ConflictingDesc)) - { - Start += ConflictingDesc.u.BusNumber.Start + ConflictingDesc.u.BusNumber.Length; - } - else - { - return TRUE; - } - } - - return FALSE; -} - -BOOLEAN -IopFindMemoryResource( - IN PIO_RESOURCE_DESCRIPTOR IoDesc, - OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDesc) -{ - ULONGLONG Start; - CM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDesc; - - ASSERT(IoDesc->Type == CmDesc->Type); - ASSERT(IoDesc->Type == CmResourceTypeMemory); - - for (Start = IoDesc->u.Memory.MinimumAddress.QuadPart; - Start < IoDesc->u.Memory.MaximumAddress.QuadPart; - Start++) - { - CmDesc->u.Memory.Length = IoDesc->u.Memory.Length; - CmDesc->u.Memory.Start.QuadPart = Start; - - if (IopCheckDescriptorForConflict(CmDesc, &ConflictingDesc)) - { - Start += ConflictingDesc.u.Memory.Start.QuadPart + ConflictingDesc.u.Memory.Length; - } - else - { - return TRUE; - } - } - - return FALSE; -} - -BOOLEAN -IopFindPortResource( - IN PIO_RESOURCE_DESCRIPTOR IoDesc, - OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDesc) -{ - ULONGLONG Start; - CM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDesc; - - ASSERT(IoDesc->Type == CmDesc->Type); - ASSERT(IoDesc->Type == CmResourceTypePort); - - for (Start = IoDesc->u.Port.MinimumAddress.QuadPart; - Start < IoDesc->u.Port.MaximumAddress.QuadPart; - Start++) - { - CmDesc->u.Port.Length = IoDesc->u.Port.Length; - CmDesc->u.Port.Start.QuadPart = Start; - - if (IopCheckDescriptorForConflict(CmDesc, &ConflictingDesc)) - { - Start += ConflictingDesc.u.Port.Start.QuadPart + ConflictingDesc.u.Port.Length; - } - else - { - return TRUE; - } - } - - return FALSE; -} - -BOOLEAN -IopFindDmaResource( - IN PIO_RESOURCE_DESCRIPTOR IoDesc, - OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDesc) -{ - ULONG Channel; - - ASSERT(IoDesc->Type == CmDesc->Type); - ASSERT(IoDesc->Type == CmResourceTypeDma); - - for (Channel = IoDesc->u.Dma.MinimumChannel; - Channel < IoDesc->u.Dma.MaximumChannel; - Channel++) - { - CmDesc->u.Dma.Channel = Channel; - CmDesc->u.Dma.Port = 0; - - if (!IopCheckDescriptorForConflict(CmDesc, NULL)) - return TRUE; - } - - return FALSE; -} - -BOOLEAN -IopFindInterruptResource( - IN PIO_RESOURCE_DESCRIPTOR IoDesc, - OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDesc) -{ - ULONG Vector; - - ASSERT(IoDesc->Type == CmDesc->Type); - ASSERT(IoDesc->Type == CmResourceTypeInterrupt); - - for (Vector = IoDesc->u.Interrupt.MinimumVector; - Vector < IoDesc->u.Interrupt.MaximumVector; - Vector++) - { - CmDesc->u.Interrupt.Vector = Vector; - CmDesc->u.Interrupt.Level = Vector; - CmDesc->u.Interrupt.Affinity = (KAFFINITY)-1; - - if (!IopCheckDescriptorForConflict(CmDesc, NULL)) - return TRUE; - } - - return FALSE; -} - -NTSTATUS -IopCreateResourceListFromRequirements( - IN PIO_RESOURCE_REQUIREMENTS_LIST RequirementsList, - OUT PCM_RESOURCE_LIST *ResourceList) -{ - ULONG i, ii, Size; - PCM_PARTIAL_RESOURCE_DESCRIPTOR ResDesc; - - Size = FIELD_OFFSET(CM_RESOURCE_LIST, List); - for (i = 0; i < RequirementsList->AlternativeLists; i++) - { - PIO_RESOURCE_LIST ResList = &RequirementsList->List[i]; - Size += FIELD_OFFSET(CM_FULL_RESOURCE_DESCRIPTOR, PartialResourceList.PartialDescriptors) - + ResList->Count * sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR); - } - - *ResourceList = ExAllocatePool(PagedPool, Size); - if (!*ResourceList) - return STATUS_INSUFFICIENT_RESOURCES; - - (*ResourceList)->Count = 1; - (*ResourceList)->List[0].BusNumber = RequirementsList->BusNumber; - (*ResourceList)->List[0].InterfaceType = RequirementsList->InterfaceType; - (*ResourceList)->List[0].PartialResourceList.Version = 1; - (*ResourceList)->List[0].PartialResourceList.Revision = 1; - (*ResourceList)->List[0].PartialResourceList.Count = 0; - - ResDesc = &(*ResourceList)->List[0].PartialResourceList.PartialDescriptors[0]; - - for (i = 0; i < RequirementsList->AlternativeLists; i++) - { - PIO_RESOURCE_LIST ResList = &RequirementsList->List[i]; - for (ii = 0; ii < ResList->Count; ii++) - { - PIO_RESOURCE_DESCRIPTOR ReqDesc = &ResList->Descriptors[ii]; - - /* FIXME: Handle alternate ranges */ - if (ReqDesc->Option == IO_RESOURCE_ALTERNATIVE) - continue; - - ResDesc->Type = ReqDesc->Type; - ResDesc->Flags = ReqDesc->Flags; - ResDesc->ShareDisposition = ReqDesc->ShareDisposition; - - switch (ReqDesc->Type) - { - case CmResourceTypeInterrupt: - if (!IopFindInterruptResource(ReqDesc, ResDesc)) - { - DPRINT1("Failed to find an available interrupt resource (0x%x to 0x%x)\n", - ReqDesc->u.Interrupt.MinimumVector, ReqDesc->u.Interrupt.MaximumVector); - - if (ReqDesc->Option == 0) - { - ExFreePool(*ResourceList); - return STATUS_CONFLICTING_ADDRESSES; - } - } - break; - - case CmResourceTypePort: - if (!IopFindPortResource(ReqDesc, ResDesc)) - { - DPRINT1("Failed to find an available port resource (0x%x to 0x%x length: 0x%x)\n", - ReqDesc->u.Port.MinimumAddress.QuadPart, ReqDesc->u.Port.MaximumAddress.QuadPart, - ReqDesc->u.Port.Length); - - if (ReqDesc->Option == 0) - { - ExFreePool(*ResourceList); - return STATUS_CONFLICTING_ADDRESSES; - } - } - break; - - case CmResourceTypeMemory: - if (!IopFindMemoryResource(ReqDesc, ResDesc)) - { - DPRINT1("Failed to find an available memory resource (0x%x to 0x%x length: 0x%x)\n", - ReqDesc->u.Memory.MinimumAddress.QuadPart, ReqDesc->u.Memory.MaximumAddress.QuadPart, - ReqDesc->u.Memory.Length); - - if (ReqDesc->Option == 0) - { - ExFreePool(*ResourceList); - return STATUS_CONFLICTING_ADDRESSES; - } - } - break; - - case CmResourceTypeBusNumber: - if (!IopFindBusNumberResource(ReqDesc, ResDesc)) - { - DPRINT1("Failed to find an available bus number resource (0x%x to 0x%x length: 0x%x)\n", - ReqDesc->u.BusNumber.MinBusNumber, ReqDesc->u.BusNumber.MaxBusNumber, - ReqDesc->u.BusNumber.Length); - - if (ReqDesc->Option == 0) - { - ExFreePool(*ResourceList); - return STATUS_CONFLICTING_ADDRESSES; - } - } - break; - - case CmResourceTypeDma: - if (!IopFindDmaResource(ReqDesc, ResDesc)) - { - DPRINT1("Failed to find an available dma resource (0x%x to 0x%x)\n", - ReqDesc->u.Dma.MinimumChannel, ReqDesc->u.Dma.MaximumChannel); - - if (ReqDesc->Option == 0) - { - ExFreePool(*ResourceList); - return STATUS_CONFLICTING_ADDRESSES; - } - } - break; - - default: - DPRINT1("Unsupported resource type: %x\n", ReqDesc->Type); - break; - } - - (*ResourceList)->List[0].PartialResourceList.Count++; - ResDesc++; - } - } - - return STATUS_SUCCESS; -} - -NTSTATUS -IopAssignDeviceResources( - IN PDEVICE_NODE DeviceNode, - OUT ULONG *pRequiredSize) -{ - PCM_PARTIAL_RESOURCE_LIST pPartialResourceList; - ULONG Size; - ULONG i; - ULONG j; - NTSTATUS Status; - - if (!DeviceNode->BootResources && !DeviceNode->ResourceRequirements) - { - /* No resource needed for this device */ - DeviceNode->ResourceList = NULL; - *pRequiredSize = 0; - return STATUS_SUCCESS; - } - - /* Fill DeviceNode->ResourceList - * FIXME: the PnP arbiter should go there! - * Actually, use the BootResources if provided, else the resource requirements - */ - - if (DeviceNode->BootResources) - { - /* Browse the boot resources to know if we have some custom structures */ - Size = FIELD_OFFSET(CM_RESOURCE_LIST, List); - for (i = 0; i < DeviceNode->BootResources->Count; i++) - { - pPartialResourceList = &DeviceNode->BootResources->List[i].PartialResourceList; - Size += FIELD_OFFSET(CM_FULL_RESOURCE_DESCRIPTOR, PartialResourceList.PartialDescriptors) + - pPartialResourceList->Count * sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR); - for (j = 0; j < pPartialResourceList->Count; j++) - { - if (pPartialResourceList->PartialDescriptors[j].Type == CmResourceTypeDeviceSpecific) - Size += pPartialResourceList->PartialDescriptors[j].u.DeviceSpecificData.DataSize; - } - } - - DeviceNode->ResourceList = ExAllocatePool(PagedPool, Size); - if (!DeviceNode->ResourceList) - { - Status = STATUS_NO_MEMORY; - goto ByeBye; - } - RtlCopyMemory(DeviceNode->ResourceList, DeviceNode->BootResources, Size); - - Status = IopDetectResourceConflict(DeviceNode->ResourceList, FALSE, NULL); - if (NT_SUCCESS(Status) || !DeviceNode->ResourceRequirements) - { - if (!NT_SUCCESS(Status) && !DeviceNode->ResourceRequirements) - { - DPRINT1("Using conflicting boot resources because no requirements were supplied!\n"); - } - - *pRequiredSize = Size; - return STATUS_SUCCESS; - } - else - { - DPRINT1("Boot resources for %wZ cause a resource conflict!\n", &DeviceNode->InstancePath); - ExFreePool(DeviceNode->ResourceList); - } - } - - Status = IopCreateResourceListFromRequirements(DeviceNode->ResourceRequirements, - &DeviceNode->ResourceList); - if (!NT_SUCCESS(Status)) - goto ByeBye; - - Size = FIELD_OFFSET(CM_RESOURCE_LIST, List); - for (i = 0; i < DeviceNode->ResourceList->Count; i++) - { - pPartialResourceList = &DeviceNode->ResourceList->List[i].PartialResourceList; - Size += FIELD_OFFSET(CM_FULL_RESOURCE_DESCRIPTOR, PartialResourceList.PartialDescriptors) + - pPartialResourceList->Count * sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR); - } - - Status = IopDetectResourceConflict(DeviceNode->ResourceList, FALSE, NULL); - if (!NT_SUCCESS(Status)) - goto ByeBye; - - *pRequiredSize = Size; - return STATUS_SUCCESS; - -ByeBye: - if (DeviceNode->ResourceList) - { - ExFreePool(DeviceNode->ResourceList); - DeviceNode->ResourceList = NULL; - } - *pRequiredSize = 0; - return Status; -} - - -NTSTATUS -IopTranslateDeviceResources( - IN PDEVICE_NODE DeviceNode, - IN ULONG RequiredSize) -{ - PCM_PARTIAL_RESOURCE_LIST pPartialResourceList; - PCM_PARTIAL_RESOURCE_DESCRIPTOR DescriptorRaw, DescriptorTranslated; - ULONG i, j; - NTSTATUS Status; - - if (!DeviceNode->ResourceList) - { - DeviceNode->ResourceListTranslated = NULL; - return STATUS_SUCCESS; - } - - /* That's easy to translate a resource list. Just copy the - * untranslated one and change few fields in the copy - */ - DeviceNode->ResourceListTranslated = ExAllocatePool(PagedPool, RequiredSize); - if (!DeviceNode->ResourceListTranslated) - { - Status =STATUS_NO_MEMORY; - goto cleanup; - } - RtlCopyMemory(DeviceNode->ResourceListTranslated, DeviceNode->ResourceList, RequiredSize); - - for (i = 0; i < DeviceNode->ResourceList->Count; i++) - { - pPartialResourceList = &DeviceNode->ResourceList->List[i].PartialResourceList; - for (j = 0; j < pPartialResourceList->Count; j++) - { - DescriptorRaw = &pPartialResourceList->PartialDescriptors[j]; - DescriptorTranslated = &DeviceNode->ResourceListTranslated->List[i].PartialResourceList.PartialDescriptors[j]; - switch (DescriptorRaw->Type) - { - case CmResourceTypePort: - { - ULONG AddressSpace = 1; /* IO space */ - if (!HalTranslateBusAddress( - DeviceNode->ResourceList->List[i].InterfaceType, - DeviceNode->ResourceList->List[i].BusNumber, - DescriptorRaw->u.Port.Start, - &AddressSpace, - &DescriptorTranslated->u.Port.Start)) - { - Status = STATUS_UNSUCCESSFUL; - goto cleanup; - } - break; - } - case CmResourceTypeInterrupt: - { - DescriptorTranslated->u.Interrupt.Vector = HalGetInterruptVector( - DeviceNode->ResourceList->List[i].InterfaceType, - DeviceNode->ResourceList->List[i].BusNumber, - DescriptorRaw->u.Interrupt.Level, - DescriptorRaw->u.Interrupt.Vector, - (PKIRQL)&DescriptorTranslated->u.Interrupt.Level, - &DescriptorRaw->u.Interrupt.Affinity); - break; - } - case CmResourceTypeMemory: - { - ULONG AddressSpace = 0; /* Memory space */ - if (!HalTranslateBusAddress( - DeviceNode->ResourceList->List[i].InterfaceType, - DeviceNode->ResourceList->List[i].BusNumber, - DescriptorRaw->u.Memory.Start, - &AddressSpace, - &DescriptorTranslated->u.Memory.Start)) - { - Status = STATUS_UNSUCCESSFUL; - goto cleanup; - } - } - - case CmResourceTypeDma: - case CmResourceTypeBusNumber: - case CmResourceTypeDeviceSpecific: - /* Nothing to do */ - break; - default: - DPRINT1("Unknown resource descriptor type 0x%x\n", DescriptorRaw->Type); - Status = STATUS_NOT_IMPLEMENTED; - goto cleanup; - } - } - } - return STATUS_SUCCESS; - -cleanup: - /* Yes! Also delete ResourceList because ResourceList and - * ResourceListTranslated should be a pair! */ - ExFreePool(DeviceNode->ResourceList); - DeviceNode->ResourceList = NULL; - if (DeviceNode->ResourceListTranslated) - { - ExFreePool(DeviceNode->ResourceListTranslated); - DeviceNode->ResourceList = NULL; - } - return Status; -} - - /* * IopGetParentIdPrefix * @@ -2608,10 +1520,6 @@ IopActionInterrogateDeviceStack(PDEVICE_NODE DeviceNode, { DeviceNode->ResourceRequirements = (PIO_RESOURCE_REQUIREMENTS_LIST)IoStatusBlock.Information; - if (IoStatusBlock.Information) - IopDeviceNodeSetFlag(DeviceNode, DNF_RESOURCE_REPORTED); - else - IopDeviceNodeSetFlag(DeviceNode, DNF_NO_RESOURCE_REQUIRED); } else { @@ -2619,7 +1527,6 @@ IopActionInterrogateDeviceStack(PDEVICE_NODE DeviceNode, DeviceNode->ResourceRequirements = NULL; } - if (InstanceKey != NULL) { IopSetDeviceInstanceData(InstanceKey, DeviceNode); @@ -4285,7 +3192,7 @@ IoGetDeviceProperty(IN PDEVICE_OBJECT DeviceObject, Length = 0; if (DeviceNode->BootResources->Count != 0) { - Length = CM_RESOURCE_LIST_SIZE(DeviceNode->BootResources); + Length = IopCalculateResourceListSize(DeviceNode->BootResources); } Data = DeviceNode->BootResources; break; @@ -4295,7 +3202,7 @@ IoGetDeviceProperty(IN PDEVICE_OBJECT DeviceObject, Length = 0; if (DeviceNode->BootResources->Count != 0) { - Length = CM_RESOURCE_LIST_SIZE(DeviceNode->BootResources); + Length = IopCalculateResourceListSize(DeviceNode->BootResources); } Data = DeviceNode->BootResources; break; diff --git a/reactos/ntoskrnl/io/pnpmgr/pnpreport.c b/reactos/ntoskrnl/io/pnpmgr/pnpreport.c index 4995b16fd65..f69bce02721 100644 --- a/reactos/ntoskrnl/io/pnpmgr/pnpreport.c +++ b/reactos/ntoskrnl/io/pnpmgr/pnpreport.c @@ -18,28 +18,14 @@ IopCreateDeviceKeyPath(IN PCUNICODE_STRING RegistryPath, IN ULONG CreateOptions, OUT PHANDLE Handle); -NTSTATUS -IopAssignDeviceResources( - IN PDEVICE_NODE DeviceNode, - OUT ULONG *pRequiredSize); - NTSTATUS IopSetDeviceInstanceData(HANDLE InstanceKey, PDEVICE_NODE DeviceNode); -NTSTATUS -IopTranslateDeviceResources( - IN PDEVICE_NODE DeviceNode, - IN ULONG RequiredSize); - NTSTATUS IopActionInterrogateDeviceStack(PDEVICE_NODE DeviceNode, PVOID Context); -NTSTATUS -IopUpdateResourceMapForPnPDevice( - IN PDEVICE_NODE DeviceNode); - NTSTATUS IopDetectResourceConflict( IN PCM_RESOURCE_LIST ResourceList); @@ -189,6 +175,11 @@ IoReportDetectedDevice(IN PDRIVER_OBJECT DriverObject, /* We don't send IRP_MN_START_DEVICE */ IopDeviceNodeSetFlag(DeviceNode, DNF_STARTED); + /* We need to get device IDs */ +#if 0 + IopDeviceNodeSetFlag(DeviceNode, DNF_NEED_QUERY_IDS); +#endif + /* This is a legacy driver for this device */ IopDeviceNodeSetFlag(DeviceNode, DNF_LEGACY_DRIVER); @@ -258,9 +249,7 @@ IoReportDetectedDevice(IN PDRIVER_OBJECT DriverObject, if (DeviceNode->BootResources) IopDeviceNodeSetFlag(DeviceNode, DNF_HAS_BOOT_CONFIG); - if (DeviceNode->ResourceRequirements) - IopDeviceNodeSetFlag(DeviceNode, DNF_RESOURCE_REPORTED); - else + if (!DeviceNode->ResourceRequirements && !DeviceNode->BootResources) IopDeviceNodeSetFlag(DeviceNode, DNF_NO_RESOURCE_REQUIRED); /* Write the resource information to the registry */ @@ -269,27 +258,7 @@ IoReportDetectedDevice(IN PDRIVER_OBJECT DriverObject, /* If the caller didn't get the resources assigned for us, do it now */ if (!ResourceAssigned) { - IopDeviceNodeSetFlag(DeviceNode, DNF_ASSIGNING_RESOURCES); - Status = IopAssignDeviceResources(DeviceNode, &RequiredLength); - if (NT_SUCCESS(Status)) - { - Status = IopTranslateDeviceResources(DeviceNode, RequiredLength); - if (NT_SUCCESS(Status)) - { - Status = IopUpdateResourceMapForPnPDevice(DeviceNode); - if (NT_SUCCESS(Status) && DeviceNode->ResourceList) - { - RtlInitUnicodeString(&ValueName, L"AllocConfig"); - Status = ZwSetValueKey(InstanceKey, - &ValueName, - 0, - REG_RESOURCE_LIST, - DeviceNode->ResourceList, - CM_RESOURCE_LIST_SIZE(DeviceNode->ResourceList)); - } - } - } - IopDeviceNodeClearFlag(DeviceNode, DNF_ASSIGNING_RESOURCES); + Status = IopAssignDeviceResources(DeviceNode); /* See if we failed */ if (!NT_SUCCESS(Status)) diff --git a/reactos/ntoskrnl/io/pnpmgr/pnpres.c b/reactos/ntoskrnl/io/pnpmgr/pnpres.c new file mode 100644 index 00000000000..32a746ee26f --- /dev/null +++ b/reactos/ntoskrnl/io/pnpmgr/pnpres.c @@ -0,0 +1,1158 @@ +/* + * PROJECT: ReactOS Kernel + * COPYRIGHT: GPL - See COPYING in the top level directory + * FILE: ntoskrnl/io/pnpmgr/pnpres.c + * PURPOSE: Resource handling code + * PROGRAMMERS: Cameron Gutman (cameron.gutman@reactos.org) + * ReactOS Portable Systems Group + */ + +#include + +#define NDEBUG +#include + +NTSTATUS +IopDetectResourceConflict( + IN PCM_RESOURCE_LIST ResourceList, + IN BOOLEAN Silent, + OUT OPTIONAL PCM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDescriptor); + +ULONG +NTAPI +IopCalculateResourceListSize( + IN PCM_RESOURCE_LIST ResourceList) +{ + ULONG Size, i, j; + PCM_PARTIAL_RESOURCE_LIST pPartialResourceList; + + Size = FIELD_OFFSET(CM_RESOURCE_LIST, List); + for (i = 0; i < ResourceList->Count; i++) + { + pPartialResourceList = &ResourceList->List[i].PartialResourceList; + Size += FIELD_OFFSET(CM_FULL_RESOURCE_DESCRIPTOR, PartialResourceList.PartialDescriptors) + + pPartialResourceList->Count * sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR); + for (j = 0; j < pPartialResourceList->Count; j++) + { + if (pPartialResourceList->PartialDescriptors[j].Type == CmResourceTypeDeviceSpecific) + Size += pPartialResourceList->PartialDescriptors[j].u.DeviceSpecificData.DataSize; + } + } + + return Size; +} + +static +BOOLEAN +IopCheckDescriptorForConflict(PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDesc, OPTIONAL PCM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDescriptor) +{ + CM_RESOURCE_LIST CmList; + NTSTATUS Status; + + CmList.Count = 1; + CmList.List[0].InterfaceType = InterfaceTypeUndefined; + CmList.List[0].BusNumber = 0; + CmList.List[0].PartialResourceList.Version = 1; + CmList.List[0].PartialResourceList.Revision = 1; + CmList.List[0].PartialResourceList.Count = 1; + CmList.List[0].PartialResourceList.PartialDescriptors[0] = *CmDesc; + + Status = IopDetectResourceConflict(&CmList, TRUE, ConflictingDescriptor); + if (Status == STATUS_CONFLICTING_ADDRESSES) + return TRUE; + + return FALSE; +} + +static +BOOLEAN +IopFindBusNumberResource( + IN PIO_RESOURCE_DESCRIPTOR IoDesc, + OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDesc) +{ + ULONG Start; + CM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDesc; + + ASSERT(IoDesc->Type == CmDesc->Type); + ASSERT(IoDesc->Type == CmResourceTypeBusNumber); + + for (Start = IoDesc->u.BusNumber.MinBusNumber; + Start < IoDesc->u.BusNumber.MaxBusNumber; + Start++) + { + CmDesc->u.BusNumber.Length = IoDesc->u.BusNumber.Length; + CmDesc->u.BusNumber.Start = Start; + + if (IopCheckDescriptorForConflict(CmDesc, &ConflictingDesc)) + { + Start += ConflictingDesc.u.BusNumber.Start + ConflictingDesc.u.BusNumber.Length; + } + else + { + return TRUE; + } + } + + return FALSE; +} + +static +BOOLEAN +IopFindMemoryResource( + IN PIO_RESOURCE_DESCRIPTOR IoDesc, + OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDesc) +{ + ULONGLONG Start; + CM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDesc; + + ASSERT(IoDesc->Type == CmDesc->Type); + ASSERT(IoDesc->Type == CmResourceTypeMemory); + + for (Start = IoDesc->u.Memory.MinimumAddress.QuadPart; + Start < IoDesc->u.Memory.MaximumAddress.QuadPart; + Start++) + { + CmDesc->u.Memory.Length = IoDesc->u.Memory.Length; + CmDesc->u.Memory.Start.QuadPart = Start; + + if (IopCheckDescriptorForConflict(CmDesc, &ConflictingDesc)) + { + Start += ConflictingDesc.u.Memory.Start.QuadPart + ConflictingDesc.u.Memory.Length; + } + else + { + return TRUE; + } + } + + return FALSE; +} + +static +BOOLEAN +IopFindPortResource( + IN PIO_RESOURCE_DESCRIPTOR IoDesc, + OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDesc) +{ + ULONGLONG Start; + CM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDesc; + + ASSERT(IoDesc->Type == CmDesc->Type); + ASSERT(IoDesc->Type == CmResourceTypePort); + + for (Start = IoDesc->u.Port.MinimumAddress.QuadPart; + Start < IoDesc->u.Port.MaximumAddress.QuadPart; + Start++) + { + CmDesc->u.Port.Length = IoDesc->u.Port.Length; + CmDesc->u.Port.Start.QuadPart = Start; + + if (IopCheckDescriptorForConflict(CmDesc, &ConflictingDesc)) + { + Start += ConflictingDesc.u.Port.Start.QuadPart + ConflictingDesc.u.Port.Length; + } + else + { + return TRUE; + } + } + + return FALSE; +} + +static +BOOLEAN +IopFindDmaResource( + IN PIO_RESOURCE_DESCRIPTOR IoDesc, + OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDesc) +{ + ULONG Channel; + + ASSERT(IoDesc->Type == CmDesc->Type); + ASSERT(IoDesc->Type == CmResourceTypeDma); + + for (Channel = IoDesc->u.Dma.MinimumChannel; + Channel < IoDesc->u.Dma.MaximumChannel; + Channel++) + { + CmDesc->u.Dma.Channel = Channel; + CmDesc->u.Dma.Port = 0; + + if (!IopCheckDescriptorForConflict(CmDesc, NULL)) + return TRUE; + } + + return FALSE; +} + +static +BOOLEAN +IopFindInterruptResource( + IN PIO_RESOURCE_DESCRIPTOR IoDesc, + OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDesc) +{ + ULONG Vector; + + ASSERT(IoDesc->Type == CmDesc->Type); + ASSERT(IoDesc->Type == CmResourceTypeInterrupt); + + for (Vector = IoDesc->u.Interrupt.MinimumVector; + Vector < IoDesc->u.Interrupt.MaximumVector; + Vector++) + { + CmDesc->u.Interrupt.Vector = Vector; + CmDesc->u.Interrupt.Level = Vector; + CmDesc->u.Interrupt.Affinity = (KAFFINITY)-1; + + if (!IopCheckDescriptorForConflict(CmDesc, NULL)) + return TRUE; + } + + return FALSE; +} + +static +NTSTATUS +IopCreateResourceListFromRequirements( + IN PIO_RESOURCE_REQUIREMENTS_LIST RequirementsList, + OUT PCM_RESOURCE_LIST *ResourceList) +{ + ULONG i, ii, Size; + PCM_PARTIAL_RESOURCE_DESCRIPTOR ResDesc; + + Size = FIELD_OFFSET(CM_RESOURCE_LIST, List); + for (i = 0; i < RequirementsList->AlternativeLists; i++) + { + PIO_RESOURCE_LIST ResList = &RequirementsList->List[i]; + Size += FIELD_OFFSET(CM_FULL_RESOURCE_DESCRIPTOR, PartialResourceList.PartialDescriptors) + + ResList->Count * sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR); + } + + *ResourceList = ExAllocatePool(PagedPool, Size); + if (!*ResourceList) + return STATUS_INSUFFICIENT_RESOURCES; + + (*ResourceList)->Count = 1; + (*ResourceList)->List[0].BusNumber = RequirementsList->BusNumber; + (*ResourceList)->List[0].InterfaceType = RequirementsList->InterfaceType; + (*ResourceList)->List[0].PartialResourceList.Version = 1; + (*ResourceList)->List[0].PartialResourceList.Revision = 1; + (*ResourceList)->List[0].PartialResourceList.Count = 0; + + ResDesc = &(*ResourceList)->List[0].PartialResourceList.PartialDescriptors[0]; + + for (i = 0; i < RequirementsList->AlternativeLists; i++) + { + PIO_RESOURCE_LIST ResList = &RequirementsList->List[i]; + for (ii = 0; ii < ResList->Count; ii++) + { + PIO_RESOURCE_DESCRIPTOR ReqDesc = &ResList->Descriptors[ii]; + + /* FIXME: Handle alternate ranges */ + if (ReqDesc->Option == IO_RESOURCE_ALTERNATIVE) + continue; + + ResDesc->Type = ReqDesc->Type; + ResDesc->Flags = ReqDesc->Flags; + ResDesc->ShareDisposition = ReqDesc->ShareDisposition; + + switch (ReqDesc->Type) + { + case CmResourceTypeInterrupt: + if (!IopFindInterruptResource(ReqDesc, ResDesc)) + { + DPRINT1("Failed to find an available interrupt resource (0x%x to 0x%x)\n", + ReqDesc->u.Interrupt.MinimumVector, ReqDesc->u.Interrupt.MaximumVector); + + if (ReqDesc->Option == 0) + { + ExFreePool(*ResourceList); + return STATUS_CONFLICTING_ADDRESSES; + } + } + break; + + case CmResourceTypePort: + if (!IopFindPortResource(ReqDesc, ResDesc)) + { + DPRINT1("Failed to find an available port resource (0x%x to 0x%x length: 0x%x)\n", + ReqDesc->u.Port.MinimumAddress.QuadPart, ReqDesc->u.Port.MaximumAddress.QuadPart, + ReqDesc->u.Port.Length); + + if (ReqDesc->Option == 0) + { + ExFreePool(*ResourceList); + return STATUS_CONFLICTING_ADDRESSES; + } + } + break; + + case CmResourceTypeMemory: + if (!IopFindMemoryResource(ReqDesc, ResDesc)) + { + DPRINT1("Failed to find an available memory resource (0x%x to 0x%x length: 0x%x)\n", + ReqDesc->u.Memory.MinimumAddress.QuadPart, ReqDesc->u.Memory.MaximumAddress.QuadPart, + ReqDesc->u.Memory.Length); + + if (ReqDesc->Option == 0) + { + ExFreePool(*ResourceList); + return STATUS_CONFLICTING_ADDRESSES; + } + } + break; + + case CmResourceTypeBusNumber: + if (!IopFindBusNumberResource(ReqDesc, ResDesc)) + { + DPRINT1("Failed to find an available bus number resource (0x%x to 0x%x length: 0x%x)\n", + ReqDesc->u.BusNumber.MinBusNumber, ReqDesc->u.BusNumber.MaxBusNumber, + ReqDesc->u.BusNumber.Length); + + if (ReqDesc->Option == 0) + { + ExFreePool(*ResourceList); + return STATUS_CONFLICTING_ADDRESSES; + } + } + break; + + case CmResourceTypeDma: + if (!IopFindDmaResource(ReqDesc, ResDesc)) + { + DPRINT1("Failed to find an available dma resource (0x%x to 0x%x)\n", + ReqDesc->u.Dma.MinimumChannel, ReqDesc->u.Dma.MaximumChannel); + + if (ReqDesc->Option == 0) + { + ExFreePool(*ResourceList); + return STATUS_CONFLICTING_ADDRESSES; + } + } + break; + + default: + DPRINT1("Unsupported resource type: %x\n", ReqDesc->Type); + break; + } + + (*ResourceList)->List[0].PartialResourceList.Count++; + ResDesc++; + } + } + + return STATUS_SUCCESS; +} + +static +BOOLEAN +IopCheckResourceDescriptor( + IN PCM_PARTIAL_RESOURCE_DESCRIPTOR ResDesc, + IN PCM_RESOURCE_LIST ResourceList, + IN BOOLEAN Silent, + OUT OPTIONAL PCM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDescriptor) +{ + ULONG i, ii; + BOOLEAN Result = FALSE; + + if (ResDesc->ShareDisposition == CmResourceShareShared) + return FALSE; + + for (i = 0; i < ResourceList->Count; i++) + { + PCM_PARTIAL_RESOURCE_LIST ResList = &ResourceList->List[i].PartialResourceList; + for (ii = 0; ii < ResList->Count; ii++) + { + PCM_PARTIAL_RESOURCE_DESCRIPTOR ResDesc2 = &ResList->PartialDescriptors[ii]; + + /* We don't care about shared resources */ + if (ResDesc->ShareDisposition == CmResourceShareShared && + ResDesc2->ShareDisposition == CmResourceShareShared) + continue; + + /* Make sure we're comparing the same types */ + if (ResDesc->Type != ResDesc2->Type) + continue; + + switch (ResDesc->Type) + { + case CmResourceTypeMemory: + if ((ResDesc->u.Memory.Start.QuadPart < ResDesc2->u.Memory.Start.QuadPart && + ResDesc->u.Memory.Start.QuadPart + ResDesc->u.Memory.Length > + ResDesc2->u.Memory.Start.QuadPart) || (ResDesc2->u.Memory.Start.QuadPart < + ResDesc->u.Memory.Start.QuadPart && ResDesc2->u.Memory.Start.QuadPart + + ResDesc2->u.Memory.Length > ResDesc->u.Memory.Start.QuadPart)) + { + if (!Silent) + { + DPRINT1("Resource conflict: Memory (0x%x to 0x%x vs. 0x%x to 0x%x)\n", + ResDesc->u.Memory.Start.QuadPart, ResDesc->u.Memory.Start.QuadPart + + ResDesc->u.Memory.Length, ResDesc2->u.Memory.Start.QuadPart, + ResDesc2->u.Memory.Start.QuadPart + ResDesc2->u.Memory.Length); + } + + Result = TRUE; + + goto ByeBye; + } + break; + + case CmResourceTypePort: + if ((ResDesc->u.Port.Start.QuadPart < ResDesc2->u.Port.Start.QuadPart && + ResDesc->u.Port.Start.QuadPart + ResDesc->u.Port.Length > + ResDesc2->u.Port.Start.QuadPart) || (ResDesc2->u.Port.Start.QuadPart < + ResDesc->u.Port.Start.QuadPart && ResDesc2->u.Port.Start.QuadPart + + ResDesc2->u.Port.Length > ResDesc->u.Port.Start.QuadPart)) + { + if (!Silent) + { + DPRINT1("Resource conflict: Port (0x%x to 0x%x vs. 0x%x to 0x%x)\n", + ResDesc->u.Port.Start.QuadPart, ResDesc->u.Port.Start.QuadPart + + ResDesc->u.Port.Length, ResDesc2->u.Port.Start.QuadPart, + ResDesc2->u.Port.Start.QuadPart + ResDesc2->u.Port.Length); + } + + Result = TRUE; + + goto ByeBye; + } + break; + + case CmResourceTypeInterrupt: + if (ResDesc->u.Interrupt.Vector == ResDesc2->u.Interrupt.Vector) + { + if (!Silent) + { + DPRINT1("Resource conflict: IRQ (0x%x 0x%x vs. 0x%x 0x%x)\n", + ResDesc->u.Interrupt.Vector, ResDesc->u.Interrupt.Level, + ResDesc2->u.Interrupt.Vector, ResDesc2->u.Interrupt.Level); + } + + Result = TRUE; + + goto ByeBye; + } + break; + + case CmResourceTypeBusNumber: + if ((ResDesc->u.BusNumber.Start < ResDesc2->u.BusNumber.Start && + ResDesc->u.BusNumber.Start + ResDesc->u.BusNumber.Length > + ResDesc2->u.BusNumber.Start) || (ResDesc2->u.BusNumber.Start < + ResDesc->u.BusNumber.Start && ResDesc2->u.BusNumber.Start + + ResDesc2->u.BusNumber.Length > ResDesc->u.BusNumber.Start)) + { + if (!Silent) + { + DPRINT1("Resource conflict: Bus number (0x%x to 0x%x vs. 0x%x to 0x%x)\n", + ResDesc->u.BusNumber.Start, ResDesc->u.BusNumber.Start + + ResDesc->u.BusNumber.Length, ResDesc2->u.BusNumber.Start, + ResDesc2->u.BusNumber.Start + ResDesc2->u.BusNumber.Length); + } + + Result = TRUE; + + goto ByeBye; + } + break; + + case CmResourceTypeDma: + if (ResDesc->u.Dma.Channel == ResDesc2->u.Dma.Channel) + { + if (!Silent) + { + DPRINT1("Resource conflict: Dma (0x%x 0x%x vs. 0x%x 0x%x)\n", + ResDesc->u.Dma.Channel, ResDesc->u.Dma.Port, + ResDesc2->u.Dma.Channel, ResDesc2->u.Dma.Port); + } + + Result = TRUE; + + goto ByeBye; + } + break; + } + } + } + +ByeBye: + + if (Result && ConflictingDescriptor) + { + RtlCopyMemory(ConflictingDescriptor, + ResDesc, + sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR)); + } + + return Result; +} + +static +NTSTATUS +IopUpdateControlKeyWithResources(IN PDEVICE_NODE DeviceNode) +{ + UNICODE_STRING EnumRoot = RTL_CONSTANT_STRING(ENUM_ROOT); + UNICODE_STRING Control = RTL_CONSTANT_STRING(L"Control"); + UNICODE_STRING ValueName = RTL_CONSTANT_STRING(L"AllocConfig"); + HANDLE EnumKey, InstanceKey, ControlKey; + NTSTATUS Status; + OBJECT_ATTRIBUTES ObjectAttributes; + + /* Open the Enum key */ + Status = IopOpenRegistryKeyEx(&EnumKey, NULL, &EnumRoot, KEY_ENUMERATE_SUB_KEYS); + if (!NT_SUCCESS(Status)) + return Status; + + /* Open the instance key (eg. Root\PNP0A03) */ + Status = IopOpenRegistryKeyEx(&InstanceKey, EnumKey, &DeviceNode->InstancePath, KEY_ENUMERATE_SUB_KEYS); + ZwClose(EnumKey); + + if (!NT_SUCCESS(Status)) + return Status; + + /* Create/Open the Control key */ + InitializeObjectAttributes(&ObjectAttributes, + &Control, + OBJ_CASE_INSENSITIVE, + InstanceKey, + NULL); + Status = ZwCreateKey(&ControlKey, + KEY_SET_VALUE, + &ObjectAttributes, + 0, + NULL, + REG_OPTION_VOLATILE, + NULL); + ZwClose(InstanceKey); + + if (!NT_SUCCESS(Status)) + return Status; + + /* Write the resource list */ + Status = ZwSetValueKey(ControlKey, + &ValueName, + 0, + REG_RESOURCE_LIST, + DeviceNode->ResourceList, + IopCalculateResourceListSize(DeviceNode->ResourceList)); + ZwClose(ControlKey); + + if (!NT_SUCCESS(Status)) + return Status; + + return STATUS_SUCCESS; +} + +static +NTSTATUS +IopFilterResourceRequirements(IN PDEVICE_NODE DeviceNode) +{ + IO_STACK_LOCATION Stack; + IO_STATUS_BLOCK IoStatusBlock; + NTSTATUS Status; + + DPRINT("Sending IRP_MN_FILTER_RESOURCE_REQUIREMENTS to device stack\n"); + + Stack.Parameters.FilterResourceRequirements.IoResourceRequirementList = DeviceNode->ResourceRequirements; + Status = IopInitiatePnpIrp( + DeviceNode->PhysicalDeviceObject, + &IoStatusBlock, + IRP_MN_FILTER_RESOURCE_REQUIREMENTS, + &Stack); + if (!NT_SUCCESS(Status) && Status != STATUS_NOT_SUPPORTED) + { + DPRINT("IopInitiatePnpIrp(IRP_MN_FILTER_RESOURCE_REQUIREMENTS) failed\n"); + return Status; + } + else if (NT_SUCCESS(Status)) + { + DeviceNode->ResourceRequirements = (PIO_RESOURCE_REQUIREMENTS_LIST)IoStatusBlock.Information; + } + + return STATUS_SUCCESS; +} + + +NTSTATUS +IopUpdateResourceMap(IN PDEVICE_NODE DeviceNode, PWCHAR Level1Key, PWCHAR Level2Key) +{ + NTSTATUS Status; + ULONG Disposition; + HANDLE PnpMgrLevel1, PnpMgrLevel2, ResourceMapKey; + UNICODE_STRING KeyName; + OBJECT_ATTRIBUTES ObjectAttributes; + + RtlInitUnicodeString(&KeyName, + L"\\Registry\\Machine\\HARDWARE\\RESOURCEMAP"); + InitializeObjectAttributes(&ObjectAttributes, + &KeyName, + OBJ_CASE_INSENSITIVE | OBJ_OPENIF, + 0, + NULL); + Status = ZwCreateKey(&ResourceMapKey, + KEY_ALL_ACCESS, + &ObjectAttributes, + 0, + NULL, + REG_OPTION_VOLATILE, + &Disposition); + if (!NT_SUCCESS(Status)) + return Status; + + RtlInitUnicodeString(&KeyName, Level1Key); + InitializeObjectAttributes(&ObjectAttributes, + &KeyName, + OBJ_CASE_INSENSITIVE | OBJ_OPENIF, + ResourceMapKey, + NULL); + Status = ZwCreateKey(&PnpMgrLevel1, + KEY_ALL_ACCESS, + &ObjectAttributes, + 0, + NULL, + REG_OPTION_VOLATILE, + &Disposition); + ZwClose(ResourceMapKey); + if (!NT_SUCCESS(Status)) + return Status; + + RtlInitUnicodeString(&KeyName, Level2Key); + InitializeObjectAttributes(&ObjectAttributes, + &KeyName, + OBJ_CASE_INSENSITIVE | OBJ_OPENIF, + PnpMgrLevel1, + NULL); + Status = ZwCreateKey(&PnpMgrLevel2, + KEY_ALL_ACCESS, + &ObjectAttributes, + 0, + NULL, + REG_OPTION_VOLATILE, + &Disposition); + ZwClose(PnpMgrLevel1); + if (!NT_SUCCESS(Status)) + return Status; + + if (DeviceNode->ResourceList) + { + WCHAR NameBuff[256]; + UNICODE_STRING NameU; + UNICODE_STRING Suffix; + ULONG OldLength; + + ASSERT(DeviceNode->ResourceListTranslated); + + NameU.Buffer = NameBuff; + NameU.Length = 0; + NameU.MaximumLength = 256 * sizeof(WCHAR); + + Status = IoGetDeviceProperty(DeviceNode->PhysicalDeviceObject, + DevicePropertyPhysicalDeviceObjectName, + NameU.MaximumLength, + NameU.Buffer, + &OldLength); + ASSERT(Status == STATUS_SUCCESS); + + NameU.Length = (USHORT)OldLength; + + RtlInitUnicodeString(&Suffix, L".Raw"); + RtlAppendUnicodeStringToString(&NameU, &Suffix); + + Status = ZwSetValueKey(PnpMgrLevel2, + &NameU, + 0, + REG_RESOURCE_LIST, + DeviceNode->ResourceList, + IopCalculateResourceListSize(DeviceNode->ResourceList)); + if (!NT_SUCCESS(Status)) + { + ZwClose(PnpMgrLevel2); + return Status; + } + + /* "Remove" the suffix by setting the length back to what it used to be */ + NameU.Length = (USHORT)OldLength; + + RtlInitUnicodeString(&Suffix, L".Translated"); + RtlAppendUnicodeStringToString(&NameU, &Suffix); + + Status = ZwSetValueKey(PnpMgrLevel2, + &NameU, + 0, + REG_RESOURCE_LIST, + DeviceNode->ResourceListTranslated, + IopCalculateResourceListSize(DeviceNode->ResourceListTranslated)); + ZwClose(PnpMgrLevel2); + if (!NT_SUCCESS(Status)) + return Status; + } + else + { + ZwClose(PnpMgrLevel2); + } + + return STATUS_SUCCESS; +} + +NTSTATUS +IopUpdateResourceMapForPnPDevice(IN PDEVICE_NODE DeviceNode) +{ + return IopUpdateResourceMap(DeviceNode, L"PnP Manager", L"PnpManager"); +} + +static +NTSTATUS +IopTranslateDeviceResources( + IN PDEVICE_NODE DeviceNode) +{ + PCM_PARTIAL_RESOURCE_LIST pPartialResourceList; + PCM_PARTIAL_RESOURCE_DESCRIPTOR DescriptorRaw, DescriptorTranslated; + ULONG i, j, ListSize; + NTSTATUS Status; + + if (!DeviceNode->ResourceList) + { + DeviceNode->ResourceListTranslated = NULL; + return STATUS_SUCCESS; + } + + /* That's easy to translate a resource list. Just copy the + * untranslated one and change few fields in the copy + */ + ListSize = IopCalculateResourceListSize(DeviceNode->ResourceList); + + DeviceNode->ResourceListTranslated = ExAllocatePool(PagedPool, ListSize); + if (!DeviceNode->ResourceListTranslated) + { + Status =STATUS_NO_MEMORY; + goto cleanup; + } + RtlCopyMemory(DeviceNode->ResourceListTranslated, DeviceNode->ResourceList, ListSize); + + for (i = 0; i < DeviceNode->ResourceList->Count; i++) + { + pPartialResourceList = &DeviceNode->ResourceList->List[i].PartialResourceList; + for (j = 0; j < pPartialResourceList->Count; j++) + { + DescriptorRaw = &pPartialResourceList->PartialDescriptors[j]; + DescriptorTranslated = &DeviceNode->ResourceListTranslated->List[i].PartialResourceList.PartialDescriptors[j]; + switch (DescriptorRaw->Type) + { + case CmResourceTypePort: + { + ULONG AddressSpace = 1; /* IO space */ + if (!HalTranslateBusAddress( + DeviceNode->ResourceList->List[i].InterfaceType, + DeviceNode->ResourceList->List[i].BusNumber, + DescriptorRaw->u.Port.Start, + &AddressSpace, + &DescriptorTranslated->u.Port.Start)) + { + Status = STATUS_UNSUCCESSFUL; + goto cleanup; + } + break; + } + case CmResourceTypeInterrupt: + { + DescriptorTranslated->u.Interrupt.Vector = HalGetInterruptVector( + DeviceNode->ResourceList->List[i].InterfaceType, + DeviceNode->ResourceList->List[i].BusNumber, + DescriptorRaw->u.Interrupt.Level, + DescriptorRaw->u.Interrupt.Vector, + (PKIRQL)&DescriptorTranslated->u.Interrupt.Level, + &DescriptorRaw->u.Interrupt.Affinity); + break; + } + case CmResourceTypeMemory: + { + ULONG AddressSpace = 0; /* Memory space */ + if (!HalTranslateBusAddress( + DeviceNode->ResourceList->List[i].InterfaceType, + DeviceNode->ResourceList->List[i].BusNumber, + DescriptorRaw->u.Memory.Start, + &AddressSpace, + &DescriptorTranslated->u.Memory.Start)) + { + Status = STATUS_UNSUCCESSFUL; + goto cleanup; + } + } + + case CmResourceTypeDma: + case CmResourceTypeBusNumber: + case CmResourceTypeDeviceSpecific: + /* Nothing to do */ + break; + default: + DPRINT1("Unknown resource descriptor type 0x%x\n", DescriptorRaw->Type); + Status = STATUS_NOT_IMPLEMENTED; + goto cleanup; + } + } + } + return STATUS_SUCCESS; + +cleanup: + /* Yes! Also delete ResourceList because ResourceList and + * ResourceListTranslated should be a pair! */ + ExFreePool(DeviceNode->ResourceList); + DeviceNode->ResourceList = NULL; + if (DeviceNode->ResourceListTranslated) + { + ExFreePool(DeviceNode->ResourceListTranslated); + DeviceNode->ResourceList = NULL; + } + return Status; +} + +NTSTATUS +NTAPI +IopAssignDeviceResources( + IN PDEVICE_NODE DeviceNode) +{ + NTSTATUS Status; + ULONG ListSize; + + IopDeviceNodeSetFlag(DeviceNode, DNF_ASSIGNING_RESOURCES); + + Status = IopFilterResourceRequirements(DeviceNode); + if (!NT_SUCCESS(Status)) + goto ByeBye; + + if (!DeviceNode->BootResources && !DeviceNode->ResourceRequirements) + { + DeviceNode->Flags |= DNF_NO_RESOURCE_REQUIRED; + + /* No resource needed for this device */ + DeviceNode->ResourceList = NULL; + DeviceNode->ResourceListTranslated = NULL; + + return STATUS_SUCCESS; + } + + /* Fill DeviceNode->ResourceList + * FIXME: the PnP arbiter should go there! + * Actually, use the BootResources if provided, else the resource requirements + */ + + if (DeviceNode->BootResources) + { + ListSize = IopCalculateResourceListSize(DeviceNode->BootResources); + + DeviceNode->ResourceList = ExAllocatePool(PagedPool, ListSize); + if (!DeviceNode->ResourceList) + { + Status = STATUS_NO_MEMORY; + goto ByeBye; + } + RtlCopyMemory(DeviceNode->ResourceList, DeviceNode->BootResources, ListSize); + + Status = IopDetectResourceConflict(DeviceNode->ResourceList, FALSE, NULL); + if (NT_SUCCESS(Status) || !DeviceNode->ResourceRequirements) + { + if (!NT_SUCCESS(Status) && !DeviceNode->ResourceRequirements) + { + DPRINT1("Using conflicting boot resources because no requirements were supplied!\n"); + } + + goto Finish; + } + else + { + DPRINT1("Boot resources for %wZ cause a resource conflict!\n", &DeviceNode->InstancePath); + ExFreePool(DeviceNode->ResourceList); + } + } + + Status = IopCreateResourceListFromRequirements(DeviceNode->ResourceRequirements, + &DeviceNode->ResourceList); + if (!NT_SUCCESS(Status)) + goto ByeBye; + + Status = IopDetectResourceConflict(DeviceNode->ResourceList, FALSE, NULL); + if (!NT_SUCCESS(Status)) + goto ByeBye; + +Finish: + Status = IopTranslateDeviceResources(DeviceNode); + if (!NT_SUCCESS(Status)) + goto ByeBye; + + Status = IopUpdateResourceMapForPnPDevice(DeviceNode); + if (!NT_SUCCESS(Status)) + goto ByeBye; + + Status = IopUpdateControlKeyWithResources(DeviceNode); + if (!NT_SUCCESS(Status)) + goto ByeBye; + + IopDeviceNodeSetFlag(DeviceNode, DNF_RESOURCE_ASSIGNED); + + IopDeviceNodeClearFlag(DeviceNode, DNF_ASSIGNING_RESOURCES); + + return STATUS_SUCCESS; + +ByeBye: + if (DeviceNode->ResourceList) + { + ExFreePool(DeviceNode->ResourceList); + DeviceNode->ResourceList = NULL; + } + + DeviceNode->ResourceListTranslated = NULL; + + IopDeviceNodeClearFlag(DeviceNode, DNF_ASSIGNING_RESOURCES); + + return Status; +} + +static +BOOLEAN +IopCheckForResourceConflict( + IN PCM_RESOURCE_LIST ResourceList1, + IN PCM_RESOURCE_LIST ResourceList2, + IN BOOLEAN Silent, + OUT OPTIONAL PCM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDescriptor) +{ + ULONG i, ii; + BOOLEAN Result = FALSE; + + for (i = 0; i < ResourceList1->Count; i++) + { + PCM_PARTIAL_RESOURCE_LIST ResList = &ResourceList1->List[i].PartialResourceList; + for (ii = 0; ii < ResList->Count; ii++) + { + PCM_PARTIAL_RESOURCE_DESCRIPTOR ResDesc = &ResList->PartialDescriptors[ii]; + + Result = IopCheckResourceDescriptor(ResDesc, + ResourceList2, + Silent, + ConflictingDescriptor); + if (Result) goto ByeBye; + } + } + + +ByeBye: + + return Result; +} + +NTSTATUS +IopDetectResourceConflict( + IN PCM_RESOURCE_LIST ResourceList, + IN BOOLEAN Silent, + OUT OPTIONAL PCM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDescriptor) +{ + OBJECT_ATTRIBUTES ObjectAttributes; + UNICODE_STRING KeyName; + HANDLE ResourceMapKey = INVALID_HANDLE_VALUE, ChildKey2 = INVALID_HANDLE_VALUE, ChildKey3 = INVALID_HANDLE_VALUE; + ULONG KeyInformationLength, RequiredLength, KeyValueInformationLength, KeyNameInformationLength; + PKEY_BASIC_INFORMATION KeyInformation; + PKEY_VALUE_PARTIAL_INFORMATION KeyValueInformation; + PKEY_VALUE_BASIC_INFORMATION KeyNameInformation; + ULONG ChildKeyIndex1 = 0, ChildKeyIndex2 = 0, ChildKeyIndex3 = 0; + NTSTATUS Status; + + RtlInitUnicodeString(&KeyName, L"\\Registry\\Machine\\HARDWARE\\RESOURCEMAP"); + InitializeObjectAttributes(&ObjectAttributes, &KeyName, OBJ_CASE_INSENSITIVE, 0, NULL); + Status = ZwOpenKey(&ResourceMapKey, KEY_ENUMERATE_SUB_KEYS | KEY_QUERY_VALUE, &ObjectAttributes); + if (!NT_SUCCESS(Status)) + { + /* The key is missing which means we are the first device */ + return STATUS_SUCCESS; + } + + while (TRUE) + { + Status = ZwEnumerateKey(ResourceMapKey, + ChildKeyIndex1, + KeyBasicInformation, + NULL, + 0, + &RequiredLength); + if (Status == STATUS_NO_MORE_ENTRIES) + break; + else if (Status == STATUS_BUFFER_OVERFLOW || Status == STATUS_BUFFER_TOO_SMALL) + { + KeyInformationLength = RequiredLength; + KeyInformation = ExAllocatePool(PagedPool, KeyInformationLength); + if (!KeyInformation) + { + Status = STATUS_INSUFFICIENT_RESOURCES; + goto cleanup; + } + + Status = ZwEnumerateKey(ResourceMapKey, + ChildKeyIndex1, + KeyBasicInformation, + KeyInformation, + KeyInformationLength, + &RequiredLength); + } + else + goto cleanup; + ChildKeyIndex1++; + if (!NT_SUCCESS(Status)) + goto cleanup; + + KeyName.Buffer = KeyInformation->Name; + KeyName.MaximumLength = KeyName.Length = KeyInformation->NameLength; + InitializeObjectAttributes(&ObjectAttributes, + &KeyName, + OBJ_CASE_INSENSITIVE, + ResourceMapKey, + NULL); + Status = ZwOpenKey(&ChildKey2, KEY_ENUMERATE_SUB_KEYS | KEY_QUERY_VALUE, &ObjectAttributes); + ExFreePool(KeyInformation); + if (!NT_SUCCESS(Status)) + goto cleanup; + + while (TRUE) + { + Status = ZwEnumerateKey(ChildKey2, + ChildKeyIndex2, + KeyBasicInformation, + NULL, + 0, + &RequiredLength); + if (Status == STATUS_NO_MORE_ENTRIES) + break; + else if (Status == STATUS_BUFFER_TOO_SMALL) + { + KeyInformationLength = RequiredLength; + KeyInformation = ExAllocatePool(PagedPool, KeyInformationLength); + if (!KeyInformation) + { + Status = STATUS_INSUFFICIENT_RESOURCES; + goto cleanup; + } + + Status = ZwEnumerateKey(ChildKey2, + ChildKeyIndex2, + KeyBasicInformation, + KeyInformation, + KeyInformationLength, + &RequiredLength); + } + else + goto cleanup; + ChildKeyIndex2++; + if (!NT_SUCCESS(Status)) + goto cleanup; + + KeyName.Buffer = KeyInformation->Name; + KeyName.MaximumLength = KeyName.Length = KeyInformation->NameLength; + InitializeObjectAttributes(&ObjectAttributes, + &KeyName, + OBJ_CASE_INSENSITIVE, + ChildKey2, + NULL); + Status = ZwOpenKey(&ChildKey3, KEY_QUERY_VALUE, &ObjectAttributes); + ExFreePool(KeyInformation); + if (!NT_SUCCESS(Status)) + goto cleanup; + + while (TRUE) + { + Status = ZwEnumerateValueKey(ChildKey3, + ChildKeyIndex3, + KeyValuePartialInformation, + NULL, + 0, + &RequiredLength); + if (Status == STATUS_NO_MORE_ENTRIES) + break; + else if (Status == STATUS_BUFFER_TOO_SMALL) + { + KeyValueInformationLength = RequiredLength; + KeyValueInformation = ExAllocatePool(PagedPool, KeyValueInformationLength); + if (!KeyValueInformation) + { + Status = STATUS_INSUFFICIENT_RESOURCES; + goto cleanup; + } + + Status = ZwEnumerateValueKey(ChildKey3, + ChildKeyIndex3, + KeyValuePartialInformation, + KeyValueInformation, + KeyValueInformationLength, + &RequiredLength); + } + else + goto cleanup; + if (!NT_SUCCESS(Status)) + goto cleanup; + + Status = ZwEnumerateValueKey(ChildKey3, + ChildKeyIndex3, + KeyValueBasicInformation, + NULL, + 0, + &RequiredLength); + if (Status == STATUS_BUFFER_TOO_SMALL) + { + KeyNameInformationLength = RequiredLength; + KeyNameInformation = ExAllocatePool(PagedPool, KeyNameInformationLength + sizeof(WCHAR)); + if (!KeyNameInformation) + { + Status = STATUS_INSUFFICIENT_RESOURCES; + goto cleanup; + } + + Status = ZwEnumerateValueKey(ChildKey3, + ChildKeyIndex3, + KeyValueBasicInformation, + KeyNameInformation, + KeyNameInformationLength, + &RequiredLength); + } + else + goto cleanup; + + ChildKeyIndex3++; + + if (!NT_SUCCESS(Status)) + goto cleanup; + + KeyNameInformation->Name[KeyNameInformation->NameLength / sizeof(WCHAR)] = UNICODE_NULL; + + /* Skip translated entries */ + if (wcsstr(KeyNameInformation->Name, L".Translated")) + { + ExFreePool(KeyNameInformation); + continue; + } + + ExFreePool(KeyNameInformation); + + if (IopCheckForResourceConflict(ResourceList, + (PCM_RESOURCE_LIST)KeyValueInformation->Data, + Silent, + ConflictingDescriptor)) + { + ExFreePool(KeyValueInformation); + Status = STATUS_CONFLICTING_ADDRESSES; + goto cleanup; + } + + ExFreePool(KeyValueInformation); + } + } + } + +cleanup: + if (ResourceMapKey != INVALID_HANDLE_VALUE) + ZwClose(ResourceMapKey); + if (ChildKey2 != INVALID_HANDLE_VALUE) + ZwClose(ChildKey2); + if (ChildKey3 != INVALID_HANDLE_VALUE) + ZwClose(ChildKey3); + + if (Status == STATUS_NO_MORE_ENTRIES) + Status = STATUS_SUCCESS; + + return Status; +} + diff --git a/reactos/ntoskrnl/ntoskrnl-generic.rbuild b/reactos/ntoskrnl/ntoskrnl-generic.rbuild index da129c385a4..5dc63c62e56 100644 --- a/reactos/ntoskrnl/ntoskrnl-generic.rbuild +++ b/reactos/ntoskrnl/ntoskrnl-generic.rbuild @@ -270,6 +270,7 @@ pnpmgr.c pnpnotify.c pnpreport.c + pnpres.c pnproot.c pnputil.c From 2fa4179cf2cb20537ff7af0b27f2e58e26d9c60d Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Wed, 21 Apr 2010 22:42:21 +0000 Subject: [PATCH 029/131] - Missed this from my last commit svn path=/trunk/; revision=46984 --- reactos/ntoskrnl/io/pnpmgr/pnpres.c | 1 + 1 file changed, 1 insertion(+) diff --git a/reactos/ntoskrnl/io/pnpmgr/pnpres.c b/reactos/ntoskrnl/io/pnpmgr/pnpres.c index 32a746ee26f..88148901112 100644 --- a/reactos/ntoskrnl/io/pnpmgr/pnpres.c +++ b/reactos/ntoskrnl/io/pnpmgr/pnpres.c @@ -822,6 +822,7 @@ IopAssignDeviceResources( if (!DeviceNode->BootResources && !DeviceNode->ResourceRequirements) { DeviceNode->Flags |= DNF_NO_RESOURCE_REQUIRED; + DeviceNode->Flags &= ~DNF_ASSIGNING_RESOURCES; /* No resource needed for this device */ DeviceNode->ResourceList = NULL; From 6463764d6615045481d9ce398318674f5838c0d2 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Wed, 21 Apr 2010 23:19:12 +0000 Subject: [PATCH 030/131] [PCI] - Don't set DO_BUS_ENUMERATED_DEVICE on child PDOs because the PnP manager does it for us svn path=/trunk/; revision=46985 --- reactos/drivers/bus/pci/fdo.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/reactos/drivers/bus/pci/fdo.c b/reactos/drivers/bus/pci/fdo.c index 35fd12536c7..8072a89b455 100644 --- a/reactos/drivers/bus/pci/fdo.c +++ b/reactos/drivers/bus/pci/fdo.c @@ -239,8 +239,6 @@ FdoQueryBusRelations( break; } - Device->Pdo->Flags |= DO_BUS_ENUMERATED_DEVICE; - Device->Pdo->Flags &= ~DO_DEVICE_INITIALIZING; //Device->Pdo->Flags |= DO_POWER_PAGABLE; From 0f570fe34cf652edba54d3224fd58dd7d68fbe40 Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Thu, 22 Apr 2010 03:54:09 +0000 Subject: [PATCH 031/131] [NTOS]: MiFindExportedRoutineByName should validate the ordinal to make sure it's not higher than the function count. [NTOS]: Use MM_SYSLDR_ defines instead of magic pointer casts. Use appropriate pool tags. [NTOS]: Set the LoadedImport count early-on during image referencing, so that failure will correctly de-reference the imports. By setting it to zero, failures would've leaked driver-dependent DLLs already loaded but now useless. [NTOS]: Do the same checks as Windows to avoid drivers linked with user-mode DLLs. [NTOS]: Allow "coverage" and "irt" to be linked with Win32K drivers as well. [NTOS]: When the linker is fixed not to generate corrupt drivers, add the appropriate code to scan IMAGE_DIRECTORY_ENTRY_IAT for updating thunks. A hack exists in ReactOS now to permit loading these hacked drivers, but Windows is not so generous and will crash with a ReactOS driver. svn path=/trunk/; revision=46987 --- reactos/ntoskrnl/mm/sysldr.c | 77 ++++++++++++++++++++++++++++-------- 1 file changed, 61 insertions(+), 16 deletions(-) diff --git a/reactos/ntoskrnl/mm/sysldr.c b/reactos/ntoskrnl/mm/sysldr.c index 1b08c91f28d..a142516b9a9 100644 --- a/reactos/ntoskrnl/mm/sysldr.c +++ b/reactos/ntoskrnl/mm/sysldr.c @@ -509,6 +509,9 @@ MiFindExportedRoutineByName(IN PVOID DllBase, /* Otherwise, this is the ordinal */ Ordinal = OrdinalTable[Mid]; + /* Validate the ordinal */ + if (Ordinal >= ExportDirectory->NumberOfFunctions) return NULL; + /* Resolve the address and write it */ ExportTable = (PULONG)((ULONG_PTR)DllBase + ExportDirectory->AddressOfFunctions); @@ -554,9 +557,9 @@ MiUpdateThunks(IN PLOADER_PARAMETER_BLOCK LoaderBlock, ULONG_PTR OldBaseTop, Delta; PLDR_DATA_TABLE_ENTRY LdrEntry; PLIST_ENTRY NextEntry; - ULONG ImportSize; + ULONG ImportSize, i; + PULONG_PTR ImageThunk; PIMAGE_IMPORT_DESCRIPTOR ImportDescriptor; - PULONG ImageThunk; /* Calculate the top and delta */ OldBaseTop = (ULONG_PTR)OldBase + Size - 1; @@ -571,8 +574,30 @@ MiUpdateThunks(IN PLOADER_PARAMETER_BLOCK LoaderBlock, LdrEntry = CONTAINING_RECORD(NextEntry, LDR_DATA_TABLE_ENTRY, InLoadOrderLinks); +#ifdef _WORKING_LINKER_ + /* Get the IAT */ + ImageThunk = RtlImageDirectoryEntryToData(LdrEntry->DllBase, + TRUE, + IMAGE_DIRECTORY_ENTRY_IAT, + &ImportSize); + if (!ImageThunk) continue; + /* Make sure we have an IAT */ + DPRINT("[Mm0]: Updating thunks in: %wZ\n", &LdrEntry->BaseDllName); + for (i = 0; i < ImportSize; i++, ImageThunk++) + { + /* Check if it's within this module */ + if ((*ImageThunk >= (ULONG_PTR)OldBase) && (*ImageThunk <= OldBaseTop)) + { + /* Relocate it */ + DPRINT("[Mm0]: Updating IAT at: %p. Old Entry: %p. New Entry: %p.\n", + ImageThunk, *ImageThunk, *ImageThunk + Delta); + *ImageThunk += Delta; + } + } +#else /* Get the import table */ + i = ImportSize; ImportDescriptor = RtlImageDirectoryEntryToData(LdrEntry->DllBase, TRUE, IMAGE_DIRECTORY_ENTRY_IMPORT, @@ -605,6 +630,7 @@ MiUpdateThunks(IN PLOADER_PARAMETER_BLOCK LoaderBlock, /* Go to the next import */ ImportDescriptor++; } +#endif } } @@ -672,7 +698,7 @@ MiSnapThunk(IN PVOID DllBase, /* Get the hint and check if it's valid */ Hint = NameImport->Hint; if ((Hint < ExportDirectory->NumberOfNames) && - !(strcmp((PCHAR) NameImport->Name, (PCHAR)DllBase + NameTable[Hint]))) + !(strcmp((PCHAR)NameImport->Name, (PCHAR)DllBase + NameTable[Hint]))) { /* We have a match, get the ordinal number from here */ Ordinal = OrdinalTable[Hint]; @@ -843,7 +869,7 @@ MmUnloadSystemImage(IN PVOID ImageHandle) NULL); /* Check if this driver was loaded at boot and didn't get imports parsed */ - if (LdrEntry->LoadedImports == (PVOID)-1) goto Done; + if (LdrEntry->LoadedImports == MM_SYSLDR_BOOT_LOADED) goto Done; /* We should still be alive */ ASSERT(LdrEntry->LoadCount != 0); @@ -870,6 +896,7 @@ MmUnloadSystemImage(IN PVOID ImageHandle) } /* FIXME: Free the driver */ + DPRINT1("Leaking driver: %wZ\n", &LdrEntry->BaseDllName); //MmFreeSection(LdrEntry->DllBase); /* Check if we're linked in */ @@ -940,7 +967,7 @@ MiResolveImageReferences(IN PVOID ImageBase, __FUNCTION__, ImageBase, ImageFileDirectory); /* Assume no imports */ - *LoadImports = (PVOID)-2; + *LoadImports = MM_SYSLDR_NO_IMPORTS; /* Get the import descriptor */ ImportDescriptor = RtlImageDirectoryEntryToData(ImageBase, @@ -965,11 +992,12 @@ MiResolveImageReferences(IN PVOID ImageBase, LoadedImportsSize = ImportCount * sizeof(PVOID) + sizeof(SIZE_T); LoadedImports = ExAllocatePoolWithTag(PagedPool, LoadedImportsSize, - TAG_LDR_WSTR); + 'TDmM'); if (LoadedImports) { /* Zero it */ RtlZeroMemory(LoadedImports, LoadedImportsSize); + LoadedImports->Count = ImportCount; } } else @@ -989,10 +1017,12 @@ MiResolveImageReferences(IN PVOID ImageBase, GdiLink = GdiLink | !(_strnicmp(ImportName, "win32k", sizeof("win32k") - 1)); - /* We can also allow dxapi */ + /* We can also allow dxapi (for Windows compat, allow IRT and coverage )*/ NormalLink = NormalLink | ((_strnicmp(ImportName, "win32k", sizeof("win32k") - 1)) && - (_strnicmp(ImportName, "dxapi", sizeof("dxapi") - 1))); + (_strnicmp(ImportName, "dxapi", sizeof("dxapi") - 1)) && + (_strnicmp(ImportName, "coverage", sizeof("coverage") - 1)) && + (_strnicmp(ImportName, "irt", sizeof("irt") - 1))); /* Check if this is a valid GDI driver */ if ((GdiLink) && (NormalLink)) @@ -1003,6 +1033,20 @@ MiResolveImageReferences(IN PVOID ImageBase, return STATUS_PROCEDURE_NOT_FOUND; } + /* Check for user-mode printer or video card drivers, which don't belong */ + if (!(_strnicmp(ImportName, "ntdll", sizeof("ntdll") - 1)) || + !(_strnicmp(ImportName, "winsrv", sizeof("winsrv") - 1)) || + !(_strnicmp(ImportName, "advapi32", sizeof("advapi32") - 1)) || + !(_strnicmp(ImportName, "kernel32", sizeof("kernel32") - 1)) || + !(_strnicmp(ImportName, "user32", sizeof("user32") - 1)) || + !(_strnicmp(ImportName, "gdi32", sizeof("gdi32") - 1))) + { + /* This is not kernel code */ + MiDereferenceImports(LoadedImports); + if (LoadedImports) ExFreePool(LoadedImports); + return STATUS_PROCEDURE_NOT_FOUND; + } + /* Check if this is a "core" import, which doesn't get referenced */ if (!(_strnicmp(ImportName, "ntoskrnl", sizeof("ntoskrnl") - 1)) || !(_strnicmp(ImportName, "win32k", sizeof("win32k") - 1)) || @@ -1079,7 +1123,7 @@ CheckDllState: sizeof(UNICODE_NULL); DllName.Buffer = ExAllocatePoolWithTag(NonPagedPool, DllName.MaximumLength, - TAG_LDR_WSTR); + 'TDmM'); if (DllName.Buffer) { /* Setup the base length and copy it */ @@ -1091,13 +1135,13 @@ CheckDllState: /* Now add the import name and null-terminate it */ RtlAppendStringToString((PSTRING)&DllName, (PSTRING)&NameString); - DllName.Buffer[(DllName.MaximumLength - 1) / sizeof(WCHAR)] = UNICODE_NULL; + DllName.Buffer[(DllName.MaximumLength - 1) / sizeof(WCHAR)] = UNICODE_NULL; /* Load the image */ Status = MmLoadSystemImage(&DllName, NamePrefix, NULL, - 0, + FALSE, (PVOID)&DllEntry, &DllBase); if (NT_SUCCESS(Status)) @@ -1160,8 +1204,8 @@ CheckDllState: if (!(LdrEntry->Flags & LDRP_LOAD_IN_PROGRESS)) { /* Add the entry */ - LoadedImports->Entry[LoadedImports->Count] = LdrEntry; - LoadedImports->Count++; + LoadedImports->Entry[ImportCount] = LdrEntry; + ImportCount++; } } @@ -1230,7 +1274,8 @@ CheckDllState: if (LoadedImports->Entry[i]) { /* Got an entry, OR it with 1 in case it's the single entry */ - ImportEntry = (PVOID)((ULONG_PTR)LoadedImports->Entry[i] | 1); + ImportEntry = (PVOID)((ULONG_PTR)LoadedImports->Entry[i] | + MM_SYSLDR_SINGLE_ENTRY); ImportCount++; } } @@ -1240,7 +1285,7 @@ CheckDllState: { /* Free the list and set it to no imports */ ExFreePoolWithTag(LoadedImports, TAG_LDR_WSTR); - LoadedImports = (PVOID)-2; + LoadedImports = MM_SYSLDR_NO_IMPORTS; } else if (ImportCount == 1) { @@ -1254,7 +1299,7 @@ CheckDllState: LoadedImportsSize = ImportCount * sizeof(PVOID) + sizeof(SIZE_T); NewImports = ExAllocatePoolWithTag(PagedPool, LoadedImportsSize, - TAG_LDR_WSTR); + 'TDmM'); if (NewImports) { /* Set count */ From 0e419c8771cdfc7e0f8261b3587858b477372133 Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Thu, 22 Apr 2010 08:04:57 +0000 Subject: [PATCH 032/131] [NTOS]: Implement and call MiUseLargeDriverPage. [NTOS]: MmCheckSystemImage: Check for 32-bit/64-bit image/OS mismatch. [NTOS]: MmCheckSystemImage: Return invalid checksum if couldn't get the NT header from the image. [NTOS]: MmCheckSystemImage: Map images as SEC_IMAGE instead of SEC_COMMIT, and simply read the size off that way. svn path=/trunk/; revision=46988 --- reactos/ntoskrnl/mm/sysldr.c | 97 +++++++++++++++++++++++++++++++++--- 1 file changed, 90 insertions(+), 7 deletions(-) diff --git a/reactos/ntoskrnl/mm/sysldr.c b/reactos/ntoskrnl/mm/sysldr.c index a142516b9a9..27dcee3219c 100644 --- a/reactos/ntoskrnl/mm/sysldr.c +++ b/reactos/ntoskrnl/mm/sysldr.c @@ -1590,6 +1590,63 @@ MiInitializeLoadedModuleList(IN PLOADER_PARAMETER_BLOCK LoaderBlock) return TRUE; } +LOGICAL +NTAPI +MiUseLargeDriverPage(IN ULONG NumberOfPtes, + IN OUT PVOID *ImageBaseAddress, + IN PUNICODE_STRING BaseImageName, + IN BOOLEAN BootDriver) +{ + PLIST_ENTRY NextEntry; + BOOLEAN DriverFound = FALSE; + PMI_LARGE_PAGE_DRIVER_ENTRY LargePageDriverEntry; + ASSERT(KeGetCurrentIrql () <= APC_LEVEL); + ASSERT(*ImageBaseAddress >= MmSystemRangeStart); + +#ifdef _X86_ + if (!(KeFeatureBits & KF_LARGE_PAGE)) return FALSE; + if (!(__readcr4() & CR4_PSE)) return FALSE; +#endif + + /* Make sure there's enough system PTEs for a large page driver */ + if (MmTotalFreeSystemPtes[SystemPteSpace] < (16 * (PDE_MAPPED_VA >> PAGE_SHIFT))) + { + return FALSE; + } + + /* This happens if the registry key had a "*" (wildcard) in it */ + if (MiLargePageAllDrivers == 0) + { + /* It didn't, so scan the list */ + NextEntry = MiLargePageDriverList.Flink; + while (NextEntry != &MiLargePageDriverList) + { + /* Check if the driver name matches */ + LargePageDriverEntry = CONTAINING_RECORD(NextEntry, + MI_LARGE_PAGE_DRIVER_ENTRY, + Links); + if (RtlEqualUnicodeString(BaseImageName, + &LargePageDriverEntry->BaseName, + TRUE)) + { + /* Enable large pages for this driver */ + DriverFound = TRUE; + break; + } + + /* Keep trying */ + NextEntry = NextEntry->Flink; + } + + /* If we didn't find the driver, it doesn't need large pages */ + if (DriverFound == FALSE) return FALSE; + } + + /* Nothing to do yet */ + DPRINT1("Large pages not supported!\n"); + return FALSE; +} + ULONG NTAPI MiComputeDriverProtection(IN BOOLEAN SessionSpace, @@ -1994,15 +2051,24 @@ MmCheckSystemImage(IN HANDLE ImageHandle, IO_STATUS_BLOCK IoStatusBlock; FILE_STANDARD_INFORMATION FileStandardInfo; KAPC_STATE ApcState; + PIMAGE_NT_HEADERS NtHeaders; + OBJECT_ATTRIBUTES ObjectAttributes; PAGED_CODE(); + + /* Setup the object attributes */ + InitializeObjectAttributes(&ObjectAttributes, + NULL, + OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, + NULL, + NULL); /* Create a section for the DLL */ Status = ZwCreateSection(&SectionHandle, SECTION_MAP_EXECUTE, - NULL, + &ObjectAttributes, NULL, PAGE_EXECUTE, - SEC_COMMIT, + SEC_IMAGE, ImageHandle); if (!NT_SUCCESS(Status)) return Status; @@ -2034,17 +2100,35 @@ MmCheckSystemImage(IN HANDLE ImageHandle, &FileStandardInfo, sizeof(FileStandardInfo), FileStandardInformation); - if ( NT_SUCCESS(Status) ) + if (NT_SUCCESS(Status)) { /* First, verify the checksum */ if (!LdrVerifyMappedImageMatchesChecksum(ViewBase, - FileStandardInfo. - EndOfFile.LowPart, + ViewSize, FileStandardInfo. EndOfFile.LowPart)) { /* Set checksum failure */ Status = STATUS_IMAGE_CHECKSUM_MISMATCH; + goto Fail; + } + + /* Make sure it's a real image */ + NtHeaders = RtlImageNtHeader(ViewBase); + if (!NtHeaders) + { + /* Set checksum failure */ + Status = STATUS_IMAGE_CHECKSUM_MISMATCH; + goto Fail; + } + + /* Make sure it's for the correct architecture */ + if ((NtHeaders->FileHeader.Machine != IMAGE_FILE_MACHINE_NATIVE) || + (NtHeaders->OptionalHeader.Magic != IMAGE_NT_OPTIONAL_HDR_MAGIC)) + { + /* Set protection failure */ + Status = STATUS_INVALID_IMAGE_PROTECT; + goto Fail; } /* Check that it's a valid SMP image if we have more then one CPU */ @@ -2056,6 +2140,7 @@ MmCheckSystemImage(IN HANDLE ImageHandle, } /* Unmap the section, close the handle, and return status */ +Fail: ZwUnmapViewOfSection(NtCurrentProcess(), ViewBase); KeUnstackDetachProcess(&ApcState); ZwClose(SectionHandle); @@ -2330,13 +2415,11 @@ LoaderScan: /* Check for success */ if (NT_SUCCESS(Status)) { - #if 0 /* Support large pages for drivers */ MiUseLargeDriverPage(DriverSize / PAGE_SIZE, &ModuleLoadBase, &BaseName, TRUE); - #endif } /* Dereference the section */ From 2c0c247cc759b84d503fd9671e03ba5bb9426af1 Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Thu, 22 Apr 2010 08:13:56 +0000 Subject: [PATCH 033/131] [NTOS]: Implement and call MiBuildImportsForBootDrivers. We now have full dependency tracking for correct unloading. [NTOS]: Implement and call MiLocateKernelSections. Pool code and paging paths will require this information later. Loader work done for now. svn path=/trunk/; revision=46989 --- reactos/ntoskrnl/mm/sysldr.c | 336 ++++++++++++++++++++++++++++++++++- 1 file changed, 334 insertions(+), 2 deletions(-) diff --git a/reactos/ntoskrnl/mm/sysldr.c b/reactos/ntoskrnl/mm/sysldr.c index 27dcee3219c..1fb86f95d01 100644 --- a/reactos/ntoskrnl/mm/sysldr.c +++ b/reactos/ntoskrnl/mm/sysldr.c @@ -47,6 +47,10 @@ PVOID MmLastUnloadedDrivers; BOOLEAN MmMakeLowMemory; BOOLEAN MmEnforceWriteProtection = TRUE; +PMMPTE MiKernelResourceStartPte, MiKernelResourceEndPte; +ULONG_PTR ExPoolCodeStart, ExPoolCodeEnd, MmPoolCodeStart, MmPoolCodeEnd; +ULONG_PTR MmPteCodeStart, MmPteCodeEnd; + /* FUNCTIONS ******************************************************************/ PVOID @@ -1508,6 +1512,331 @@ MiReloadBootLoadedDrivers(IN PLOADER_PARAMETER_BLOCK LoaderBlock) } } +NTSTATUS +NTAPI +MiBuildImportsForBootDrivers(VOID) +{ + PLIST_ENTRY NextEntry, NextEntry2; + PLDR_DATA_TABLE_ENTRY LdrEntry, KernelEntry, HalEntry, LdrEntry2, LastEntry; + PLDR_DATA_TABLE_ENTRY* EntryArray; + UNICODE_STRING KernelName = RTL_CONSTANT_STRING(L"ntoskrnl.exe"); + UNICODE_STRING HalName = RTL_CONSTANT_STRING(L"hal.dll"); + PLOAD_IMPORTS LoadedImports; + ULONG LoadedImportsSize, ImportSize; + PULONG_PTR ImageThunk; + ULONG_PTR DllBase, DllEnd; + ULONG Modules = 0, i, j = 0; + PIMAGE_IMPORT_DESCRIPTOR ImportDescriptor; + + /* Initialize variables */ + KernelEntry = HalEntry = LastEntry = NULL; + + /* Loop the loaded module list... we are early enough that no lock is needed */ + NextEntry = PsLoadedModuleList.Flink; + while (NextEntry != &PsLoadedModuleList) + { + /* Get the entry */ + LdrEntry = CONTAINING_RECORD(NextEntry, + LDR_DATA_TABLE_ENTRY, + InLoadOrderLinks); + + /* Check if it's the kernel or HAL */ + if (RtlEqualUnicodeString(&KernelName, &LdrEntry->BaseDllName, TRUE)) + { + /* Found it */ + KernelEntry = LdrEntry; + } + else if (RtlEqualUnicodeString(&HalName, &LdrEntry->BaseDllName, TRUE)) + { + /* Found it */ + HalEntry = LdrEntry; + } + + /* Check if this is a driver DLL */ + if (LdrEntry->Flags & LDRP_DRIVER_DEPENDENT_DLL) + { + /* Check if this is the HAL or kernel */ + if ((LdrEntry == HalEntry) || (LdrEntry == KernelEntry)) + { + /* Add a reference */ + LdrEntry->LoadCount = 1; + } + else + { + /* No referencing needed */ + LdrEntry->LoadCount = 0; + } + } + else + { + /* No referencing needed */ + LdrEntry->LoadCount = 0; + } + + /* Remember this came from the loader */ + LdrEntry->LoadedImports = MM_SYSLDR_BOOT_LOADED; + + /* Keep looping */ + NextEntry = NextEntry->Flink; + Modules++; + } + + /* We must have at least found the kernel and HAL */ + if (!(HalEntry) || (!KernelEntry)) return STATUS_NOT_FOUND; + + /* Allocate the list */ + EntryArray = ExAllocatePoolWithTag(PagedPool, Modules * sizeof(PVOID), 'TDmM'); + if (!EntryArray) return STATUS_INSUFFICIENT_RESOURCES; + + /* Loop the loaded module list again */ + NextEntry = PsLoadedModuleList.Flink; + while (NextEntry != &PsLoadedModuleList) + { + /* Get the entry */ + LdrEntry = CONTAINING_RECORD(NextEntry, + LDR_DATA_TABLE_ENTRY, + InLoadOrderLinks); +#ifdef _WORKING_LOADER_ + /* Get its imports */ + ImageThunk = RtlImageDirectoryEntryToData(LdrEntry->DllBase, + TRUE, + IMAGE_DIRECTORY_ENTRY_IAT, + &ImportSize); + if (!ImageThunk) +#else + /* Get its imports */ + ImportDescriptor = RtlImageDirectoryEntryToData(LdrEntry->DllBase, + TRUE, + IMAGE_DIRECTORY_ENTRY_IMPORT, + &ImportSize); + if (!ImportDescriptor) +#endif + { + /* None present */ + LdrEntry->LoadedImports = MM_SYSLDR_NO_IMPORTS; + NextEntry = NextEntry->Flink; + continue; + } + + /* Clear the list and count the number of IAT thunks */ + RtlZeroMemory(EntryArray, Modules * sizeof(PVOID)); +#ifdef _WORKING_LOADER_ + ImportSize /= sizeof(ULONG_PTR); + + /* Scan the thunks */ + for (i = 0, DllBase = 0, DllEnd = 0; i < ImportSize; i++, ImageThunk++) +#else + i = DllBase = DllEnd = 0; + while ((ImportDescriptor->Name) && + (ImportDescriptor->OriginalFirstThunk)) + { + /* Get the image thunk */ + ImageThunk = (PVOID)((ULONG_PTR)LdrEntry->DllBase + + ImportDescriptor->FirstThunk); + while (*ImageThunk) +#endif + { + /* Do we already have an address? */ + if (DllBase) + { + /* Is the thunk in the same address? */ + if ((*ImageThunk >= DllBase) && (*ImageThunk < DllEnd)) + { + /* Skip it, we already have a reference for it */ + ASSERT(EntryArray[j]); + ImageThunk++; + continue; + } + } + + /* Loop the loaded module list to locate this address owner */ + j = 0; + NextEntry2 = PsLoadedModuleList.Flink; + while (NextEntry2 != &PsLoadedModuleList) + { + /* Get the entry */ + LdrEntry2 = CONTAINING_RECORD(NextEntry2, + LDR_DATA_TABLE_ENTRY, + InLoadOrderLinks); + + /* Get the address range for this module */ + DllBase = (ULONG_PTR)LdrEntry2->DllBase; + DllEnd = DllBase + LdrEntry2->SizeOfImage; + + /* Check if this IAT entry matches it */ + if ((*ImageThunk >= DllBase) && (*ImageThunk < DllEnd)) + { + /* Save it */ + //DPRINT1("Found imported dll: %wZ\n", &LdrEntry2->BaseDllName); + EntryArray[j] = LdrEntry2; + break; + } + + /* Keep searching */ + NextEntry2 = NextEntry2->Flink; + j++; + } + + /* Do we have a thunk outside the range? */ + if ((*ImageThunk < DllBase) || (*ImageThunk >= DllEnd)) + { + /* Could be 0... */ + if (*ImageThunk) + { + /* Should not be happening */ + DPRINT1("Broken IAT entry for %p at %p (%lx)\n", + LdrEntry, ImageThunk, *ImageThunk); + ASSERT(FALSE); + } + + /* Reset if we hit this */ + DllBase = 0; + } +#ifndef _WORKING_LOADER_ + ImageThunk++; + } + + i++; + ImportDescriptor++; +#endif + } + + /* Now scan how many imports we really have */ + for (i = 0, ImportSize = 0; i < Modules; i++) + { + /* Skip HAL and kernel */ + if ((EntryArray[i]) && + (EntryArray[i] != HalEntry) && + (EntryArray[i] != KernelEntry)) + { + /* A valid reference */ + LastEntry = EntryArray[i]; + ImportSize++; + } + } + + /* Do we have any imports after all? */ + if (!ImportSize) + { + /* No */ + LdrEntry->LoadedImports = MM_SYSLDR_NO_IMPORTS; + } + else if (ImportSize == 1) + { + /* A single entry import */ + LdrEntry->LoadedImports = (PVOID)((ULONG_PTR)LastEntry | MM_SYSLDR_SINGLE_ENTRY); + LastEntry->LoadCount++; + } + else + { + /* We need an import table */ + LoadedImportsSize = ImportSize * sizeof(PVOID) + sizeof(SIZE_T); + LoadedImports = ExAllocatePoolWithTag(PagedPool, + LoadedImportsSize, + 'TDmM'); + ASSERT(LoadedImports); + + /* Save the count */ + LoadedImports->Count = ImportSize; + + /* Now copy all imports */ + for (i = 0, j = 0; i < Modules; i++) + { + /* Skip HAL and kernel */ + if ((EntryArray[i]) && + (EntryArray[i] != HalEntry) && + (EntryArray[i] != KernelEntry)) + { + /* A valid reference */ + //DPRINT1("Found valid entry: %p\n", EntryArray[i]); + LoadedImports->Entry[j] = EntryArray[i]; + EntryArray[i]->LoadCount++; + j++; + } + } + + /* Should had as many entries as we expected */ + ASSERT(j == ImportSize); + LdrEntry->LoadedImports = LoadedImports; + } + + /* Next */ + NextEntry = NextEntry->Flink; + } + + /* Free the initial array */ + ExFreePool(EntryArray); + + /* FIXME: Might not need to keep the HAL/Kernel imports around */ + + /* Kernel and HAL are loaded at boot */ + KernelEntry->LoadedImports = MM_SYSLDR_BOOT_LOADED; + HalEntry->LoadedImports = MM_SYSLDR_BOOT_LOADED; + + /* All worked well */ + return STATUS_SUCCESS; +} + +VOID +NTAPI +MiLocateKernelSections(IN PLDR_DATA_TABLE_ENTRY LdrEntry) +{ + ULONG_PTR DllBase; + PIMAGE_NT_HEADERS NtHeaders; + PIMAGE_SECTION_HEADER SectionHeader; + ULONG Sections, Size; + + /* Get the kernel section header */ + DllBase = (ULONG_PTR)LdrEntry->DllBase; + NtHeaders = RtlImageNtHeader((PVOID)DllBase); + SectionHeader = IMAGE_FIRST_SECTION(NtHeaders); + + /* Loop all the sections */ + Sections = NtHeaders->FileHeader.NumberOfSections; + while (Sections) + { + /* Grab the size of the section */ + Size = max(SectionHeader->SizeOfRawData, SectionHeader->Misc.VirtualSize); + + /* Check for .RSRC section */ + if (*(PULONG)SectionHeader->Name == 'rsr.') + { + /* Remember the PTEs so we can modify them later */ + MiKernelResourceStartPte = MiAddressToPte(DllBase + + SectionHeader->VirtualAddress); + MiKernelResourceEndPte = MiKernelResourceStartPte + + BYTES_TO_PAGES(SectionHeader->VirtualAddress + Size); + } + else if (*(PULONG)SectionHeader->Name == 'LOOP') + { + /* POOLCODE vs. POOLMI */ + if (*(PULONG)&SectionHeader->Name[4] == 'EDOC') + { + /* Found Ex* Pool code */ + ExPoolCodeStart = DllBase + SectionHeader->VirtualAddress; + ExPoolCodeEnd = ExPoolCodeStart + Size; + } + else if (*(PUSHORT)&SectionHeader->Name[4] == 'MI') + { + /* Found Mm* Pool code */ + MmPoolCodeStart = DllBase + SectionHeader->VirtualAddress; + MmPoolCodeEnd = ExPoolCodeStart + Size; + } + } + else if ((*(PULONG)SectionHeader->Name == 'YSIM') && + (*(PULONG)&SectionHeader->Name[4] == 'ETPS')) + { + /* Found MISYSPTE (Mm System PTE code)*/ + MmPteCodeStart = DllBase + SectionHeader->VirtualAddress; + MmPteCodeEnd = ExPoolCodeStart + Size; + } + + /* Keep going */ + Sections--; + SectionHeader++; + } +} + BOOLEAN NTAPI MiInitializeLoadedModuleList(IN PLOADER_PARAMETER_BLOCK LoaderBlock) @@ -1528,6 +1857,9 @@ MiInitializeLoadedModuleList(IN PLOADER_PARAMETER_BLOCK LoaderBlock) LDR_DATA_TABLE_ENTRY, InLoadOrderLinks); PsNtosImageBase = (ULONG_PTR)LdrEntry->DllBase; + + /* Locate resource section, pool code, and system pte code */ + MiLocateKernelSections(LdrEntry); /* Loop the loader block */ while (NextEntry != ListHead) @@ -1541,7 +1873,7 @@ MiInitializeLoadedModuleList(IN PLOADER_PARAMETER_BLOCK LoaderBlock) if (!RtlImageNtHeader(LdrEntry->DllBase)) { /* Skip this entry */ - NextEntry= NextEntry->Flink; + NextEntry = NextEntry->Flink; continue; } @@ -1584,7 +1916,7 @@ MiInitializeLoadedModuleList(IN PLOADER_PARAMETER_BLOCK LoaderBlock) } /* Build the import lists for the boot drivers */ - //MiBuildImportsForBootDrivers(); + MiBuildImportsForBootDrivers(); /* We're done */ return TRUE; From 2ea442a9df32289bd812714e08392290d4c876ce Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Thu, 22 Apr 2010 08:47:47 +0000 Subject: [PATCH 034/131] [KERNEL32] - Update kernel32_winetests to Wine-1.1.43. svn path=/trunk/; revision=46990 --- rostests/winetests/kernel32/comm.c | 170 +- rostests/winetests/kernel32/console.c | 96 ++ rostests/winetests/kernel32/debugger.c | 49 +- rostests/winetests/kernel32/generated.c | 2001 ++++++++++++++++++++++- rostests/winetests/kernel32/heap.c | 3 +- rostests/winetests/kernel32/path.c | 2 +- rostests/winetests/kernel32/thread.c | 12 +- 7 files changed, 2164 insertions(+), 169 deletions(-) diff --git a/rostests/winetests/kernel32/comm.c b/rostests/winetests/kernel32/comm.c index 8cb010c3da5..8ce6cccfcc2 100755 --- a/rostests/winetests/kernel32/comm.c +++ b/rostests/winetests/kernel32/comm.c @@ -56,336 +56,336 @@ static TEST test[] = { "baud=9600 parity=e data=5 stop=1 xon=on odsr=off octs=off dtr=on rts=on idsr=on", TRUE, FALSE, - { 0x00000000, 0x00002580, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x05, 0x02, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0x00002580, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x05, 0x02, 0x00, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00002580, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x05, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0x00002580, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x05, 0x02, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } }, { "baud=0 parity=M data=6 stop=1.5 xon=off odsr=on octs=ON dtr=off rts=off idsr=OFF", TRUE, FALSE, - { 0x00000000, 0x00000000, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x06, 0x03, 0x01, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0x00000000, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x06, 0x03, 0x01, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x06, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0x00000000, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x06, 0x03, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } }, { "BAUD=4000000000 parity=n data=7 stop=2 to=off", TRUE, FALSE, - { 0x00000000, 0xee6b2800, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x07, 0x00, 0x02, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0xee6b2800, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x07, 0x00, 0x02, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0xee6b2800, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x07, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0xee6b2800, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x07, 0x00, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } }, { "Baud=115200 Parity=O Data=8 To=On", TRUE, FALSE, - { 0x00000000, 0x0001c200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x08, 0x01, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0x0001c200, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x08, 0x01, 0x00, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x0001c200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x08, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0x0001c200, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x08, 0x01, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000EA60 }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000EA60 } }, { "PaRiTy=s Data=7 DTR=on", TRUE, FALSE, - { 0x00000000, 0x00000000, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x07, 0x04, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x07, 0x04, 0x00, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x07, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x07, 0x04, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } }, { "data=4", FALSE, FALSE, - { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } }, { "data=9", FALSE, FALSE, - { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } }, { "parity=no", FALSE, FALSE, - { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } }, { "stop=0", FALSE, FALSE, - { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } }, { "stop=1.501", FALSE, FALSE, - { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } }, { "stop=3", FALSE, FALSE, - { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } }, { "to=foobar", FALSE, FALSE, - { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } }, { " baud=9600", FALSE, FALSE, - { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } }, { "baud= 9600", FALSE, FALSE, - { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } }, { "baud=9600,data=8", FALSE, FALSE, - { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } }, { "11,n,8,1", TRUE, TRUE, - { 0x00000000, 0x0000006e, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x08, 0x00, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0x0000006e, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x08, 0x00, 0x00, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x0000006e, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0x0000006e, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x08, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } }, { "30 ,E, 5,1.5", TRUE, TRUE, - { 0x00000000, 0x0000012c, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x05, 0x02, 0x01, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0x0000012c, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x05, 0x02, 0x01, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x0000012c, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x05, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0x0000012c, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x05, 0x02, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } }, { "60, m, 6, 2 ", TRUE, TRUE, - { 0x00000000, 0x00000258, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x06, 0x03, 0x02, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0x00000258, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x06, 0x03, 0x02, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000258, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x06, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0x00000258, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x06, 0x03, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } }, { "12 , o , 7 , 1", TRUE, TRUE, - { 0x00000000, 0x000004b0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x07, 0x01, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0x000004b0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x07, 0x01, 0x00, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x000004b0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0x000004b0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x07, 0x01, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } }, { "24,s,8,1.5", TRUE, TRUE, - { 0x00000000, 0x00000960, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x08, 0x04, 0x01, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0x00000960, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x08, 0x04, 0x01, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000960, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x08, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0x00000960, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x08, 0x04, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } }, { "48,n,8,1,p", TRUE, TRUE, - { 0x00000000, 0x000012c0, 0, 0, 1, 1, 2, 0, 0, 0, 0, 0, 0, 2, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x08, 0x00, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0x000012c0, 1, 1, 1, 1, 2, 1, 1, 0, 0, 1, 1, 2, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x08, 0x00, 0x00, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x000012c0, 0, 0, 1, 1, 2, 0, 0, 0, 0, 0, 0, 2, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0x000012c0, 1, 1, 1, 1, 2, 1, 1, 0, 0, 1, 1, 2, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x08, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } }, { "96,N,8,1 , x ", TRUE, TRUE, - { 0x00000000, 0x00002580, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x08, 0x00, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0x00002580, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x08, 0x00, 0x00, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00002580, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0x00002580, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x08, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } }, { "19, e, 7, 1, x", TRUE, TRUE, - { 0x00000000, 0x00004b00, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x07, 0x02, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0x00004b00, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x07, 0x02, 0x00, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00004b00, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x07, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0x00004b00, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x07, 0x02, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } }, { "0,M,7,1,P", TRUE, TRUE, - { 0x00000000, 0x00000000, 0, 0, 1, 1, 2, 0, 0, 0, 0, 0, 0, 2, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x07, 0x03, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0x00000000, 1, 1, 1, 1, 2, 1, 1, 0, 0, 1, 1, 2, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x07, 0x03, 0x00, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0, 0, 1, 1, 2, 0, 0, 0, 0, 0, 0, 2, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x07, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0x00000000, 1, 1, 1, 1, 2, 1, 1, 0, 0, 1, 1, 2, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x07, 0x03, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } }, { "4000000000,O,7,1.5,X", TRUE, TRUE, - { 0x00000000, 0xee6b2800, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x07, 0x01, 0x01, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0xee6b2800, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x07, 0x01, 0x01, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0xee6b2800, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x07, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0xee6b2800, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x07, 0x01, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } }, { "96,N,8,1 to=on", FALSE, TRUE, - { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } }, { "96,NO,8,1", FALSE, TRUE, - { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } }, { "96,N,4,1", FALSE, TRUE, - { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } }, { "96,N,9,1", FALSE, TRUE, - { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } }, { "96,N,8,0", FALSE, TRUE, - { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } }, { "96,N,8,3", FALSE, TRUE, - { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } }, { "96,N,8,1,K", FALSE, TRUE, - { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } }, { "COM0:baud=115200", FALSE, FALSE, - { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } }, { "COMx:baud=38400 data=8", TRUE, FALSE, - { 0x00000000, 0x00009600, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x08, 0x00, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0x00009600, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x08, 0xff, 0x00, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00009600, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0x00009600, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x08, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } }, { "COMx :to=on stop=1.5", TRUE, FALSE, - { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x01, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0x01, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000EA60 }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000EA60 } }, { "COMx: baud=12345 data=7", TRUE, FALSE, - { 0x00000000, 0x00003039, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x07, 0x00, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0x00003039, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x07, 0xff, 0x00, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00003039, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0x00003039, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x07, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } }, { "COMx : xon=on odsr=off", TRUE, FALSE, - { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0xffffffff, 1, 1, 1, 0, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0x00, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0xffffffff, 1, 1, 1, 0, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } }, { "COM0:9600,N,8,1", FALSE, TRUE, - { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0xffffffff, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } }, { "COMx:9600,N,8,1", TRUE, TRUE, - { 0x00000000, 0x00002580, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x08, 0x00, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0x00002580, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x08, 0x00, 0x00, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00002580, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0x00002580, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x08, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } }, { "COMx: 11,E,7,2", TRUE, TRUE, - { 0x00000000, 0x0000006e, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x07, 0x02, 0x02, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0x0000006e, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x07, 0x02, 0x02, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x0000006e, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x07, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0x0000006e, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x07, 0x02, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } }, { "COMx :19,M,5,1", TRUE, TRUE, - { 0x00000000, 0x00004b00, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x05, 0x03, 0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0x00004b00, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x05, 0x03, 0x00, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x00004b00, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x05, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0x00004b00, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x05, 0x03, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } }, { "COMx : 57600,S,6,2,x", TRUE, TRUE, - { 0x00000000, 0x0000e100, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x06, 0x04, 0x02, (char)0x00, (char)0x00, (char)0x00, (char)0x00, (char)0x00, 0x0000 }, - { 0xffffffff, 0x0000e100, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x06, 0x04, 0x02, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, 0xffff }, + { 0x00000000, 0x0000e100, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0x00000, 0x0000, 0x0000, 0x0000, 0x06, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000 }, + { 0xffffffff, 0x0000e100, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0x1ffff, 0xffff, 0xffff, 0xffff, 0x06, 0x04, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xffff }, { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff } }, @@ -397,7 +397,7 @@ static TEST test[] = output the contents of a DCB structure. */ /*static print_dcb(DCB *pdcb) { - printf("0x%08x, 0x%08x, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u, 0x%05x, 0x%04x, 0x%04x, 0x%04x, 0x%02x, 0x%02x, 0x%02x, (char)0x%02x, (char)0x%02x, (char)0x%02x, (char)0x%02x, (char)0x%02x, 0x%04x\n", + printf("0x%08x, 0x%08x, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u, 0x%05x, 0x%04x, 0x%04x, 0x%04x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%04x\n", pdcb->DCBlength, pdcb->BaudRate, pdcb->fBinary, diff --git a/rostests/winetests/kernel32/console.c b/rostests/winetests/kernel32/console.c index ace4744067d..3d8ae9387d8 100755 --- a/rostests/winetests/kernel32/console.c +++ b/rostests/winetests/kernel32/console.c @@ -25,6 +25,7 @@ static BOOL (WINAPI *pGetConsoleInputExeNameA)(DWORD, LPSTR); static DWORD (WINAPI *pGetConsoleProcessList)(LPDWORD, DWORD); +static HANDLE (WINAPI *pOpenConsoleW)(LPCWSTR,DWORD,BOOL,DWORD); static BOOL (WINAPI *pSetConsoleInputExeNameA)(LPCSTR); /* DEFAULT_ATTRIB is used for all initial filling of the console. @@ -65,6 +66,7 @@ static void init_function_pointers(void) hKernel32 = GetModuleHandleA("kernel32.dll"); KERNEL32_GET_PROC(GetConsoleInputExeNameA); KERNEL32_GET_PROC(GetConsoleProcessList); + KERNEL32_GET_PROC(OpenConsoleW); KERNEL32_GET_PROC(SetConsoleInputExeNameA); #undef KERNEL32_GET_PROC @@ -988,6 +990,99 @@ static void test_GetConsoleProcessList(void) HeapFree(GetProcessHeap(), 0, list); } +static void test_OpenConsoleW(void) +{ + static const WCHAR coninW[] = {'C','O','N','I','N','$',0}; + static const WCHAR conoutW[] = {'C','O','N','O','U','T','$',0}; + static const WCHAR emptyW[] = {0}; + static const WCHAR invalidW[] = {'I','N','V','A','L','I','D',0}; + + static const struct + { + LPCWSTR name; + DWORD access; + BOOL inherit; + DWORD creation; + DWORD gle; + } invalid_table[] = { + {NULL, 0, FALSE, 0, ERROR_INVALID_PARAMETER}, + {NULL, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, ERROR_INVALID_PARAMETER}, + {NULL, 0, FALSE, OPEN_ALWAYS, ERROR_INVALID_PARAMETER}, + {NULL, GENERIC_READ | GENERIC_WRITE, FALSE, 0, ERROR_INVALID_PARAMETER}, + {NULL, GENERIC_READ | GENERIC_WRITE, FALSE, OPEN_ALWAYS, ERROR_INVALID_PARAMETER}, + {NULL, GENERIC_READ | GENERIC_WRITE, FALSE, OPEN_EXISTING, ERROR_INVALID_PARAMETER}, + {emptyW, 0, FALSE, 0, ERROR_INVALID_PARAMETER}, + {emptyW, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, ERROR_INVALID_PARAMETER}, + {emptyW, 0, FALSE, OPEN_ALWAYS, ERROR_INVALID_PARAMETER}, + {emptyW, GENERIC_READ | GENERIC_WRITE, FALSE, 0, ERROR_INVALID_PARAMETER}, + {emptyW, GENERIC_READ | GENERIC_WRITE, FALSE, OPEN_ALWAYS, ERROR_INVALID_PARAMETER}, + {emptyW, GENERIC_READ | GENERIC_WRITE, FALSE, OPEN_EXISTING, ERROR_INVALID_PARAMETER}, + {invalidW, 0, FALSE, 0, ERROR_INVALID_PARAMETER}, + {invalidW, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, ERROR_INVALID_PARAMETER}, + {invalidW, 0, FALSE, OPEN_ALWAYS, ERROR_INVALID_PARAMETER}, + {invalidW, GENERIC_READ | GENERIC_WRITE, FALSE, 0, ERROR_INVALID_PARAMETER}, + {invalidW, GENERIC_READ | GENERIC_WRITE, FALSE, OPEN_ALWAYS, ERROR_INVALID_PARAMETER}, + {invalidW, GENERIC_READ | GENERIC_WRITE, FALSE, OPEN_EXISTING, ERROR_INVALID_PARAMETER}, + {coninW, 0, FALSE, 0, ERROR_SHARING_VIOLATION}, + {coninW, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, ERROR_INVALID_PARAMETER}, + {coninW, 0, FALSE, OPEN_ALWAYS, ERROR_INVALID_PARAMETER}, + {coninW, GENERIC_READ | GENERIC_WRITE, FALSE, 0, ERROR_SHARING_VIOLATION}, + {coninW, GENERIC_READ | GENERIC_WRITE, FALSE, CREATE_NEW, ERROR_SHARING_VIOLATION}, + {coninW, GENERIC_READ | GENERIC_WRITE, FALSE, CREATE_ALWAYS, ERROR_SHARING_VIOLATION}, + {coninW, GENERIC_READ | GENERIC_WRITE, FALSE, OPEN_ALWAYS, ERROR_INVALID_PARAMETER}, + {coninW, GENERIC_READ | GENERIC_WRITE, FALSE, TRUNCATE_EXISTING, ERROR_INVALID_PARAMETER}, + {conoutW, 0, FALSE, 0, ERROR_SHARING_VIOLATION}, + {conoutW, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, ERROR_INVALID_PARAMETER}, + {conoutW, 0, FALSE, OPEN_ALWAYS, ERROR_INVALID_PARAMETER}, + {conoutW, GENERIC_READ | GENERIC_WRITE, FALSE, 0, ERROR_SHARING_VIOLATION}, + {conoutW, GENERIC_READ | GENERIC_WRITE, FALSE, CREATE_NEW, ERROR_SHARING_VIOLATION}, + {conoutW, GENERIC_READ | GENERIC_WRITE, FALSE, CREATE_ALWAYS, ERROR_SHARING_VIOLATION}, + {conoutW, GENERIC_READ | GENERIC_WRITE, FALSE, OPEN_ALWAYS, ERROR_INVALID_PARAMETER}, + {conoutW, GENERIC_READ | GENERIC_WRITE, FALSE, TRUNCATE_EXISTING, ERROR_INVALID_PARAMETER}, + }; + + int index; + HANDLE ret; + + if (!pOpenConsoleW) + { + win_skip("OpenConsoleW is not available\n"); + return; + } + + for (index = 0; index < sizeof(invalid_table)/sizeof(invalid_table[0]); index++) + { + SetLastError(0xdeadbeef); + ret = pOpenConsoleW(invalid_table[index].name, invalid_table[index].access, + invalid_table[index].inherit, invalid_table[index].creation); + ok(ret == INVALID_HANDLE_VALUE, + "Expected OpenConsoleW to return INVALID_HANDLE_VALUE for index %d, got %p\n", + index, ret); + ok(GetLastError() == invalid_table[index].gle, + "Expected GetLastError() to return %u for index %d, got %u\n", + invalid_table[index].gle, index, GetLastError()); + } + + /* OpenConsoleW should not touch the last error on success. */ + SetLastError(0xdeadbeef); + ret = pOpenConsoleW(coninW, GENERIC_READ | GENERIC_WRITE, FALSE, OPEN_EXISTING); + ok(ret != INVALID_HANDLE_VALUE, + "Expected OpenConsoleW to return a valid handle\n"); + ok(GetLastError() == 0xdeadbeef, + "Expected the last error to be untouched, got %u\n", GetLastError()); + if (ret != INVALID_HANDLE_VALUE) + CloseHandle(ret); + + SetLastError(0xdeadbeef); + ret = pOpenConsoleW(conoutW, GENERIC_READ | GENERIC_WRITE, FALSE, OPEN_EXISTING); + ok(ret != INVALID_HANDLE_VALUE, + "Expected OpenConsoleW to return a valid handle\n"); + ok(GetLastError() == 0xdeadbeef, + "Expected the last error to be untouched, got %u\n", GetLastError()); + if (ret != INVALID_HANDLE_VALUE) + CloseHandle(ret); +} + START_TEST(console) { HANDLE hConIn, hConOut; @@ -1038,4 +1133,5 @@ START_TEST(console) test_GetSetConsoleInputExeName(); test_GetConsoleProcessList(); + test_OpenConsoleW(); } diff --git a/rostests/winetests/kernel32/debugger.c b/rostests/winetests/kernel32/debugger.c index 98d0e123848..ff091e939ef 100644 --- a/rostests/winetests/kernel32/debugger.c +++ b/rostests/winetests/kernel32/debugger.c @@ -45,6 +45,8 @@ static char** myARGV; static BOOL (WINAPI *pCheckRemoteDebuggerPresent)(HANDLE,PBOOL); static BOOL (WINAPI *pDebugActiveProcessStop)(DWORD); static BOOL (WINAPI *pDebugSetProcessKillOnExit)(BOOL); +static BOOL (WINAPI *pIsDebuggerPresent)(void); +static struct _TEB * (WINAPI *pNtCurrentTeb)(void); static LONG child_failures; @@ -499,6 +501,7 @@ static void doChild(int argc, char **argv) const char *blackbox_file; HANDLE parent; DWORD ppid; + BOOL debug; BOOL ret; blackbox_file = argv[4]; @@ -507,15 +510,46 @@ static void doChild(int argc, char **argv) parent = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, ppid); child_ok(!!parent, "OpenProcess failed, last error %#x.\n", GetLastError()); + ret = pCheckRemoteDebuggerPresent(parent, &debug); + child_ok(ret, "CheckRemoteDebuggerPresent failed, last error %#x.\n", GetLastError()); + child_ok(!debug, "Expected debug == 0, got %#x.\n", debug); + ret = DebugActiveProcess(ppid); child_ok(ret, "DebugActiveProcess failed, last error %#x.\n", GetLastError()); + ret = pCheckRemoteDebuggerPresent(parent, &debug); + child_ok(ret, "CheckRemoteDebuggerPresent failed, last error %#x.\n", GetLastError()); + child_ok(debug, "Expected debug != 0, got %#x.\n", debug); + ret = pDebugActiveProcessStop(ppid); child_ok(ret, "DebugActiveProcessStop failed, last error %#x.\n", GetLastError()); + ret = pCheckRemoteDebuggerPresent(parent, &debug); + child_ok(ret, "CheckRemoteDebuggerPresent failed, last error %#x.\n", GetLastError()); + child_ok(!debug, "Expected debug == 0, got %#x.\n", debug); + ret = CloseHandle(parent); child_ok(ret, "CloseHandle failed, last error %#x.\n", GetLastError()); + ret = pIsDebuggerPresent(); + child_ok(ret, "Expected ret != 0, got %#x.\n", ret); + ret = pCheckRemoteDebuggerPresent(GetCurrentProcess(), &debug); + child_ok(ret, "CheckRemoteDebuggerPresent failed, last error %#x.\n", GetLastError()); + child_ok(debug, "Expected debug != 0, got %#x.\n", debug); + + if (pNtCurrentTeb) + { + pNtCurrentTeb()->ProcessEnvironmentBlock->BeingDebugged = FALSE; + + ret = pIsDebuggerPresent(); + child_ok(!ret, "Expected ret != 0, got %#x.\n", ret); + ret = pCheckRemoteDebuggerPresent(GetCurrentProcess(), &debug); + child_ok(ret, "CheckRemoteDebuggerPresent failed, last error %#x.\n", GetLastError()); + child_ok(debug, "Expected debug != 0, got %#x.\n", debug); + + pNtCurrentTeb()->ProcessEnvironmentBlock->BeingDebugged = TRUE; + } + blackbox.failures = child_failures; save_blackbox(blackbox_file, &blackbox, sizeof(blackbox)); } @@ -527,17 +561,21 @@ static void test_debug_loop(int argc, char **argv) char blackbox_file[MAX_PATH]; PROCESS_INFORMATION pi; STARTUPINFOA si; + BOOL debug; DWORD pid; char *cmd; BOOL ret; - if (!pDebugActiveProcessStop) + if (!pDebugActiveProcessStop || !pCheckRemoteDebuggerPresent) { - win_skip("DebugActiveProcessStop not available, skipping test.\n"); + win_skip("DebugActiveProcessStop or CheckRemoteDebuggerPresent not available, skipping test.\n"); return; } pid = GetCurrentProcessId(); + ret = DebugActiveProcess(pid); + ok(!ret, "DebugActiveProcess() succeeded on own process.\n"); + get_file_name(blackbox_file); cmd = HeapAlloc(GetProcessHeap(), 0, strlen(argv[0]) + strlen(arguments) + strlen(blackbox_file) + 10); sprintf(cmd, "%s%s%08x %s", argv[0], arguments, pid, blackbox_file); @@ -549,6 +587,10 @@ static void test_debug_loop(int argc, char **argv) HeapFree(GetProcessHeap(), 0, cmd); + ret = pCheckRemoteDebuggerPresent(pi.hProcess, &debug); + ok(ret, "CheckRemoteDebuggerPresent failed, last error %#x.\n", GetLastError()); + ok(debug, "Expected debug != 0, got %#x.\n", debug); + for (;;) { DEBUG_EVENT ev; @@ -584,6 +626,9 @@ START_TEST(debugger) pCheckRemoteDebuggerPresent=(void*)GetProcAddress(hdll, "CheckRemoteDebuggerPresent"); pDebugActiveProcessStop=(void*)GetProcAddress(hdll, "DebugActiveProcessStop"); pDebugSetProcessKillOnExit=(void*)GetProcAddress(hdll, "DebugSetProcessKillOnExit"); + pIsDebuggerPresent=(void*)GetProcAddress(hdll, "IsDebuggerPresent"); + hdll=GetModuleHandle("ntdll.dll"); + if (hdll) pNtCurrentTeb = (void*)GetProcAddress(hdll, "NtCurrentTeb"); myARGC=winetest_get_mainargs(&myARGV); if (myARGC >= 3 && strcmp(myARGV[2], "crash") == 0) diff --git a/rostests/winetests/kernel32/generated.c b/rostests/winetests/kernel32/generated.c index be68a085936..36053b84916 100644 --- a/rostests/winetests/kernel32/generated.c +++ b/rostests/winetests/kernel32/generated.c @@ -51,47 +51,37 @@ * Test helper macros */ -#ifdef _WIN64 +#define TEST_TYPE_SIZE(type, size) C_ASSERT(sizeof(type) == size); -# define TEST_TYPE_SIZE(type, size) +#ifdef TYPE_ALIGNMENT +# define TEST_TYPE_ALIGN(type, align) C_ASSERT(TYPE_ALIGNMENT(type) == align); +#else # define TEST_TYPE_ALIGN(type, align) +#endif + +#ifdef _TYPE_ALIGNMENT +# define TEST_TARGET_ALIGN(type, align) C_ASSERT(_TYPE_ALIGNMENT(*(type)0) == align); +# define TEST_FIELD_ALIGN(type, field, align) C_ASSERT(_TYPE_ALIGNMENT(((type*)0)->field) == align); +#else # define TEST_TARGET_ALIGN(type, align) # define TEST_FIELD_ALIGN(type, field, align) -# define TEST_FIELD_OFFSET(type, field, offset) - -#else - -# define TEST_TYPE_SIZE(type, size) C_ASSERT(sizeof(type) == size); - -# ifdef TYPE_ALIGNMENT -# define TEST_TYPE_ALIGN(type, align) C_ASSERT(TYPE_ALIGNMENT(type) == align); -# else -# define TEST_TYPE_ALIGN(type, align) -# endif - -# ifdef _TYPE_ALIGNMENT -# define TEST_TARGET_ALIGN(type, align) C_ASSERT(_TYPE_ALIGNMENT(*(type)0) == align); -# define TEST_FIELD_ALIGN(type, field, align) C_ASSERT(_TYPE_ALIGNMENT(((type*)0)->field) == align); -# else -# define TEST_TARGET_ALIGN(type, align) -# define TEST_FIELD_ALIGN(type, field, align) -# endif - -# define TEST_FIELD_OFFSET(type, field, offset) C_ASSERT(FIELD_OFFSET(type, field) == offset); - #endif +#define TEST_FIELD_OFFSET(type, field, offset) C_ASSERT(FIELD_OFFSET(type, field) == offset); + #define TEST_TARGET_SIZE(type, size) TEST_TYPE_SIZE(*(type)0, size) #define TEST_FIELD_SIZE(type, field, size) TEST_TYPE_SIZE((((type*)0)->field), size) #define TEST_TYPE_SIGNED(type) C_ASSERT((type) -1 < 0); #define TEST_TYPE_UNSIGNED(type) C_ASSERT((type) -1 > 0); +#ifdef _WIN64 + static void test_pack_LPOSVERSIONINFOA(void) { /* LPOSVERSIONINFOA */ - TEST_TYPE_SIZE (LPOSVERSIONINFOA, 4) - TEST_TYPE_ALIGN (LPOSVERSIONINFOA, 4) + TEST_TYPE_SIZE (LPOSVERSIONINFOA, 8) + TEST_TYPE_ALIGN (LPOSVERSIONINFOA, 8) TEST_TARGET_SIZE (LPOSVERSIONINFOA, 148) TEST_TARGET_ALIGN(LPOSVERSIONINFOA, 4) } @@ -99,8 +89,8 @@ static void test_pack_LPOSVERSIONINFOA(void) static void test_pack_LPOSVERSIONINFOEXA(void) { /* LPOSVERSIONINFOEXA */ - TEST_TYPE_SIZE (LPOSVERSIONINFOEXA, 4) - TEST_TYPE_ALIGN (LPOSVERSIONINFOEXA, 4) + TEST_TYPE_SIZE (LPOSVERSIONINFOEXA, 8) + TEST_TYPE_ALIGN (LPOSVERSIONINFOEXA, 8) TEST_TARGET_SIZE (LPOSVERSIONINFOEXA, 156) TEST_TARGET_ALIGN(LPOSVERSIONINFOEXA, 4) } @@ -108,8 +98,8 @@ static void test_pack_LPOSVERSIONINFOEXA(void) static void test_pack_LPOSVERSIONINFOEXW(void) { /* LPOSVERSIONINFOEXW */ - TEST_TYPE_SIZE (LPOSVERSIONINFOEXW, 4) - TEST_TYPE_ALIGN (LPOSVERSIONINFOEXW, 4) + TEST_TYPE_SIZE (LPOSVERSIONINFOEXW, 8) + TEST_TYPE_ALIGN (LPOSVERSIONINFOEXW, 8) TEST_TARGET_SIZE (LPOSVERSIONINFOEXW, 284) TEST_TARGET_ALIGN(LPOSVERSIONINFOEXW, 4) } @@ -117,15 +107,15 @@ static void test_pack_LPOSVERSIONINFOEXW(void) static void test_pack_LPOSVERSIONINFOW(void) { /* LPOSVERSIONINFOW */ - TEST_TYPE_SIZE (LPOSVERSIONINFOW, 4) - TEST_TYPE_ALIGN (LPOSVERSIONINFOW, 4) + TEST_TYPE_SIZE (LPOSVERSIONINFOW, 8) + TEST_TYPE_ALIGN (LPOSVERSIONINFOW, 8) TEST_TARGET_SIZE (LPOSVERSIONINFOW, 276) TEST_TARGET_ALIGN(LPOSVERSIONINFOW, 4) } static void test_pack_OSVERSIONINFOA(void) { - /* OSVERSIONINFOA (pack 4) */ + /* OSVERSIONINFOA */ TEST_TYPE_SIZE (OSVERSIONINFOA, 148) TEST_TYPE_ALIGN (OSVERSIONINFOA, 4) TEST_FIELD_SIZE (OSVERSIONINFOA, dwOSVersionInfoSize, 4) @@ -150,7 +140,7 @@ static void test_pack_OSVERSIONINFOA(void) static void test_pack_OSVERSIONINFOEXA(void) { - /* OSVERSIONINFOEXA (pack 4) */ + /* OSVERSIONINFOEXA */ TEST_TYPE_SIZE (OSVERSIONINFOEXA, 156) TEST_TYPE_ALIGN (OSVERSIONINFOEXA, 4) TEST_FIELD_SIZE (OSVERSIONINFOEXA, dwOSVersionInfoSize, 4) @@ -190,7 +180,7 @@ static void test_pack_OSVERSIONINFOEXA(void) static void test_pack_OSVERSIONINFOEXW(void) { - /* OSVERSIONINFOEXW (pack 4) */ + /* OSVERSIONINFOEXW */ TEST_TYPE_SIZE (OSVERSIONINFOEXW, 284) TEST_TYPE_ALIGN (OSVERSIONINFOEXW, 4) TEST_FIELD_SIZE (OSVERSIONINFOEXW, dwOSVersionInfoSize, 4) @@ -230,7 +220,1864 @@ static void test_pack_OSVERSIONINFOEXW(void) static void test_pack_OSVERSIONINFOW(void) { - /* OSVERSIONINFOW (pack 4) */ + /* OSVERSIONINFOW */ + TEST_TYPE_SIZE (OSVERSIONINFOW, 276) + TEST_TYPE_ALIGN (OSVERSIONINFOW, 4) + TEST_FIELD_SIZE (OSVERSIONINFOW, dwOSVersionInfoSize, 4) + TEST_FIELD_ALIGN (OSVERSIONINFOW, dwOSVersionInfoSize, 4) + TEST_FIELD_OFFSET(OSVERSIONINFOW, dwOSVersionInfoSize, 0) + TEST_FIELD_SIZE (OSVERSIONINFOW, dwMajorVersion, 4) + TEST_FIELD_ALIGN (OSVERSIONINFOW, dwMajorVersion, 4) + TEST_FIELD_OFFSET(OSVERSIONINFOW, dwMajorVersion, 4) + TEST_FIELD_SIZE (OSVERSIONINFOW, dwMinorVersion, 4) + TEST_FIELD_ALIGN (OSVERSIONINFOW, dwMinorVersion, 4) + TEST_FIELD_OFFSET(OSVERSIONINFOW, dwMinorVersion, 8) + TEST_FIELD_SIZE (OSVERSIONINFOW, dwBuildNumber, 4) + TEST_FIELD_ALIGN (OSVERSIONINFOW, dwBuildNumber, 4) + TEST_FIELD_OFFSET(OSVERSIONINFOW, dwBuildNumber, 12) + TEST_FIELD_SIZE (OSVERSIONINFOW, dwPlatformId, 4) + TEST_FIELD_ALIGN (OSVERSIONINFOW, dwPlatformId, 4) + TEST_FIELD_OFFSET(OSVERSIONINFOW, dwPlatformId, 16) + TEST_FIELD_SIZE (OSVERSIONINFOW, szCSDVersion, 256) + TEST_FIELD_ALIGN (OSVERSIONINFOW, szCSDVersion, 2) + TEST_FIELD_OFFSET(OSVERSIONINFOW, szCSDVersion, 20) +} + +static void test_pack_POSVERSIONINFOA(void) +{ + /* POSVERSIONINFOA */ + TEST_TYPE_SIZE (POSVERSIONINFOA, 8) + TEST_TYPE_ALIGN (POSVERSIONINFOA, 8) + TEST_TARGET_SIZE (POSVERSIONINFOA, 148) + TEST_TARGET_ALIGN(POSVERSIONINFOA, 4) +} + +static void test_pack_POSVERSIONINFOEXA(void) +{ + /* POSVERSIONINFOEXA */ + TEST_TYPE_SIZE (POSVERSIONINFOEXA, 8) + TEST_TYPE_ALIGN (POSVERSIONINFOEXA, 8) + TEST_TARGET_SIZE (POSVERSIONINFOEXA, 156) + TEST_TARGET_ALIGN(POSVERSIONINFOEXA, 4) +} + +static void test_pack_POSVERSIONINFOEXW(void) +{ + /* POSVERSIONINFOEXW */ + TEST_TYPE_SIZE (POSVERSIONINFOEXW, 8) + TEST_TYPE_ALIGN (POSVERSIONINFOEXW, 8) + TEST_TARGET_SIZE (POSVERSIONINFOEXW, 284) + TEST_TARGET_ALIGN(POSVERSIONINFOEXW, 4) +} + +static void test_pack_POSVERSIONINFOW(void) +{ + /* POSVERSIONINFOW */ + TEST_TYPE_SIZE (POSVERSIONINFOW, 8) + TEST_TYPE_ALIGN (POSVERSIONINFOW, 8) + TEST_TARGET_SIZE (POSVERSIONINFOW, 276) + TEST_TARGET_ALIGN(POSVERSIONINFOW, 4) +} + +static void test_pack_LPLONG(void) +{ + /* LPLONG */ + TEST_TYPE_SIZE (LPLONG, 8) + TEST_TYPE_ALIGN (LPLONG, 8) +} + +static void test_pack_LPVOID(void) +{ + /* LPVOID */ + TEST_TYPE_SIZE (LPVOID, 8) + TEST_TYPE_ALIGN (LPVOID, 8) +} + +static void test_pack_PHKEY(void) +{ + /* PHKEY */ + TEST_TYPE_SIZE (PHKEY, 8) + TEST_TYPE_ALIGN (PHKEY, 8) +} + +static void test_pack_ACTCTXA(void) +{ + /* ACTCTXA */ + TEST_TYPE_SIZE (ACTCTXA, 56) + TEST_TYPE_ALIGN (ACTCTXA, 8) + TEST_FIELD_SIZE (ACTCTXA, cbSize, 4) + TEST_FIELD_ALIGN (ACTCTXA, cbSize, 4) + TEST_FIELD_OFFSET(ACTCTXA, cbSize, 0) + TEST_FIELD_SIZE (ACTCTXA, dwFlags, 4) + TEST_FIELD_ALIGN (ACTCTXA, dwFlags, 4) + TEST_FIELD_OFFSET(ACTCTXA, dwFlags, 4) + TEST_FIELD_SIZE (ACTCTXA, lpSource, 8) + TEST_FIELD_ALIGN (ACTCTXA, lpSource, 8) + TEST_FIELD_OFFSET(ACTCTXA, lpSource, 8) + TEST_FIELD_SIZE (ACTCTXA, wProcessorArchitecture, 2) + TEST_FIELD_ALIGN (ACTCTXA, wProcessorArchitecture, 2) + TEST_FIELD_OFFSET(ACTCTXA, wProcessorArchitecture, 16) + TEST_FIELD_SIZE (ACTCTXA, wLangId, 2) + TEST_FIELD_ALIGN (ACTCTXA, wLangId, 2) + TEST_FIELD_OFFSET(ACTCTXA, wLangId, 18) + TEST_FIELD_SIZE (ACTCTXA, lpAssemblyDirectory, 8) + TEST_FIELD_ALIGN (ACTCTXA, lpAssemblyDirectory, 8) + TEST_FIELD_OFFSET(ACTCTXA, lpAssemblyDirectory, 24) + TEST_FIELD_SIZE (ACTCTXA, lpResourceName, 8) + TEST_FIELD_ALIGN (ACTCTXA, lpResourceName, 8) + TEST_FIELD_OFFSET(ACTCTXA, lpResourceName, 32) + TEST_FIELD_SIZE (ACTCTXA, lpApplicationName, 8) + TEST_FIELD_ALIGN (ACTCTXA, lpApplicationName, 8) + TEST_FIELD_OFFSET(ACTCTXA, lpApplicationName, 40) + TEST_FIELD_SIZE (ACTCTXA, hModule, 8) + TEST_FIELD_ALIGN (ACTCTXA, hModule, 8) + TEST_FIELD_OFFSET(ACTCTXA, hModule, 48) +} + +static void test_pack_ACTCTXW(void) +{ + /* ACTCTXW */ + TEST_TYPE_SIZE (ACTCTXW, 56) + TEST_TYPE_ALIGN (ACTCTXW, 8) + TEST_FIELD_SIZE (ACTCTXW, cbSize, 4) + TEST_FIELD_ALIGN (ACTCTXW, cbSize, 4) + TEST_FIELD_OFFSET(ACTCTXW, cbSize, 0) + TEST_FIELD_SIZE (ACTCTXW, dwFlags, 4) + TEST_FIELD_ALIGN (ACTCTXW, dwFlags, 4) + TEST_FIELD_OFFSET(ACTCTXW, dwFlags, 4) + TEST_FIELD_SIZE (ACTCTXW, lpSource, 8) + TEST_FIELD_ALIGN (ACTCTXW, lpSource, 8) + TEST_FIELD_OFFSET(ACTCTXW, lpSource, 8) + TEST_FIELD_SIZE (ACTCTXW, wProcessorArchitecture, 2) + TEST_FIELD_ALIGN (ACTCTXW, wProcessorArchitecture, 2) + TEST_FIELD_OFFSET(ACTCTXW, wProcessorArchitecture, 16) + TEST_FIELD_SIZE (ACTCTXW, wLangId, 2) + TEST_FIELD_ALIGN (ACTCTXW, wLangId, 2) + TEST_FIELD_OFFSET(ACTCTXW, wLangId, 18) + TEST_FIELD_SIZE (ACTCTXW, lpAssemblyDirectory, 8) + TEST_FIELD_ALIGN (ACTCTXW, lpAssemblyDirectory, 8) + TEST_FIELD_OFFSET(ACTCTXW, lpAssemblyDirectory, 24) + TEST_FIELD_SIZE (ACTCTXW, lpResourceName, 8) + TEST_FIELD_ALIGN (ACTCTXW, lpResourceName, 8) + TEST_FIELD_OFFSET(ACTCTXW, lpResourceName, 32) + TEST_FIELD_SIZE (ACTCTXW, lpApplicationName, 8) + TEST_FIELD_ALIGN (ACTCTXW, lpApplicationName, 8) + TEST_FIELD_OFFSET(ACTCTXW, lpApplicationName, 40) + TEST_FIELD_SIZE (ACTCTXW, hModule, 8) + TEST_FIELD_ALIGN (ACTCTXW, hModule, 8) + TEST_FIELD_OFFSET(ACTCTXW, hModule, 48) +} + +static void test_pack_ACTCTX_SECTION_KEYED_DATA(void) +{ + /* ACTCTX_SECTION_KEYED_DATA */ + TEST_TYPE_SIZE (ACTCTX_SECTION_KEYED_DATA, 112) + TEST_TYPE_ALIGN (ACTCTX_SECTION_KEYED_DATA, 8) + TEST_FIELD_SIZE (ACTCTX_SECTION_KEYED_DATA, cbSize, 4) + TEST_FIELD_ALIGN (ACTCTX_SECTION_KEYED_DATA, cbSize, 4) + TEST_FIELD_OFFSET(ACTCTX_SECTION_KEYED_DATA, cbSize, 0) + TEST_FIELD_SIZE (ACTCTX_SECTION_KEYED_DATA, ulDataFormatVersion, 4) + TEST_FIELD_ALIGN (ACTCTX_SECTION_KEYED_DATA, ulDataFormatVersion, 4) + TEST_FIELD_OFFSET(ACTCTX_SECTION_KEYED_DATA, ulDataFormatVersion, 4) + TEST_FIELD_SIZE (ACTCTX_SECTION_KEYED_DATA, lpData, 8) + TEST_FIELD_ALIGN (ACTCTX_SECTION_KEYED_DATA, lpData, 8) + TEST_FIELD_OFFSET(ACTCTX_SECTION_KEYED_DATA, lpData, 8) + TEST_FIELD_SIZE (ACTCTX_SECTION_KEYED_DATA, ulLength, 4) + TEST_FIELD_ALIGN (ACTCTX_SECTION_KEYED_DATA, ulLength, 4) + TEST_FIELD_OFFSET(ACTCTX_SECTION_KEYED_DATA, ulLength, 16) + TEST_FIELD_SIZE (ACTCTX_SECTION_KEYED_DATA, lpSectionGlobalData, 8) + TEST_FIELD_ALIGN (ACTCTX_SECTION_KEYED_DATA, lpSectionGlobalData, 8) + TEST_FIELD_OFFSET(ACTCTX_SECTION_KEYED_DATA, lpSectionGlobalData, 24) + TEST_FIELD_SIZE (ACTCTX_SECTION_KEYED_DATA, ulSectionGlobalDataLength, 4) + TEST_FIELD_ALIGN (ACTCTX_SECTION_KEYED_DATA, ulSectionGlobalDataLength, 4) + TEST_FIELD_OFFSET(ACTCTX_SECTION_KEYED_DATA, ulSectionGlobalDataLength, 32) + TEST_FIELD_SIZE (ACTCTX_SECTION_KEYED_DATA, lpSectionBase, 8) + TEST_FIELD_ALIGN (ACTCTX_SECTION_KEYED_DATA, lpSectionBase, 8) + TEST_FIELD_OFFSET(ACTCTX_SECTION_KEYED_DATA, lpSectionBase, 40) + TEST_FIELD_SIZE (ACTCTX_SECTION_KEYED_DATA, ulSectionTotalLength, 4) + TEST_FIELD_ALIGN (ACTCTX_SECTION_KEYED_DATA, ulSectionTotalLength, 4) + TEST_FIELD_OFFSET(ACTCTX_SECTION_KEYED_DATA, ulSectionTotalLength, 48) + TEST_FIELD_SIZE (ACTCTX_SECTION_KEYED_DATA, hActCtx, 8) + TEST_FIELD_ALIGN (ACTCTX_SECTION_KEYED_DATA, hActCtx, 8) + TEST_FIELD_OFFSET(ACTCTX_SECTION_KEYED_DATA, hActCtx, 56) + TEST_FIELD_SIZE (ACTCTX_SECTION_KEYED_DATA, ulAssemblyRosterIndex, 4) + TEST_FIELD_ALIGN (ACTCTX_SECTION_KEYED_DATA, ulAssemblyRosterIndex, 4) + TEST_FIELD_OFFSET(ACTCTX_SECTION_KEYED_DATA, ulAssemblyRosterIndex, 64) + TEST_FIELD_SIZE (ACTCTX_SECTION_KEYED_DATA, ulFlags, 4) + TEST_FIELD_ALIGN (ACTCTX_SECTION_KEYED_DATA, ulFlags, 4) + TEST_FIELD_OFFSET(ACTCTX_SECTION_KEYED_DATA, ulFlags, 68) + TEST_FIELD_SIZE (ACTCTX_SECTION_KEYED_DATA, AssemblyMetadata, 40) + TEST_FIELD_ALIGN (ACTCTX_SECTION_KEYED_DATA, AssemblyMetadata, 8) + TEST_FIELD_OFFSET(ACTCTX_SECTION_KEYED_DATA, AssemblyMetadata, 72) +} + +static void test_pack_ACTCTX_SECTION_KEYED_DATA_2600(void) +{ + /* ACTCTX_SECTION_KEYED_DATA_2600 */ + TEST_TYPE_SIZE (ACTCTX_SECTION_KEYED_DATA_2600, 72) + TEST_TYPE_ALIGN (ACTCTX_SECTION_KEYED_DATA_2600, 8) + TEST_FIELD_SIZE (ACTCTX_SECTION_KEYED_DATA_2600, cbSize, 4) + TEST_FIELD_ALIGN (ACTCTX_SECTION_KEYED_DATA_2600, cbSize, 4) + TEST_FIELD_OFFSET(ACTCTX_SECTION_KEYED_DATA_2600, cbSize, 0) + TEST_FIELD_SIZE (ACTCTX_SECTION_KEYED_DATA_2600, ulDataFormatVersion, 4) + TEST_FIELD_ALIGN (ACTCTX_SECTION_KEYED_DATA_2600, ulDataFormatVersion, 4) + TEST_FIELD_OFFSET(ACTCTX_SECTION_KEYED_DATA_2600, ulDataFormatVersion, 4) + TEST_FIELD_SIZE (ACTCTX_SECTION_KEYED_DATA_2600, lpData, 8) + TEST_FIELD_ALIGN (ACTCTX_SECTION_KEYED_DATA_2600, lpData, 8) + TEST_FIELD_OFFSET(ACTCTX_SECTION_KEYED_DATA_2600, lpData, 8) + TEST_FIELD_SIZE (ACTCTX_SECTION_KEYED_DATA_2600, ulLength, 4) + TEST_FIELD_ALIGN (ACTCTX_SECTION_KEYED_DATA_2600, ulLength, 4) + TEST_FIELD_OFFSET(ACTCTX_SECTION_KEYED_DATA_2600, ulLength, 16) + TEST_FIELD_SIZE (ACTCTX_SECTION_KEYED_DATA_2600, lpSectionGlobalData, 8) + TEST_FIELD_ALIGN (ACTCTX_SECTION_KEYED_DATA_2600, lpSectionGlobalData, 8) + TEST_FIELD_OFFSET(ACTCTX_SECTION_KEYED_DATA_2600, lpSectionGlobalData, 24) + TEST_FIELD_SIZE (ACTCTX_SECTION_KEYED_DATA_2600, ulSectionGlobalDataLength, 4) + TEST_FIELD_ALIGN (ACTCTX_SECTION_KEYED_DATA_2600, ulSectionGlobalDataLength, 4) + TEST_FIELD_OFFSET(ACTCTX_SECTION_KEYED_DATA_2600, ulSectionGlobalDataLength, 32) + TEST_FIELD_SIZE (ACTCTX_SECTION_KEYED_DATA_2600, lpSectionBase, 8) + TEST_FIELD_ALIGN (ACTCTX_SECTION_KEYED_DATA_2600, lpSectionBase, 8) + TEST_FIELD_OFFSET(ACTCTX_SECTION_KEYED_DATA_2600, lpSectionBase, 40) + TEST_FIELD_SIZE (ACTCTX_SECTION_KEYED_DATA_2600, ulSectionTotalLength, 4) + TEST_FIELD_ALIGN (ACTCTX_SECTION_KEYED_DATA_2600, ulSectionTotalLength, 4) + TEST_FIELD_OFFSET(ACTCTX_SECTION_KEYED_DATA_2600, ulSectionTotalLength, 48) + TEST_FIELD_SIZE (ACTCTX_SECTION_KEYED_DATA_2600, hActCtx, 8) + TEST_FIELD_ALIGN (ACTCTX_SECTION_KEYED_DATA_2600, hActCtx, 8) + TEST_FIELD_OFFSET(ACTCTX_SECTION_KEYED_DATA_2600, hActCtx, 56) + TEST_FIELD_SIZE (ACTCTX_SECTION_KEYED_DATA_2600, ulAssemblyRosterIndex, 4) + TEST_FIELD_ALIGN (ACTCTX_SECTION_KEYED_DATA_2600, ulAssemblyRosterIndex, 4) + TEST_FIELD_OFFSET(ACTCTX_SECTION_KEYED_DATA_2600, ulAssemblyRosterIndex, 64) +} + +static void test_pack_ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA(void) +{ + /* ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA */ + TEST_TYPE_SIZE (ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA, 40) + TEST_TYPE_ALIGN (ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA, 8) + TEST_FIELD_SIZE (ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA, lpInformation, 8) + TEST_FIELD_ALIGN (ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA, lpInformation, 8) + TEST_FIELD_OFFSET(ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA, lpInformation, 0) + TEST_FIELD_SIZE (ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA, lpSectionBase, 8) + TEST_FIELD_ALIGN (ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA, lpSectionBase, 8) + TEST_FIELD_OFFSET(ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA, lpSectionBase, 8) + TEST_FIELD_SIZE (ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA, ulSectionLength, 4) + TEST_FIELD_ALIGN (ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA, ulSectionLength, 4) + TEST_FIELD_OFFSET(ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA, ulSectionLength, 16) + TEST_FIELD_SIZE (ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA, lpSectionGlobalDataBase, 8) + TEST_FIELD_ALIGN (ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA, lpSectionGlobalDataBase, 8) + TEST_FIELD_OFFSET(ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA, lpSectionGlobalDataBase, 24) + TEST_FIELD_SIZE (ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA, ulSectionGlobalDataLength, 4) + TEST_FIELD_ALIGN (ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA, ulSectionGlobalDataLength, 4) + TEST_FIELD_OFFSET(ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA, ulSectionGlobalDataLength, 32) +} + +static void test_pack_ACTIVATION_CONTEXT_BASIC_INFORMATION(void) +{ + /* ACTIVATION_CONTEXT_BASIC_INFORMATION */ + TEST_TYPE_SIZE (ACTIVATION_CONTEXT_BASIC_INFORMATION, 16) + TEST_TYPE_ALIGN (ACTIVATION_CONTEXT_BASIC_INFORMATION, 8) + TEST_FIELD_SIZE (ACTIVATION_CONTEXT_BASIC_INFORMATION, hActCtx, 8) + TEST_FIELD_ALIGN (ACTIVATION_CONTEXT_BASIC_INFORMATION, hActCtx, 8) + TEST_FIELD_OFFSET(ACTIVATION_CONTEXT_BASIC_INFORMATION, hActCtx, 0) + TEST_FIELD_SIZE (ACTIVATION_CONTEXT_BASIC_INFORMATION, dwFlags, 4) + TEST_FIELD_ALIGN (ACTIVATION_CONTEXT_BASIC_INFORMATION, dwFlags, 4) + TEST_FIELD_OFFSET(ACTIVATION_CONTEXT_BASIC_INFORMATION, dwFlags, 8) +} + +static void test_pack_BY_HANDLE_FILE_INFORMATION(void) +{ + /* BY_HANDLE_FILE_INFORMATION */ + TEST_TYPE_SIZE (BY_HANDLE_FILE_INFORMATION, 52) + TEST_TYPE_ALIGN (BY_HANDLE_FILE_INFORMATION, 4) + TEST_FIELD_SIZE (BY_HANDLE_FILE_INFORMATION, dwFileAttributes, 4) + TEST_FIELD_ALIGN (BY_HANDLE_FILE_INFORMATION, dwFileAttributes, 4) + TEST_FIELD_OFFSET(BY_HANDLE_FILE_INFORMATION, dwFileAttributes, 0) + TEST_FIELD_SIZE (BY_HANDLE_FILE_INFORMATION, ftCreationTime, 8) + TEST_FIELD_ALIGN (BY_HANDLE_FILE_INFORMATION, ftCreationTime, 4) + TEST_FIELD_OFFSET(BY_HANDLE_FILE_INFORMATION, ftCreationTime, 4) + TEST_FIELD_SIZE (BY_HANDLE_FILE_INFORMATION, ftLastAccessTime, 8) + TEST_FIELD_ALIGN (BY_HANDLE_FILE_INFORMATION, ftLastAccessTime, 4) + TEST_FIELD_OFFSET(BY_HANDLE_FILE_INFORMATION, ftLastAccessTime, 12) + TEST_FIELD_SIZE (BY_HANDLE_FILE_INFORMATION, ftLastWriteTime, 8) + TEST_FIELD_ALIGN (BY_HANDLE_FILE_INFORMATION, ftLastWriteTime, 4) + TEST_FIELD_OFFSET(BY_HANDLE_FILE_INFORMATION, ftLastWriteTime, 20) + TEST_FIELD_SIZE (BY_HANDLE_FILE_INFORMATION, dwVolumeSerialNumber, 4) + TEST_FIELD_ALIGN (BY_HANDLE_FILE_INFORMATION, dwVolumeSerialNumber, 4) + TEST_FIELD_OFFSET(BY_HANDLE_FILE_INFORMATION, dwVolumeSerialNumber, 28) + TEST_FIELD_SIZE (BY_HANDLE_FILE_INFORMATION, nFileSizeHigh, 4) + TEST_FIELD_ALIGN (BY_HANDLE_FILE_INFORMATION, nFileSizeHigh, 4) + TEST_FIELD_OFFSET(BY_HANDLE_FILE_INFORMATION, nFileSizeHigh, 32) + TEST_FIELD_SIZE (BY_HANDLE_FILE_INFORMATION, nFileSizeLow, 4) + TEST_FIELD_ALIGN (BY_HANDLE_FILE_INFORMATION, nFileSizeLow, 4) + TEST_FIELD_OFFSET(BY_HANDLE_FILE_INFORMATION, nFileSizeLow, 36) + TEST_FIELD_SIZE (BY_HANDLE_FILE_INFORMATION, nNumberOfLinks, 4) + TEST_FIELD_ALIGN (BY_HANDLE_FILE_INFORMATION, nNumberOfLinks, 4) + TEST_FIELD_OFFSET(BY_HANDLE_FILE_INFORMATION, nNumberOfLinks, 40) + TEST_FIELD_SIZE (BY_HANDLE_FILE_INFORMATION, nFileIndexHigh, 4) + TEST_FIELD_ALIGN (BY_HANDLE_FILE_INFORMATION, nFileIndexHigh, 4) + TEST_FIELD_OFFSET(BY_HANDLE_FILE_INFORMATION, nFileIndexHigh, 44) + TEST_FIELD_SIZE (BY_HANDLE_FILE_INFORMATION, nFileIndexLow, 4) + TEST_FIELD_ALIGN (BY_HANDLE_FILE_INFORMATION, nFileIndexLow, 4) + TEST_FIELD_OFFSET(BY_HANDLE_FILE_INFORMATION, nFileIndexLow, 48) +} + +static void test_pack_COMMCONFIG(void) +{ + /* COMMCONFIG */ + TEST_TYPE_SIZE (COMMCONFIG, 52) + TEST_TYPE_ALIGN (COMMCONFIG, 4) + TEST_FIELD_SIZE (COMMCONFIG, dwSize, 4) + TEST_FIELD_ALIGN (COMMCONFIG, dwSize, 4) + TEST_FIELD_OFFSET(COMMCONFIG, dwSize, 0) + TEST_FIELD_SIZE (COMMCONFIG, wVersion, 2) + TEST_FIELD_ALIGN (COMMCONFIG, wVersion, 2) + TEST_FIELD_OFFSET(COMMCONFIG, wVersion, 4) + TEST_FIELD_SIZE (COMMCONFIG, wReserved, 2) + TEST_FIELD_ALIGN (COMMCONFIG, wReserved, 2) + TEST_FIELD_OFFSET(COMMCONFIG, wReserved, 6) + TEST_FIELD_SIZE (COMMCONFIG, dcb, 28) + TEST_FIELD_ALIGN (COMMCONFIG, dcb, 4) + TEST_FIELD_OFFSET(COMMCONFIG, dcb, 8) + TEST_FIELD_SIZE (COMMCONFIG, dwProviderSubType, 4) + TEST_FIELD_ALIGN (COMMCONFIG, dwProviderSubType, 4) + TEST_FIELD_OFFSET(COMMCONFIG, dwProviderSubType, 36) + TEST_FIELD_SIZE (COMMCONFIG, dwProviderOffset, 4) + TEST_FIELD_ALIGN (COMMCONFIG, dwProviderOffset, 4) + TEST_FIELD_OFFSET(COMMCONFIG, dwProviderOffset, 40) + TEST_FIELD_SIZE (COMMCONFIG, dwProviderSize, 4) + TEST_FIELD_ALIGN (COMMCONFIG, dwProviderSize, 4) + TEST_FIELD_OFFSET(COMMCONFIG, dwProviderSize, 44) + TEST_FIELD_SIZE (COMMCONFIG, wcProviderData, 4) + TEST_FIELD_ALIGN (COMMCONFIG, wcProviderData, 4) + TEST_FIELD_OFFSET(COMMCONFIG, wcProviderData, 48) +} + +static void test_pack_COMMPROP(void) +{ + /* COMMPROP */ + TEST_TYPE_SIZE (COMMPROP, 64) + TEST_TYPE_ALIGN (COMMPROP, 4) + TEST_FIELD_SIZE (COMMPROP, wPacketLength, 2) + TEST_FIELD_ALIGN (COMMPROP, wPacketLength, 2) + TEST_FIELD_OFFSET(COMMPROP, wPacketLength, 0) + TEST_FIELD_SIZE (COMMPROP, wPacketVersion, 2) + TEST_FIELD_ALIGN (COMMPROP, wPacketVersion, 2) + TEST_FIELD_OFFSET(COMMPROP, wPacketVersion, 2) + TEST_FIELD_SIZE (COMMPROP, dwServiceMask, 4) + TEST_FIELD_ALIGN (COMMPROP, dwServiceMask, 4) + TEST_FIELD_OFFSET(COMMPROP, dwServiceMask, 4) + TEST_FIELD_SIZE (COMMPROP, dwReserved1, 4) + TEST_FIELD_ALIGN (COMMPROP, dwReserved1, 4) + TEST_FIELD_OFFSET(COMMPROP, dwReserved1, 8) + TEST_FIELD_SIZE (COMMPROP, dwMaxTxQueue, 4) + TEST_FIELD_ALIGN (COMMPROP, dwMaxTxQueue, 4) + TEST_FIELD_OFFSET(COMMPROP, dwMaxTxQueue, 12) + TEST_FIELD_SIZE (COMMPROP, dwMaxRxQueue, 4) + TEST_FIELD_ALIGN (COMMPROP, dwMaxRxQueue, 4) + TEST_FIELD_OFFSET(COMMPROP, dwMaxRxQueue, 16) + TEST_FIELD_SIZE (COMMPROP, dwMaxBaud, 4) + TEST_FIELD_ALIGN (COMMPROP, dwMaxBaud, 4) + TEST_FIELD_OFFSET(COMMPROP, dwMaxBaud, 20) + TEST_FIELD_SIZE (COMMPROP, dwProvSubType, 4) + TEST_FIELD_ALIGN (COMMPROP, dwProvSubType, 4) + TEST_FIELD_OFFSET(COMMPROP, dwProvSubType, 24) + TEST_FIELD_SIZE (COMMPROP, dwProvCapabilities, 4) + TEST_FIELD_ALIGN (COMMPROP, dwProvCapabilities, 4) + TEST_FIELD_OFFSET(COMMPROP, dwProvCapabilities, 28) + TEST_FIELD_SIZE (COMMPROP, dwSettableParams, 4) + TEST_FIELD_ALIGN (COMMPROP, dwSettableParams, 4) + TEST_FIELD_OFFSET(COMMPROP, dwSettableParams, 32) + TEST_FIELD_SIZE (COMMPROP, dwSettableBaud, 4) + TEST_FIELD_ALIGN (COMMPROP, dwSettableBaud, 4) + TEST_FIELD_OFFSET(COMMPROP, dwSettableBaud, 36) + TEST_FIELD_SIZE (COMMPROP, wSettableData, 2) + TEST_FIELD_ALIGN (COMMPROP, wSettableData, 2) + TEST_FIELD_OFFSET(COMMPROP, wSettableData, 40) + TEST_FIELD_SIZE (COMMPROP, wSettableStopParity, 2) + TEST_FIELD_ALIGN (COMMPROP, wSettableStopParity, 2) + TEST_FIELD_OFFSET(COMMPROP, wSettableStopParity, 42) + TEST_FIELD_SIZE (COMMPROP, dwCurrentTxQueue, 4) + TEST_FIELD_ALIGN (COMMPROP, dwCurrentTxQueue, 4) + TEST_FIELD_OFFSET(COMMPROP, dwCurrentTxQueue, 44) + TEST_FIELD_SIZE (COMMPROP, dwCurrentRxQueue, 4) + TEST_FIELD_ALIGN (COMMPROP, dwCurrentRxQueue, 4) + TEST_FIELD_OFFSET(COMMPROP, dwCurrentRxQueue, 48) + TEST_FIELD_SIZE (COMMPROP, dwProvSpec1, 4) + TEST_FIELD_ALIGN (COMMPROP, dwProvSpec1, 4) + TEST_FIELD_OFFSET(COMMPROP, dwProvSpec1, 52) + TEST_FIELD_SIZE (COMMPROP, dwProvSpec2, 4) + TEST_FIELD_ALIGN (COMMPROP, dwProvSpec2, 4) + TEST_FIELD_OFFSET(COMMPROP, dwProvSpec2, 56) + TEST_FIELD_SIZE (COMMPROP, wcProvChar, 2) + TEST_FIELD_ALIGN (COMMPROP, wcProvChar, 2) + TEST_FIELD_OFFSET(COMMPROP, wcProvChar, 60) +} + +static void test_pack_COMMTIMEOUTS(void) +{ + /* COMMTIMEOUTS */ + TEST_TYPE_SIZE (COMMTIMEOUTS, 20) + TEST_TYPE_ALIGN (COMMTIMEOUTS, 4) + TEST_FIELD_SIZE (COMMTIMEOUTS, ReadIntervalTimeout, 4) + TEST_FIELD_ALIGN (COMMTIMEOUTS, ReadIntervalTimeout, 4) + TEST_FIELD_OFFSET(COMMTIMEOUTS, ReadIntervalTimeout, 0) + TEST_FIELD_SIZE (COMMTIMEOUTS, ReadTotalTimeoutMultiplier, 4) + TEST_FIELD_ALIGN (COMMTIMEOUTS, ReadTotalTimeoutMultiplier, 4) + TEST_FIELD_OFFSET(COMMTIMEOUTS, ReadTotalTimeoutMultiplier, 4) + TEST_FIELD_SIZE (COMMTIMEOUTS, ReadTotalTimeoutConstant, 4) + TEST_FIELD_ALIGN (COMMTIMEOUTS, ReadTotalTimeoutConstant, 4) + TEST_FIELD_OFFSET(COMMTIMEOUTS, ReadTotalTimeoutConstant, 8) + TEST_FIELD_SIZE (COMMTIMEOUTS, WriteTotalTimeoutMultiplier, 4) + TEST_FIELD_ALIGN (COMMTIMEOUTS, WriteTotalTimeoutMultiplier, 4) + TEST_FIELD_OFFSET(COMMTIMEOUTS, WriteTotalTimeoutMultiplier, 12) + TEST_FIELD_SIZE (COMMTIMEOUTS, WriteTotalTimeoutConstant, 4) + TEST_FIELD_ALIGN (COMMTIMEOUTS, WriteTotalTimeoutConstant, 4) + TEST_FIELD_OFFSET(COMMTIMEOUTS, WriteTotalTimeoutConstant, 16) +} + +static void test_pack_COMSTAT(void) +{ + /* COMSTAT */ + TEST_TYPE_SIZE (COMSTAT, 12) + TEST_TYPE_ALIGN (COMSTAT, 4) + TEST_FIELD_SIZE (COMSTAT, cbInQue, 4) + TEST_FIELD_ALIGN (COMSTAT, cbInQue, 4) + TEST_FIELD_OFFSET(COMSTAT, cbInQue, 4) + TEST_FIELD_SIZE (COMSTAT, cbOutQue, 4) + TEST_FIELD_ALIGN (COMSTAT, cbOutQue, 4) + TEST_FIELD_OFFSET(COMSTAT, cbOutQue, 8) +} + +static void test_pack_CREATE_PROCESS_DEBUG_INFO(void) +{ + /* CREATE_PROCESS_DEBUG_INFO */ + TEST_TYPE_SIZE (CREATE_PROCESS_DEBUG_INFO, 72) + TEST_TYPE_ALIGN (CREATE_PROCESS_DEBUG_INFO, 8) + TEST_FIELD_SIZE (CREATE_PROCESS_DEBUG_INFO, hFile, 8) + TEST_FIELD_ALIGN (CREATE_PROCESS_DEBUG_INFO, hFile, 8) + TEST_FIELD_OFFSET(CREATE_PROCESS_DEBUG_INFO, hFile, 0) + TEST_FIELD_SIZE (CREATE_PROCESS_DEBUG_INFO, hProcess, 8) + TEST_FIELD_ALIGN (CREATE_PROCESS_DEBUG_INFO, hProcess, 8) + TEST_FIELD_OFFSET(CREATE_PROCESS_DEBUG_INFO, hProcess, 8) + TEST_FIELD_SIZE (CREATE_PROCESS_DEBUG_INFO, hThread, 8) + TEST_FIELD_ALIGN (CREATE_PROCESS_DEBUG_INFO, hThread, 8) + TEST_FIELD_OFFSET(CREATE_PROCESS_DEBUG_INFO, hThread, 16) + TEST_FIELD_SIZE (CREATE_PROCESS_DEBUG_INFO, lpBaseOfImage, 8) + TEST_FIELD_ALIGN (CREATE_PROCESS_DEBUG_INFO, lpBaseOfImage, 8) + TEST_FIELD_OFFSET(CREATE_PROCESS_DEBUG_INFO, lpBaseOfImage, 24) + TEST_FIELD_SIZE (CREATE_PROCESS_DEBUG_INFO, dwDebugInfoFileOffset, 4) + TEST_FIELD_ALIGN (CREATE_PROCESS_DEBUG_INFO, dwDebugInfoFileOffset, 4) + TEST_FIELD_OFFSET(CREATE_PROCESS_DEBUG_INFO, dwDebugInfoFileOffset, 32) + TEST_FIELD_SIZE (CREATE_PROCESS_DEBUG_INFO, nDebugInfoSize, 4) + TEST_FIELD_ALIGN (CREATE_PROCESS_DEBUG_INFO, nDebugInfoSize, 4) + TEST_FIELD_OFFSET(CREATE_PROCESS_DEBUG_INFO, nDebugInfoSize, 36) + TEST_FIELD_SIZE (CREATE_PROCESS_DEBUG_INFO, lpThreadLocalBase, 8) + TEST_FIELD_ALIGN (CREATE_PROCESS_DEBUG_INFO, lpThreadLocalBase, 8) + TEST_FIELD_OFFSET(CREATE_PROCESS_DEBUG_INFO, lpThreadLocalBase, 40) + TEST_FIELD_SIZE (CREATE_PROCESS_DEBUG_INFO, lpStartAddress, 8) + TEST_FIELD_ALIGN (CREATE_PROCESS_DEBUG_INFO, lpStartAddress, 8) + TEST_FIELD_OFFSET(CREATE_PROCESS_DEBUG_INFO, lpStartAddress, 48) + TEST_FIELD_SIZE (CREATE_PROCESS_DEBUG_INFO, lpImageName, 8) + TEST_FIELD_ALIGN (CREATE_PROCESS_DEBUG_INFO, lpImageName, 8) + TEST_FIELD_OFFSET(CREATE_PROCESS_DEBUG_INFO, lpImageName, 56) + TEST_FIELD_SIZE (CREATE_PROCESS_DEBUG_INFO, fUnicode, 2) + TEST_FIELD_ALIGN (CREATE_PROCESS_DEBUG_INFO, fUnicode, 2) + TEST_FIELD_OFFSET(CREATE_PROCESS_DEBUG_INFO, fUnicode, 64) +} + +static void test_pack_CREATE_THREAD_DEBUG_INFO(void) +{ + /* CREATE_THREAD_DEBUG_INFO */ + TEST_TYPE_SIZE (CREATE_THREAD_DEBUG_INFO, 24) + TEST_TYPE_ALIGN (CREATE_THREAD_DEBUG_INFO, 8) + TEST_FIELD_SIZE (CREATE_THREAD_DEBUG_INFO, hThread, 8) + TEST_FIELD_ALIGN (CREATE_THREAD_DEBUG_INFO, hThread, 8) + TEST_FIELD_OFFSET(CREATE_THREAD_DEBUG_INFO, hThread, 0) + TEST_FIELD_SIZE (CREATE_THREAD_DEBUG_INFO, lpThreadLocalBase, 8) + TEST_FIELD_ALIGN (CREATE_THREAD_DEBUG_INFO, lpThreadLocalBase, 8) + TEST_FIELD_OFFSET(CREATE_THREAD_DEBUG_INFO, lpThreadLocalBase, 8) + TEST_FIELD_SIZE (CREATE_THREAD_DEBUG_INFO, lpStartAddress, 8) + TEST_FIELD_ALIGN (CREATE_THREAD_DEBUG_INFO, lpStartAddress, 8) + TEST_FIELD_OFFSET(CREATE_THREAD_DEBUG_INFO, lpStartAddress, 16) +} + +static void test_pack_CRITICAL_SECTION(void) +{ + /* CRITICAL_SECTION */ + TEST_TYPE_SIZE (CRITICAL_SECTION, 40) + TEST_TYPE_ALIGN (CRITICAL_SECTION, 8) +} + +static void test_pack_CRITICAL_SECTION_DEBUG(void) +{ + /* CRITICAL_SECTION_DEBUG */ +} + +static void test_pack_DCB(void) +{ + /* DCB */ + TEST_TYPE_SIZE (DCB, 28) + TEST_TYPE_ALIGN (DCB, 4) + TEST_FIELD_SIZE (DCB, DCBlength, 4) + TEST_FIELD_ALIGN (DCB, DCBlength, 4) + TEST_FIELD_OFFSET(DCB, DCBlength, 0) + TEST_FIELD_SIZE (DCB, BaudRate, 4) + TEST_FIELD_ALIGN (DCB, BaudRate, 4) + TEST_FIELD_OFFSET(DCB, BaudRate, 4) + TEST_FIELD_SIZE (DCB, wReserved, 2) + TEST_FIELD_ALIGN (DCB, wReserved, 2) + TEST_FIELD_OFFSET(DCB, wReserved, 12) + TEST_FIELD_SIZE (DCB, XonLim, 2) + TEST_FIELD_ALIGN (DCB, XonLim, 2) + TEST_FIELD_OFFSET(DCB, XonLim, 14) + TEST_FIELD_SIZE (DCB, XoffLim, 2) + TEST_FIELD_ALIGN (DCB, XoffLim, 2) + TEST_FIELD_OFFSET(DCB, XoffLim, 16) + TEST_FIELD_SIZE (DCB, ByteSize, 1) + TEST_FIELD_ALIGN (DCB, ByteSize, 1) + TEST_FIELD_OFFSET(DCB, ByteSize, 18) + TEST_FIELD_SIZE (DCB, Parity, 1) + TEST_FIELD_ALIGN (DCB, Parity, 1) + TEST_FIELD_OFFSET(DCB, Parity, 19) + TEST_FIELD_SIZE (DCB, StopBits, 1) + TEST_FIELD_ALIGN (DCB, StopBits, 1) + TEST_FIELD_OFFSET(DCB, StopBits, 20) + TEST_FIELD_SIZE (DCB, XonChar, 1) + TEST_FIELD_ALIGN (DCB, XonChar, 1) + TEST_FIELD_OFFSET(DCB, XonChar, 21) + TEST_FIELD_SIZE (DCB, XoffChar, 1) + TEST_FIELD_ALIGN (DCB, XoffChar, 1) + TEST_FIELD_OFFSET(DCB, XoffChar, 22) + TEST_FIELD_SIZE (DCB, ErrorChar, 1) + TEST_FIELD_ALIGN (DCB, ErrorChar, 1) + TEST_FIELD_OFFSET(DCB, ErrorChar, 23) + TEST_FIELD_SIZE (DCB, EofChar, 1) + TEST_FIELD_ALIGN (DCB, EofChar, 1) + TEST_FIELD_OFFSET(DCB, EofChar, 24) + TEST_FIELD_SIZE (DCB, EvtChar, 1) + TEST_FIELD_ALIGN (DCB, EvtChar, 1) + TEST_FIELD_OFFSET(DCB, EvtChar, 25) + TEST_FIELD_SIZE (DCB, wReserved1, 2) + TEST_FIELD_ALIGN (DCB, wReserved1, 2) + TEST_FIELD_OFFSET(DCB, wReserved1, 26) +} + +static void test_pack_DEBUG_EVENT(void) +{ + /* DEBUG_EVENT */ + TEST_FIELD_SIZE (DEBUG_EVENT, dwDebugEventCode, 4) + TEST_FIELD_ALIGN (DEBUG_EVENT, dwDebugEventCode, 4) + TEST_FIELD_OFFSET(DEBUG_EVENT, dwDebugEventCode, 0) + TEST_FIELD_SIZE (DEBUG_EVENT, dwProcessId, 4) + TEST_FIELD_ALIGN (DEBUG_EVENT, dwProcessId, 4) + TEST_FIELD_OFFSET(DEBUG_EVENT, dwProcessId, 4) + TEST_FIELD_SIZE (DEBUG_EVENT, dwThreadId, 4) + TEST_FIELD_ALIGN (DEBUG_EVENT, dwThreadId, 4) + TEST_FIELD_OFFSET(DEBUG_EVENT, dwThreadId, 8) +} + +static void test_pack_ENUMRESLANGPROCA(void) +{ + /* ENUMRESLANGPROCA */ + TEST_TYPE_SIZE (ENUMRESLANGPROCA, 8) + TEST_TYPE_ALIGN (ENUMRESLANGPROCA, 8) +} + +static void test_pack_ENUMRESLANGPROCW(void) +{ + /* ENUMRESLANGPROCW */ + TEST_TYPE_SIZE (ENUMRESLANGPROCW, 8) + TEST_TYPE_ALIGN (ENUMRESLANGPROCW, 8) +} + +static void test_pack_ENUMRESNAMEPROCA(void) +{ + /* ENUMRESNAMEPROCA */ + TEST_TYPE_SIZE (ENUMRESNAMEPROCA, 8) + TEST_TYPE_ALIGN (ENUMRESNAMEPROCA, 8) +} + +static void test_pack_ENUMRESNAMEPROCW(void) +{ + /* ENUMRESNAMEPROCW */ + TEST_TYPE_SIZE (ENUMRESNAMEPROCW, 8) + TEST_TYPE_ALIGN (ENUMRESNAMEPROCW, 8) +} + +static void test_pack_ENUMRESTYPEPROCA(void) +{ + /* ENUMRESTYPEPROCA */ + TEST_TYPE_SIZE (ENUMRESTYPEPROCA, 8) + TEST_TYPE_ALIGN (ENUMRESTYPEPROCA, 8) +} + +static void test_pack_ENUMRESTYPEPROCW(void) +{ + /* ENUMRESTYPEPROCW */ + TEST_TYPE_SIZE (ENUMRESTYPEPROCW, 8) + TEST_TYPE_ALIGN (ENUMRESTYPEPROCW, 8) +} + +static void test_pack_EXCEPTION_DEBUG_INFO(void) +{ + /* EXCEPTION_DEBUG_INFO */ + TEST_TYPE_SIZE (EXCEPTION_DEBUG_INFO, 160) + TEST_TYPE_ALIGN (EXCEPTION_DEBUG_INFO, 8) + TEST_FIELD_SIZE (EXCEPTION_DEBUG_INFO, ExceptionRecord, 152) + TEST_FIELD_ALIGN (EXCEPTION_DEBUG_INFO, ExceptionRecord, 8) + TEST_FIELD_OFFSET(EXCEPTION_DEBUG_INFO, ExceptionRecord, 0) + TEST_FIELD_SIZE (EXCEPTION_DEBUG_INFO, dwFirstChance, 4) + TEST_FIELD_ALIGN (EXCEPTION_DEBUG_INFO, dwFirstChance, 4) + TEST_FIELD_OFFSET(EXCEPTION_DEBUG_INFO, dwFirstChance, 152) +} + +static void test_pack_EXIT_PROCESS_DEBUG_INFO(void) +{ + /* EXIT_PROCESS_DEBUG_INFO */ + TEST_TYPE_SIZE (EXIT_PROCESS_DEBUG_INFO, 4) + TEST_TYPE_ALIGN (EXIT_PROCESS_DEBUG_INFO, 4) + TEST_FIELD_SIZE (EXIT_PROCESS_DEBUG_INFO, dwExitCode, 4) + TEST_FIELD_ALIGN (EXIT_PROCESS_DEBUG_INFO, dwExitCode, 4) + TEST_FIELD_OFFSET(EXIT_PROCESS_DEBUG_INFO, dwExitCode, 0) +} + +static void test_pack_EXIT_THREAD_DEBUG_INFO(void) +{ + /* EXIT_THREAD_DEBUG_INFO */ + TEST_TYPE_SIZE (EXIT_THREAD_DEBUG_INFO, 4) + TEST_TYPE_ALIGN (EXIT_THREAD_DEBUG_INFO, 4) + TEST_FIELD_SIZE (EXIT_THREAD_DEBUG_INFO, dwExitCode, 4) + TEST_FIELD_ALIGN (EXIT_THREAD_DEBUG_INFO, dwExitCode, 4) + TEST_FIELD_OFFSET(EXIT_THREAD_DEBUG_INFO, dwExitCode, 0) +} + +static void test_pack_HW_PROFILE_INFOA(void) +{ + /* HW_PROFILE_INFOA */ + TEST_TYPE_SIZE (HW_PROFILE_INFOA, 124) + TEST_TYPE_ALIGN (HW_PROFILE_INFOA, 4) + TEST_FIELD_SIZE (HW_PROFILE_INFOA, dwDockInfo, 4) + TEST_FIELD_ALIGN (HW_PROFILE_INFOA, dwDockInfo, 4) + TEST_FIELD_OFFSET(HW_PROFILE_INFOA, dwDockInfo, 0) + TEST_FIELD_SIZE (HW_PROFILE_INFOA, szHwProfileGuid, 39) + TEST_FIELD_ALIGN (HW_PROFILE_INFOA, szHwProfileGuid, 1) + TEST_FIELD_OFFSET(HW_PROFILE_INFOA, szHwProfileGuid, 4) + TEST_FIELD_SIZE (HW_PROFILE_INFOA, szHwProfileName, 80) + TEST_FIELD_ALIGN (HW_PROFILE_INFOA, szHwProfileName, 1) + TEST_FIELD_OFFSET(HW_PROFILE_INFOA, szHwProfileName, 43) +} + +static void test_pack_HW_PROFILE_INFOW(void) +{ + /* HW_PROFILE_INFOW */ + TEST_TYPE_SIZE (HW_PROFILE_INFOW, 244) + TEST_TYPE_ALIGN (HW_PROFILE_INFOW, 4) + TEST_FIELD_SIZE (HW_PROFILE_INFOW, dwDockInfo, 4) + TEST_FIELD_ALIGN (HW_PROFILE_INFOW, dwDockInfo, 4) + TEST_FIELD_OFFSET(HW_PROFILE_INFOW, dwDockInfo, 0) + TEST_FIELD_SIZE (HW_PROFILE_INFOW, szHwProfileGuid, 78) + TEST_FIELD_ALIGN (HW_PROFILE_INFOW, szHwProfileGuid, 2) + TEST_FIELD_OFFSET(HW_PROFILE_INFOW, szHwProfileGuid, 4) + TEST_FIELD_SIZE (HW_PROFILE_INFOW, szHwProfileName, 160) + TEST_FIELD_ALIGN (HW_PROFILE_INFOW, szHwProfileName, 2) + TEST_FIELD_OFFSET(HW_PROFILE_INFOW, szHwProfileName, 82) +} + +static void test_pack_LOAD_DLL_DEBUG_INFO(void) +{ + /* LOAD_DLL_DEBUG_INFO */ + TEST_TYPE_SIZE (LOAD_DLL_DEBUG_INFO, 40) + TEST_TYPE_ALIGN (LOAD_DLL_DEBUG_INFO, 8) + TEST_FIELD_SIZE (LOAD_DLL_DEBUG_INFO, hFile, 8) + TEST_FIELD_ALIGN (LOAD_DLL_DEBUG_INFO, hFile, 8) + TEST_FIELD_OFFSET(LOAD_DLL_DEBUG_INFO, hFile, 0) + TEST_FIELD_SIZE (LOAD_DLL_DEBUG_INFO, lpBaseOfDll, 8) + TEST_FIELD_ALIGN (LOAD_DLL_DEBUG_INFO, lpBaseOfDll, 8) + TEST_FIELD_OFFSET(LOAD_DLL_DEBUG_INFO, lpBaseOfDll, 8) + TEST_FIELD_SIZE (LOAD_DLL_DEBUG_INFO, dwDebugInfoFileOffset, 4) + TEST_FIELD_ALIGN (LOAD_DLL_DEBUG_INFO, dwDebugInfoFileOffset, 4) + TEST_FIELD_OFFSET(LOAD_DLL_DEBUG_INFO, dwDebugInfoFileOffset, 16) + TEST_FIELD_SIZE (LOAD_DLL_DEBUG_INFO, nDebugInfoSize, 4) + TEST_FIELD_ALIGN (LOAD_DLL_DEBUG_INFO, nDebugInfoSize, 4) + TEST_FIELD_OFFSET(LOAD_DLL_DEBUG_INFO, nDebugInfoSize, 20) + TEST_FIELD_SIZE (LOAD_DLL_DEBUG_INFO, lpImageName, 8) + TEST_FIELD_ALIGN (LOAD_DLL_DEBUG_INFO, lpImageName, 8) + TEST_FIELD_OFFSET(LOAD_DLL_DEBUG_INFO, lpImageName, 24) + TEST_FIELD_SIZE (LOAD_DLL_DEBUG_INFO, fUnicode, 2) + TEST_FIELD_ALIGN (LOAD_DLL_DEBUG_INFO, fUnicode, 2) + TEST_FIELD_OFFSET(LOAD_DLL_DEBUG_INFO, fUnicode, 32) +} + +static void test_pack_LPBY_HANDLE_FILE_INFORMATION(void) +{ + /* LPBY_HANDLE_FILE_INFORMATION */ + TEST_TYPE_SIZE (LPBY_HANDLE_FILE_INFORMATION, 8) + TEST_TYPE_ALIGN (LPBY_HANDLE_FILE_INFORMATION, 8) + TEST_TARGET_SIZE (LPBY_HANDLE_FILE_INFORMATION, 52) + TEST_TARGET_ALIGN(LPBY_HANDLE_FILE_INFORMATION, 4) +} + +static void test_pack_LPCOMMCONFIG(void) +{ + /* LPCOMMCONFIG */ + TEST_TYPE_SIZE (LPCOMMCONFIG, 8) + TEST_TYPE_ALIGN (LPCOMMCONFIG, 8) + TEST_TARGET_SIZE (LPCOMMCONFIG, 52) + TEST_TARGET_ALIGN(LPCOMMCONFIG, 4) +} + +static void test_pack_LPCOMMPROP(void) +{ + /* LPCOMMPROP */ + TEST_TYPE_SIZE (LPCOMMPROP, 8) + TEST_TYPE_ALIGN (LPCOMMPROP, 8) + TEST_TARGET_SIZE (LPCOMMPROP, 64) + TEST_TARGET_ALIGN(LPCOMMPROP, 4) +} + +static void test_pack_LPCOMMTIMEOUTS(void) +{ + /* LPCOMMTIMEOUTS */ + TEST_TYPE_SIZE (LPCOMMTIMEOUTS, 8) + TEST_TYPE_ALIGN (LPCOMMTIMEOUTS, 8) + TEST_TARGET_SIZE (LPCOMMTIMEOUTS, 20) + TEST_TARGET_ALIGN(LPCOMMTIMEOUTS, 4) +} + +static void test_pack_LPCOMSTAT(void) +{ + /* LPCOMSTAT */ + TEST_TYPE_SIZE (LPCOMSTAT, 8) + TEST_TYPE_ALIGN (LPCOMSTAT, 8) + TEST_TARGET_SIZE (LPCOMSTAT, 12) + TEST_TARGET_ALIGN(LPCOMSTAT, 4) +} + +static void test_pack_LPCRITICAL_SECTION(void) +{ + /* LPCRITICAL_SECTION */ + TEST_TYPE_SIZE (LPCRITICAL_SECTION, 8) + TEST_TYPE_ALIGN (LPCRITICAL_SECTION, 8) +} + +static void test_pack_LPCRITICAL_SECTION_DEBUG(void) +{ + /* LPCRITICAL_SECTION_DEBUG */ + TEST_TYPE_SIZE (LPCRITICAL_SECTION_DEBUG, 8) + TEST_TYPE_ALIGN (LPCRITICAL_SECTION_DEBUG, 8) +} + +static void test_pack_LPDCB(void) +{ + /* LPDCB */ + TEST_TYPE_SIZE (LPDCB, 8) + TEST_TYPE_ALIGN (LPDCB, 8) + TEST_TARGET_SIZE (LPDCB, 28) + TEST_TARGET_ALIGN(LPDCB, 4) +} + +static void test_pack_LPDEBUG_EVENT(void) +{ + /* LPDEBUG_EVENT */ + TEST_TYPE_SIZE (LPDEBUG_EVENT, 8) + TEST_TYPE_ALIGN (LPDEBUG_EVENT, 8) +} + +static void test_pack_LPEXCEPTION_POINTERS(void) +{ + /* LPEXCEPTION_POINTERS */ + TEST_TYPE_SIZE (LPEXCEPTION_POINTERS, 8) + TEST_TYPE_ALIGN (LPEXCEPTION_POINTERS, 8) +} + +static void test_pack_LPEXCEPTION_RECORD(void) +{ + /* LPEXCEPTION_RECORD */ + TEST_TYPE_SIZE (LPEXCEPTION_RECORD, 8) + TEST_TYPE_ALIGN (LPEXCEPTION_RECORD, 8) +} + +static void test_pack_LPFIBER_START_ROUTINE(void) +{ + /* LPFIBER_START_ROUTINE */ + TEST_TYPE_SIZE (LPFIBER_START_ROUTINE, 8) + TEST_TYPE_ALIGN (LPFIBER_START_ROUTINE, 8) +} + +static void test_pack_LPHW_PROFILE_INFOA(void) +{ + /* LPHW_PROFILE_INFOA */ + TEST_TYPE_SIZE (LPHW_PROFILE_INFOA, 8) + TEST_TYPE_ALIGN (LPHW_PROFILE_INFOA, 8) + TEST_TARGET_SIZE (LPHW_PROFILE_INFOA, 124) + TEST_TARGET_ALIGN(LPHW_PROFILE_INFOA, 4) +} + +static void test_pack_LPHW_PROFILE_INFOW(void) +{ + /* LPHW_PROFILE_INFOW */ + TEST_TYPE_SIZE (LPHW_PROFILE_INFOW, 8) + TEST_TYPE_ALIGN (LPHW_PROFILE_INFOW, 8) + TEST_TARGET_SIZE (LPHW_PROFILE_INFOW, 244) + TEST_TARGET_ALIGN(LPHW_PROFILE_INFOW, 4) +} + +static void test_pack_LPMEMORYSTATUS(void) +{ + /* LPMEMORYSTATUS */ + TEST_TYPE_SIZE (LPMEMORYSTATUS, 8) + TEST_TYPE_ALIGN (LPMEMORYSTATUS, 8) + TEST_TARGET_SIZE (LPMEMORYSTATUS, 56) + TEST_TARGET_ALIGN(LPMEMORYSTATUS, 8) +} + +static void test_pack_LPMEMORYSTATUSEX(void) +{ + /* LPMEMORYSTATUSEX */ + TEST_TYPE_SIZE (LPMEMORYSTATUSEX, 8) + TEST_TYPE_ALIGN (LPMEMORYSTATUSEX, 8) + TEST_TARGET_SIZE (LPMEMORYSTATUSEX, 64) + TEST_TARGET_ALIGN(LPMEMORYSTATUSEX, 8) +} + +static void test_pack_LPOFSTRUCT(void) +{ + /* LPOFSTRUCT */ + TEST_TYPE_SIZE (LPOFSTRUCT, 8) + TEST_TYPE_ALIGN (LPOFSTRUCT, 8) + TEST_TARGET_SIZE (LPOFSTRUCT, 136) + TEST_TARGET_ALIGN(LPOFSTRUCT, 2) +} + +static void test_pack_LPOVERLAPPED(void) +{ + /* LPOVERLAPPED */ + TEST_TYPE_SIZE (LPOVERLAPPED, 8) + TEST_TYPE_ALIGN (LPOVERLAPPED, 8) +} + +static void test_pack_LPOVERLAPPED_COMPLETION_ROUTINE(void) +{ + /* LPOVERLAPPED_COMPLETION_ROUTINE */ + TEST_TYPE_SIZE (LPOVERLAPPED_COMPLETION_ROUTINE, 8) + TEST_TYPE_ALIGN (LPOVERLAPPED_COMPLETION_ROUTINE, 8) +} + +static void test_pack_LPPROCESS_HEAP_ENTRY(void) +{ + /* LPPROCESS_HEAP_ENTRY */ + TEST_TYPE_SIZE (LPPROCESS_HEAP_ENTRY, 8) + TEST_TYPE_ALIGN (LPPROCESS_HEAP_ENTRY, 8) +} + +static void test_pack_LPPROCESS_INFORMATION(void) +{ + /* LPPROCESS_INFORMATION */ + TEST_TYPE_SIZE (LPPROCESS_INFORMATION, 8) + TEST_TYPE_ALIGN (LPPROCESS_INFORMATION, 8) + TEST_TARGET_SIZE (LPPROCESS_INFORMATION, 24) + TEST_TARGET_ALIGN(LPPROCESS_INFORMATION, 8) +} + +static void test_pack_LPPROGRESS_ROUTINE(void) +{ + /* LPPROGRESS_ROUTINE */ + TEST_TYPE_SIZE (LPPROGRESS_ROUTINE, 8) + TEST_TYPE_ALIGN (LPPROGRESS_ROUTINE, 8) +} + +static void test_pack_LPSECURITY_ATTRIBUTES(void) +{ + /* LPSECURITY_ATTRIBUTES */ + TEST_TYPE_SIZE (LPSECURITY_ATTRIBUTES, 8) + TEST_TYPE_ALIGN (LPSECURITY_ATTRIBUTES, 8) + TEST_TARGET_SIZE (LPSECURITY_ATTRIBUTES, 24) + TEST_TARGET_ALIGN(LPSECURITY_ATTRIBUTES, 8) +} + +static void test_pack_LPSTARTUPINFOA(void) +{ + /* LPSTARTUPINFOA */ + TEST_TYPE_SIZE (LPSTARTUPINFOA, 8) + TEST_TYPE_ALIGN (LPSTARTUPINFOA, 8) + TEST_TARGET_SIZE (LPSTARTUPINFOA, 104) + TEST_TARGET_ALIGN(LPSTARTUPINFOA, 8) +} + +static void test_pack_LPSTARTUPINFOW(void) +{ + /* LPSTARTUPINFOW */ + TEST_TYPE_SIZE (LPSTARTUPINFOW, 8) + TEST_TYPE_ALIGN (LPSTARTUPINFOW, 8) + TEST_TARGET_SIZE (LPSTARTUPINFOW, 104) + TEST_TARGET_ALIGN(LPSTARTUPINFOW, 8) +} + +static void test_pack_LPSYSTEMTIME(void) +{ + /* LPSYSTEMTIME */ + TEST_TYPE_SIZE (LPSYSTEMTIME, 8) + TEST_TYPE_ALIGN (LPSYSTEMTIME, 8) + TEST_TARGET_SIZE (LPSYSTEMTIME, 16) + TEST_TARGET_ALIGN(LPSYSTEMTIME, 2) +} + +static void test_pack_LPSYSTEM_INFO(void) +{ + /* LPSYSTEM_INFO */ + TEST_TYPE_SIZE (LPSYSTEM_INFO, 8) + TEST_TYPE_ALIGN (LPSYSTEM_INFO, 8) +} + +static void test_pack_LPSYSTEM_POWER_STATUS(void) +{ + /* LPSYSTEM_POWER_STATUS */ + TEST_TYPE_SIZE (LPSYSTEM_POWER_STATUS, 8) + TEST_TYPE_ALIGN (LPSYSTEM_POWER_STATUS, 8) + TEST_TARGET_SIZE (LPSYSTEM_POWER_STATUS, 12) + TEST_TARGET_ALIGN(LPSYSTEM_POWER_STATUS, 4) +} + +static void test_pack_LPTHREAD_START_ROUTINE(void) +{ + /* LPTHREAD_START_ROUTINE */ + TEST_TYPE_SIZE (LPTHREAD_START_ROUTINE, 8) + TEST_TYPE_ALIGN (LPTHREAD_START_ROUTINE, 8) +} + +static void test_pack_LPTIME_ZONE_INFORMATION(void) +{ + /* LPTIME_ZONE_INFORMATION */ + TEST_TYPE_SIZE (LPTIME_ZONE_INFORMATION, 8) + TEST_TYPE_ALIGN (LPTIME_ZONE_INFORMATION, 8) + TEST_TARGET_SIZE (LPTIME_ZONE_INFORMATION, 172) + TEST_TARGET_ALIGN(LPTIME_ZONE_INFORMATION, 4) +} + +static void test_pack_LPWIN32_FILE_ATTRIBUTE_DATA(void) +{ + /* LPWIN32_FILE_ATTRIBUTE_DATA */ + TEST_TYPE_SIZE (LPWIN32_FILE_ATTRIBUTE_DATA, 8) + TEST_TYPE_ALIGN (LPWIN32_FILE_ATTRIBUTE_DATA, 8) + TEST_TARGET_SIZE (LPWIN32_FILE_ATTRIBUTE_DATA, 36) + TEST_TARGET_ALIGN(LPWIN32_FILE_ATTRIBUTE_DATA, 4) +} + +static void test_pack_LPWIN32_FIND_DATAA(void) +{ + /* LPWIN32_FIND_DATAA */ + TEST_TYPE_SIZE (LPWIN32_FIND_DATAA, 8) + TEST_TYPE_ALIGN (LPWIN32_FIND_DATAA, 8) + TEST_TARGET_SIZE (LPWIN32_FIND_DATAA, 320) + TEST_TARGET_ALIGN(LPWIN32_FIND_DATAA, 4) +} + +static void test_pack_LPWIN32_FIND_DATAW(void) +{ + /* LPWIN32_FIND_DATAW */ + TEST_TYPE_SIZE (LPWIN32_FIND_DATAW, 8) + TEST_TYPE_ALIGN (LPWIN32_FIND_DATAW, 8) + TEST_TARGET_SIZE (LPWIN32_FIND_DATAW, 592) + TEST_TARGET_ALIGN(LPWIN32_FIND_DATAW, 4) +} + +static void test_pack_LPWIN32_STREAM_ID(void) +{ + /* LPWIN32_STREAM_ID */ + TEST_TYPE_SIZE (LPWIN32_STREAM_ID, 8) + TEST_TYPE_ALIGN (LPWIN32_STREAM_ID, 8) + TEST_TARGET_SIZE (LPWIN32_STREAM_ID, 24) + TEST_TARGET_ALIGN(LPWIN32_STREAM_ID, 8) +} + +static void test_pack_MEMORYSTATUS(void) +{ + /* MEMORYSTATUS */ + TEST_TYPE_SIZE (MEMORYSTATUS, 56) + TEST_TYPE_ALIGN (MEMORYSTATUS, 8) + TEST_FIELD_SIZE (MEMORYSTATUS, dwLength, 4) + TEST_FIELD_ALIGN (MEMORYSTATUS, dwLength, 4) + TEST_FIELD_OFFSET(MEMORYSTATUS, dwLength, 0) + TEST_FIELD_SIZE (MEMORYSTATUS, dwMemoryLoad, 4) + TEST_FIELD_ALIGN (MEMORYSTATUS, dwMemoryLoad, 4) + TEST_FIELD_OFFSET(MEMORYSTATUS, dwMemoryLoad, 4) + TEST_FIELD_SIZE (MEMORYSTATUS, dwTotalPhys, 8) + TEST_FIELD_ALIGN (MEMORYSTATUS, dwTotalPhys, 8) + TEST_FIELD_OFFSET(MEMORYSTATUS, dwTotalPhys, 8) + TEST_FIELD_SIZE (MEMORYSTATUS, dwAvailPhys, 8) + TEST_FIELD_ALIGN (MEMORYSTATUS, dwAvailPhys, 8) + TEST_FIELD_OFFSET(MEMORYSTATUS, dwAvailPhys, 16) + TEST_FIELD_SIZE (MEMORYSTATUS, dwTotalPageFile, 8) + TEST_FIELD_ALIGN (MEMORYSTATUS, dwTotalPageFile, 8) + TEST_FIELD_OFFSET(MEMORYSTATUS, dwTotalPageFile, 24) + TEST_FIELD_SIZE (MEMORYSTATUS, dwAvailPageFile, 8) + TEST_FIELD_ALIGN (MEMORYSTATUS, dwAvailPageFile, 8) + TEST_FIELD_OFFSET(MEMORYSTATUS, dwAvailPageFile, 32) + TEST_FIELD_SIZE (MEMORYSTATUS, dwTotalVirtual, 8) + TEST_FIELD_ALIGN (MEMORYSTATUS, dwTotalVirtual, 8) + TEST_FIELD_OFFSET(MEMORYSTATUS, dwTotalVirtual, 40) + TEST_FIELD_SIZE (MEMORYSTATUS, dwAvailVirtual, 8) + TEST_FIELD_ALIGN (MEMORYSTATUS, dwAvailVirtual, 8) + TEST_FIELD_OFFSET(MEMORYSTATUS, dwAvailVirtual, 48) +} + +static void test_pack_MEMORYSTATUSEX(void) +{ + /* MEMORYSTATUSEX (pack 8) */ + TEST_TYPE_SIZE (MEMORYSTATUSEX, 64) + TEST_TYPE_ALIGN (MEMORYSTATUSEX, 8) + TEST_FIELD_SIZE (MEMORYSTATUSEX, dwLength, 4) + TEST_FIELD_ALIGN (MEMORYSTATUSEX, dwLength, 4) + TEST_FIELD_OFFSET(MEMORYSTATUSEX, dwLength, 0) + TEST_FIELD_SIZE (MEMORYSTATUSEX, dwMemoryLoad, 4) + TEST_FIELD_ALIGN (MEMORYSTATUSEX, dwMemoryLoad, 4) + TEST_FIELD_OFFSET(MEMORYSTATUSEX, dwMemoryLoad, 4) + TEST_FIELD_SIZE (MEMORYSTATUSEX, ullTotalPhys, 8) + TEST_FIELD_ALIGN (MEMORYSTATUSEX, ullTotalPhys, 8) + TEST_FIELD_OFFSET(MEMORYSTATUSEX, ullTotalPhys, 8) + TEST_FIELD_SIZE (MEMORYSTATUSEX, ullAvailPhys, 8) + TEST_FIELD_ALIGN (MEMORYSTATUSEX, ullAvailPhys, 8) + TEST_FIELD_OFFSET(MEMORYSTATUSEX, ullAvailPhys, 16) + TEST_FIELD_SIZE (MEMORYSTATUSEX, ullTotalPageFile, 8) + TEST_FIELD_ALIGN (MEMORYSTATUSEX, ullTotalPageFile, 8) + TEST_FIELD_OFFSET(MEMORYSTATUSEX, ullTotalPageFile, 24) + TEST_FIELD_SIZE (MEMORYSTATUSEX, ullAvailPageFile, 8) + TEST_FIELD_ALIGN (MEMORYSTATUSEX, ullAvailPageFile, 8) + TEST_FIELD_OFFSET(MEMORYSTATUSEX, ullAvailPageFile, 32) + TEST_FIELD_SIZE (MEMORYSTATUSEX, ullTotalVirtual, 8) + TEST_FIELD_ALIGN (MEMORYSTATUSEX, ullTotalVirtual, 8) + TEST_FIELD_OFFSET(MEMORYSTATUSEX, ullTotalVirtual, 40) + TEST_FIELD_SIZE (MEMORYSTATUSEX, ullAvailVirtual, 8) + TEST_FIELD_ALIGN (MEMORYSTATUSEX, ullAvailVirtual, 8) + TEST_FIELD_OFFSET(MEMORYSTATUSEX, ullAvailVirtual, 48) + TEST_FIELD_SIZE (MEMORYSTATUSEX, ullAvailExtendedVirtual, 8) + TEST_FIELD_ALIGN (MEMORYSTATUSEX, ullAvailExtendedVirtual, 8) + TEST_FIELD_OFFSET(MEMORYSTATUSEX, ullAvailExtendedVirtual, 56) +} + +static void test_pack_OFSTRUCT(void) +{ + /* OFSTRUCT */ + TEST_TYPE_SIZE (OFSTRUCT, 136) + TEST_TYPE_ALIGN (OFSTRUCT, 2) + TEST_FIELD_SIZE (OFSTRUCT, cBytes, 1) + TEST_FIELD_ALIGN (OFSTRUCT, cBytes, 1) + TEST_FIELD_OFFSET(OFSTRUCT, cBytes, 0) + TEST_FIELD_SIZE (OFSTRUCT, fFixedDisk, 1) + TEST_FIELD_ALIGN (OFSTRUCT, fFixedDisk, 1) + TEST_FIELD_OFFSET(OFSTRUCT, fFixedDisk, 1) + TEST_FIELD_SIZE (OFSTRUCT, nErrCode, 2) + TEST_FIELD_ALIGN (OFSTRUCT, nErrCode, 2) + TEST_FIELD_OFFSET(OFSTRUCT, nErrCode, 2) + TEST_FIELD_SIZE (OFSTRUCT, Reserved1, 2) + TEST_FIELD_ALIGN (OFSTRUCT, Reserved1, 2) + TEST_FIELD_OFFSET(OFSTRUCT, Reserved1, 4) + TEST_FIELD_SIZE (OFSTRUCT, Reserved2, 2) + TEST_FIELD_ALIGN (OFSTRUCT, Reserved2, 2) + TEST_FIELD_OFFSET(OFSTRUCT, Reserved2, 6) + TEST_FIELD_SIZE (OFSTRUCT, szPathName, 128) + TEST_FIELD_ALIGN (OFSTRUCT, szPathName, 1) + TEST_FIELD_OFFSET(OFSTRUCT, szPathName, 8) +} + +static void test_pack_OUTPUT_DEBUG_STRING_INFO(void) +{ + /* OUTPUT_DEBUG_STRING_INFO */ + TEST_TYPE_SIZE (OUTPUT_DEBUG_STRING_INFO, 16) + TEST_TYPE_ALIGN (OUTPUT_DEBUG_STRING_INFO, 8) + TEST_FIELD_SIZE (OUTPUT_DEBUG_STRING_INFO, lpDebugStringData, 8) + TEST_FIELD_ALIGN (OUTPUT_DEBUG_STRING_INFO, lpDebugStringData, 8) + TEST_FIELD_OFFSET(OUTPUT_DEBUG_STRING_INFO, lpDebugStringData, 0) + TEST_FIELD_SIZE (OUTPUT_DEBUG_STRING_INFO, fUnicode, 2) + TEST_FIELD_ALIGN (OUTPUT_DEBUG_STRING_INFO, fUnicode, 2) + TEST_FIELD_OFFSET(OUTPUT_DEBUG_STRING_INFO, fUnicode, 8) + TEST_FIELD_SIZE (OUTPUT_DEBUG_STRING_INFO, nDebugStringLength, 2) + TEST_FIELD_ALIGN (OUTPUT_DEBUG_STRING_INFO, nDebugStringLength, 2) + TEST_FIELD_OFFSET(OUTPUT_DEBUG_STRING_INFO, nDebugStringLength, 10) +} + +static void test_pack_PACTCTXA(void) +{ + /* PACTCTXA */ + TEST_TYPE_SIZE (PACTCTXA, 8) + TEST_TYPE_ALIGN (PACTCTXA, 8) + TEST_TARGET_SIZE (PACTCTXA, 56) + TEST_TARGET_ALIGN(PACTCTXA, 8) +} + +static void test_pack_PACTCTXW(void) +{ + /* PACTCTXW */ + TEST_TYPE_SIZE (PACTCTXW, 8) + TEST_TYPE_ALIGN (PACTCTXW, 8) + TEST_TARGET_SIZE (PACTCTXW, 56) + TEST_TARGET_ALIGN(PACTCTXW, 8) +} + +static void test_pack_PACTCTX_SECTION_KEYED_DATA(void) +{ + /* PACTCTX_SECTION_KEYED_DATA */ + TEST_TYPE_SIZE (PACTCTX_SECTION_KEYED_DATA, 8) + TEST_TYPE_ALIGN (PACTCTX_SECTION_KEYED_DATA, 8) + TEST_TARGET_SIZE (PACTCTX_SECTION_KEYED_DATA, 112) + TEST_TARGET_ALIGN(PACTCTX_SECTION_KEYED_DATA, 8) +} + +static void test_pack_PACTCTX_SECTION_KEYED_DATA_2600(void) +{ + /* PACTCTX_SECTION_KEYED_DATA_2600 */ + TEST_TYPE_SIZE (PACTCTX_SECTION_KEYED_DATA_2600, 8) + TEST_TYPE_ALIGN (PACTCTX_SECTION_KEYED_DATA_2600, 8) + TEST_TARGET_SIZE (PACTCTX_SECTION_KEYED_DATA_2600, 72) + TEST_TARGET_ALIGN(PACTCTX_SECTION_KEYED_DATA_2600, 8) +} + +static void test_pack_PACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA(void) +{ + /* PACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA */ + TEST_TYPE_SIZE (PACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA, 8) + TEST_TYPE_ALIGN (PACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA, 8) + TEST_TARGET_SIZE (PACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA, 40) + TEST_TARGET_ALIGN(PACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA, 8) +} + +static void test_pack_PACTIVATION_CONTEXT_BASIC_INFORMATION(void) +{ + /* PACTIVATION_CONTEXT_BASIC_INFORMATION */ + TEST_TYPE_SIZE (PACTIVATION_CONTEXT_BASIC_INFORMATION, 8) + TEST_TYPE_ALIGN (PACTIVATION_CONTEXT_BASIC_INFORMATION, 8) + TEST_TARGET_SIZE (PACTIVATION_CONTEXT_BASIC_INFORMATION, 16) + TEST_TARGET_ALIGN(PACTIVATION_CONTEXT_BASIC_INFORMATION, 8) +} + +static void test_pack_PAPCFUNC(void) +{ + /* PAPCFUNC */ + TEST_TYPE_SIZE (PAPCFUNC, 8) + TEST_TYPE_ALIGN (PAPCFUNC, 8) +} + +static void test_pack_PBY_HANDLE_FILE_INFORMATION(void) +{ + /* PBY_HANDLE_FILE_INFORMATION */ + TEST_TYPE_SIZE (PBY_HANDLE_FILE_INFORMATION, 8) + TEST_TYPE_ALIGN (PBY_HANDLE_FILE_INFORMATION, 8) + TEST_TARGET_SIZE (PBY_HANDLE_FILE_INFORMATION, 52) + TEST_TARGET_ALIGN(PBY_HANDLE_FILE_INFORMATION, 4) +} + +static void test_pack_PCACTCTXA(void) +{ + /* PCACTCTXA */ + TEST_TYPE_SIZE (PCACTCTXA, 8) + TEST_TYPE_ALIGN (PCACTCTXA, 8) + TEST_TARGET_SIZE (PCACTCTXA, 56) + TEST_TARGET_ALIGN(PCACTCTXA, 8) +} + +static void test_pack_PCACTCTXW(void) +{ + /* PCACTCTXW */ + TEST_TYPE_SIZE (PCACTCTXW, 8) + TEST_TYPE_ALIGN (PCACTCTXW, 8) + TEST_TARGET_SIZE (PCACTCTXW, 56) + TEST_TARGET_ALIGN(PCACTCTXW, 8) +} + +static void test_pack_PCACTCTX_SECTION_KEYED_DATA(void) +{ + /* PCACTCTX_SECTION_KEYED_DATA */ + TEST_TYPE_SIZE (PCACTCTX_SECTION_KEYED_DATA, 8) + TEST_TYPE_ALIGN (PCACTCTX_SECTION_KEYED_DATA, 8) + TEST_TARGET_SIZE (PCACTCTX_SECTION_KEYED_DATA, 112) + TEST_TARGET_ALIGN(PCACTCTX_SECTION_KEYED_DATA, 8) +} + +static void test_pack_PCACTCTX_SECTION_KEYED_DATA_2600(void) +{ + /* PCACTCTX_SECTION_KEYED_DATA_2600 */ + TEST_TYPE_SIZE (PCACTCTX_SECTION_KEYED_DATA_2600, 8) + TEST_TYPE_ALIGN (PCACTCTX_SECTION_KEYED_DATA_2600, 8) + TEST_TARGET_SIZE (PCACTCTX_SECTION_KEYED_DATA_2600, 72) + TEST_TARGET_ALIGN(PCACTCTX_SECTION_KEYED_DATA_2600, 8) +} + +static void test_pack_PCACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA(void) +{ + /* PCACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA */ + TEST_TYPE_SIZE (PCACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA, 8) + TEST_TYPE_ALIGN (PCACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA, 8) + TEST_TARGET_SIZE (PCACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA, 40) + TEST_TARGET_ALIGN(PCACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA, 8) +} + +static void test_pack_PCRITICAL_SECTION(void) +{ + /* PCRITICAL_SECTION */ + TEST_TYPE_SIZE (PCRITICAL_SECTION, 8) + TEST_TYPE_ALIGN (PCRITICAL_SECTION, 8) +} + +static void test_pack_PCRITICAL_SECTION_DEBUG(void) +{ + /* PCRITICAL_SECTION_DEBUG */ + TEST_TYPE_SIZE (PCRITICAL_SECTION_DEBUG, 8) + TEST_TYPE_ALIGN (PCRITICAL_SECTION_DEBUG, 8) +} + +static void test_pack_PFIBER_START_ROUTINE(void) +{ + /* PFIBER_START_ROUTINE */ + TEST_TYPE_SIZE (PFIBER_START_ROUTINE, 8) + TEST_TYPE_ALIGN (PFIBER_START_ROUTINE, 8) +} + +static void test_pack_POFSTRUCT(void) +{ + /* POFSTRUCT */ + TEST_TYPE_SIZE (POFSTRUCT, 8) + TEST_TYPE_ALIGN (POFSTRUCT, 8) + TEST_TARGET_SIZE (POFSTRUCT, 136) + TEST_TARGET_ALIGN(POFSTRUCT, 2) +} + +static void test_pack_PPROCESS_HEAP_ENTRY(void) +{ + /* PPROCESS_HEAP_ENTRY */ + TEST_TYPE_SIZE (PPROCESS_HEAP_ENTRY, 8) + TEST_TYPE_ALIGN (PPROCESS_HEAP_ENTRY, 8) +} + +static void test_pack_PPROCESS_INFORMATION(void) +{ + /* PPROCESS_INFORMATION */ + TEST_TYPE_SIZE (PPROCESS_INFORMATION, 8) + TEST_TYPE_ALIGN (PPROCESS_INFORMATION, 8) + TEST_TARGET_SIZE (PPROCESS_INFORMATION, 24) + TEST_TARGET_ALIGN(PPROCESS_INFORMATION, 8) +} + +static void test_pack_PQUERYACTCTXW_FUNC(void) +{ + /* PQUERYACTCTXW_FUNC */ + TEST_TYPE_SIZE (PQUERYACTCTXW_FUNC, 8) + TEST_TYPE_ALIGN (PQUERYACTCTXW_FUNC, 8) +} + +static void test_pack_PROCESS_HEAP_ENTRY(void) +{ + /* PROCESS_HEAP_ENTRY */ + TEST_FIELD_SIZE (PROCESS_HEAP_ENTRY, lpData, 8) + TEST_FIELD_ALIGN (PROCESS_HEAP_ENTRY, lpData, 8) + TEST_FIELD_OFFSET(PROCESS_HEAP_ENTRY, lpData, 0) + TEST_FIELD_SIZE (PROCESS_HEAP_ENTRY, cbData, 4) + TEST_FIELD_ALIGN (PROCESS_HEAP_ENTRY, cbData, 4) + TEST_FIELD_OFFSET(PROCESS_HEAP_ENTRY, cbData, 8) + TEST_FIELD_SIZE (PROCESS_HEAP_ENTRY, cbOverhead, 1) + TEST_FIELD_ALIGN (PROCESS_HEAP_ENTRY, cbOverhead, 1) + TEST_FIELD_OFFSET(PROCESS_HEAP_ENTRY, cbOverhead, 12) + TEST_FIELD_SIZE (PROCESS_HEAP_ENTRY, iRegionIndex, 1) + TEST_FIELD_ALIGN (PROCESS_HEAP_ENTRY, iRegionIndex, 1) + TEST_FIELD_OFFSET(PROCESS_HEAP_ENTRY, iRegionIndex, 13) + TEST_FIELD_SIZE (PROCESS_HEAP_ENTRY, wFlags, 2) + TEST_FIELD_ALIGN (PROCESS_HEAP_ENTRY, wFlags, 2) + TEST_FIELD_OFFSET(PROCESS_HEAP_ENTRY, wFlags, 14) +} + +static void test_pack_PROCESS_INFORMATION(void) +{ + /* PROCESS_INFORMATION */ + TEST_TYPE_SIZE (PROCESS_INFORMATION, 24) + TEST_TYPE_ALIGN (PROCESS_INFORMATION, 8) + TEST_FIELD_SIZE (PROCESS_INFORMATION, hProcess, 8) + TEST_FIELD_ALIGN (PROCESS_INFORMATION, hProcess, 8) + TEST_FIELD_OFFSET(PROCESS_INFORMATION, hProcess, 0) + TEST_FIELD_SIZE (PROCESS_INFORMATION, hThread, 8) + TEST_FIELD_ALIGN (PROCESS_INFORMATION, hThread, 8) + TEST_FIELD_OFFSET(PROCESS_INFORMATION, hThread, 8) + TEST_FIELD_SIZE (PROCESS_INFORMATION, dwProcessId, 4) + TEST_FIELD_ALIGN (PROCESS_INFORMATION, dwProcessId, 4) + TEST_FIELD_OFFSET(PROCESS_INFORMATION, dwProcessId, 16) + TEST_FIELD_SIZE (PROCESS_INFORMATION, dwThreadId, 4) + TEST_FIELD_ALIGN (PROCESS_INFORMATION, dwThreadId, 4) + TEST_FIELD_OFFSET(PROCESS_INFORMATION, dwThreadId, 20) +} + +static void test_pack_PSECURITY_ATTRIBUTES(void) +{ + /* PSECURITY_ATTRIBUTES */ + TEST_TYPE_SIZE (PSECURITY_ATTRIBUTES, 8) + TEST_TYPE_ALIGN (PSECURITY_ATTRIBUTES, 8) + TEST_TARGET_SIZE (PSECURITY_ATTRIBUTES, 24) + TEST_TARGET_ALIGN(PSECURITY_ATTRIBUTES, 8) +} + +static void test_pack_PSYSTEMTIME(void) +{ + /* PSYSTEMTIME */ + TEST_TYPE_SIZE (PSYSTEMTIME, 8) + TEST_TYPE_ALIGN (PSYSTEMTIME, 8) + TEST_TARGET_SIZE (PSYSTEMTIME, 16) + TEST_TARGET_ALIGN(PSYSTEMTIME, 2) +} + +static void test_pack_PTIMERAPCROUTINE(void) +{ + /* PTIMERAPCROUTINE */ + TEST_TYPE_SIZE (PTIMERAPCROUTINE, 8) + TEST_TYPE_ALIGN (PTIMERAPCROUTINE, 8) +} + +static void test_pack_PTIME_ZONE_INFORMATION(void) +{ + /* PTIME_ZONE_INFORMATION */ + TEST_TYPE_SIZE (PTIME_ZONE_INFORMATION, 8) + TEST_TYPE_ALIGN (PTIME_ZONE_INFORMATION, 8) + TEST_TARGET_SIZE (PTIME_ZONE_INFORMATION, 172) + TEST_TARGET_ALIGN(PTIME_ZONE_INFORMATION, 4) +} + +static void test_pack_PWIN32_FIND_DATAA(void) +{ + /* PWIN32_FIND_DATAA */ + TEST_TYPE_SIZE (PWIN32_FIND_DATAA, 8) + TEST_TYPE_ALIGN (PWIN32_FIND_DATAA, 8) + TEST_TARGET_SIZE (PWIN32_FIND_DATAA, 320) + TEST_TARGET_ALIGN(PWIN32_FIND_DATAA, 4) +} + +static void test_pack_PWIN32_FIND_DATAW(void) +{ + /* PWIN32_FIND_DATAW */ + TEST_TYPE_SIZE (PWIN32_FIND_DATAW, 8) + TEST_TYPE_ALIGN (PWIN32_FIND_DATAW, 8) + TEST_TARGET_SIZE (PWIN32_FIND_DATAW, 592) + TEST_TARGET_ALIGN(PWIN32_FIND_DATAW, 4) +} + +static void test_pack_RIP_INFO(void) +{ + /* RIP_INFO */ + TEST_TYPE_SIZE (RIP_INFO, 8) + TEST_TYPE_ALIGN (RIP_INFO, 4) + TEST_FIELD_SIZE (RIP_INFO, dwError, 4) + TEST_FIELD_ALIGN (RIP_INFO, dwError, 4) + TEST_FIELD_OFFSET(RIP_INFO, dwError, 0) + TEST_FIELD_SIZE (RIP_INFO, dwType, 4) + TEST_FIELD_ALIGN (RIP_INFO, dwType, 4) + TEST_FIELD_OFFSET(RIP_INFO, dwType, 4) +} + +static void test_pack_SECURITY_ATTRIBUTES(void) +{ + /* SECURITY_ATTRIBUTES */ + TEST_TYPE_SIZE (SECURITY_ATTRIBUTES, 24) + TEST_TYPE_ALIGN (SECURITY_ATTRIBUTES, 8) + TEST_FIELD_SIZE (SECURITY_ATTRIBUTES, nLength, 4) + TEST_FIELD_ALIGN (SECURITY_ATTRIBUTES, nLength, 4) + TEST_FIELD_OFFSET(SECURITY_ATTRIBUTES, nLength, 0) + TEST_FIELD_SIZE (SECURITY_ATTRIBUTES, lpSecurityDescriptor, 8) + TEST_FIELD_ALIGN (SECURITY_ATTRIBUTES, lpSecurityDescriptor, 8) + TEST_FIELD_OFFSET(SECURITY_ATTRIBUTES, lpSecurityDescriptor, 8) + TEST_FIELD_SIZE (SECURITY_ATTRIBUTES, bInheritHandle, 4) + TEST_FIELD_ALIGN (SECURITY_ATTRIBUTES, bInheritHandle, 4) + TEST_FIELD_OFFSET(SECURITY_ATTRIBUTES, bInheritHandle, 16) +} + +static void test_pack_STARTUPINFOA(void) +{ + /* STARTUPINFOA */ + TEST_TYPE_SIZE (STARTUPINFOA, 104) + TEST_TYPE_ALIGN (STARTUPINFOA, 8) + TEST_FIELD_SIZE (STARTUPINFOA, cb, 4) + TEST_FIELD_ALIGN (STARTUPINFOA, cb, 4) + TEST_FIELD_OFFSET(STARTUPINFOA, cb, 0) + TEST_FIELD_SIZE (STARTUPINFOA, lpReserved, 8) + TEST_FIELD_ALIGN (STARTUPINFOA, lpReserved, 8) + TEST_FIELD_OFFSET(STARTUPINFOA, lpReserved, 8) + TEST_FIELD_SIZE (STARTUPINFOA, lpDesktop, 8) + TEST_FIELD_ALIGN (STARTUPINFOA, lpDesktop, 8) + TEST_FIELD_OFFSET(STARTUPINFOA, lpDesktop, 16) + TEST_FIELD_SIZE (STARTUPINFOA, lpTitle, 8) + TEST_FIELD_ALIGN (STARTUPINFOA, lpTitle, 8) + TEST_FIELD_OFFSET(STARTUPINFOA, lpTitle, 24) + TEST_FIELD_SIZE (STARTUPINFOA, dwX, 4) + TEST_FIELD_ALIGN (STARTUPINFOA, dwX, 4) + TEST_FIELD_OFFSET(STARTUPINFOA, dwX, 32) + TEST_FIELD_SIZE (STARTUPINFOA, dwY, 4) + TEST_FIELD_ALIGN (STARTUPINFOA, dwY, 4) + TEST_FIELD_OFFSET(STARTUPINFOA, dwY, 36) + TEST_FIELD_SIZE (STARTUPINFOA, dwXSize, 4) + TEST_FIELD_ALIGN (STARTUPINFOA, dwXSize, 4) + TEST_FIELD_OFFSET(STARTUPINFOA, dwXSize, 40) + TEST_FIELD_SIZE (STARTUPINFOA, dwYSize, 4) + TEST_FIELD_ALIGN (STARTUPINFOA, dwYSize, 4) + TEST_FIELD_OFFSET(STARTUPINFOA, dwYSize, 44) + TEST_FIELD_SIZE (STARTUPINFOA, dwXCountChars, 4) + TEST_FIELD_ALIGN (STARTUPINFOA, dwXCountChars, 4) + TEST_FIELD_OFFSET(STARTUPINFOA, dwXCountChars, 48) + TEST_FIELD_SIZE (STARTUPINFOA, dwYCountChars, 4) + TEST_FIELD_ALIGN (STARTUPINFOA, dwYCountChars, 4) + TEST_FIELD_OFFSET(STARTUPINFOA, dwYCountChars, 52) + TEST_FIELD_SIZE (STARTUPINFOA, dwFillAttribute, 4) + TEST_FIELD_ALIGN (STARTUPINFOA, dwFillAttribute, 4) + TEST_FIELD_OFFSET(STARTUPINFOA, dwFillAttribute, 56) + TEST_FIELD_SIZE (STARTUPINFOA, dwFlags, 4) + TEST_FIELD_ALIGN (STARTUPINFOA, dwFlags, 4) + TEST_FIELD_OFFSET(STARTUPINFOA, dwFlags, 60) + TEST_FIELD_SIZE (STARTUPINFOA, wShowWindow, 2) + TEST_FIELD_ALIGN (STARTUPINFOA, wShowWindow, 2) + TEST_FIELD_OFFSET(STARTUPINFOA, wShowWindow, 64) + TEST_FIELD_SIZE (STARTUPINFOA, cbReserved2, 2) + TEST_FIELD_ALIGN (STARTUPINFOA, cbReserved2, 2) + TEST_FIELD_OFFSET(STARTUPINFOA, cbReserved2, 66) + TEST_FIELD_SIZE (STARTUPINFOA, lpReserved2, 8) + TEST_FIELD_ALIGN (STARTUPINFOA, lpReserved2, 8) + TEST_FIELD_OFFSET(STARTUPINFOA, lpReserved2, 72) + TEST_FIELD_SIZE (STARTUPINFOA, hStdInput, 8) + TEST_FIELD_ALIGN (STARTUPINFOA, hStdInput, 8) + TEST_FIELD_OFFSET(STARTUPINFOA, hStdInput, 80) + TEST_FIELD_SIZE (STARTUPINFOA, hStdOutput, 8) + TEST_FIELD_ALIGN (STARTUPINFOA, hStdOutput, 8) + TEST_FIELD_OFFSET(STARTUPINFOA, hStdOutput, 88) + TEST_FIELD_SIZE (STARTUPINFOA, hStdError, 8) + TEST_FIELD_ALIGN (STARTUPINFOA, hStdError, 8) + TEST_FIELD_OFFSET(STARTUPINFOA, hStdError, 96) +} + +static void test_pack_STARTUPINFOW(void) +{ + /* STARTUPINFOW */ + TEST_TYPE_SIZE (STARTUPINFOW, 104) + TEST_TYPE_ALIGN (STARTUPINFOW, 8) + TEST_FIELD_SIZE (STARTUPINFOW, cb, 4) + TEST_FIELD_ALIGN (STARTUPINFOW, cb, 4) + TEST_FIELD_OFFSET(STARTUPINFOW, cb, 0) + TEST_FIELD_SIZE (STARTUPINFOW, lpReserved, 8) + TEST_FIELD_ALIGN (STARTUPINFOW, lpReserved, 8) + TEST_FIELD_OFFSET(STARTUPINFOW, lpReserved, 8) + TEST_FIELD_SIZE (STARTUPINFOW, lpDesktop, 8) + TEST_FIELD_ALIGN (STARTUPINFOW, lpDesktop, 8) + TEST_FIELD_OFFSET(STARTUPINFOW, lpDesktop, 16) + TEST_FIELD_SIZE (STARTUPINFOW, lpTitle, 8) + TEST_FIELD_ALIGN (STARTUPINFOW, lpTitle, 8) + TEST_FIELD_OFFSET(STARTUPINFOW, lpTitle, 24) + TEST_FIELD_SIZE (STARTUPINFOW, dwX, 4) + TEST_FIELD_ALIGN (STARTUPINFOW, dwX, 4) + TEST_FIELD_OFFSET(STARTUPINFOW, dwX, 32) + TEST_FIELD_SIZE (STARTUPINFOW, dwY, 4) + TEST_FIELD_ALIGN (STARTUPINFOW, dwY, 4) + TEST_FIELD_OFFSET(STARTUPINFOW, dwY, 36) + TEST_FIELD_SIZE (STARTUPINFOW, dwXSize, 4) + TEST_FIELD_ALIGN (STARTUPINFOW, dwXSize, 4) + TEST_FIELD_OFFSET(STARTUPINFOW, dwXSize, 40) + TEST_FIELD_SIZE (STARTUPINFOW, dwYSize, 4) + TEST_FIELD_ALIGN (STARTUPINFOW, dwYSize, 4) + TEST_FIELD_OFFSET(STARTUPINFOW, dwYSize, 44) + TEST_FIELD_SIZE (STARTUPINFOW, dwXCountChars, 4) + TEST_FIELD_ALIGN (STARTUPINFOW, dwXCountChars, 4) + TEST_FIELD_OFFSET(STARTUPINFOW, dwXCountChars, 48) + TEST_FIELD_SIZE (STARTUPINFOW, dwYCountChars, 4) + TEST_FIELD_ALIGN (STARTUPINFOW, dwYCountChars, 4) + TEST_FIELD_OFFSET(STARTUPINFOW, dwYCountChars, 52) + TEST_FIELD_SIZE (STARTUPINFOW, dwFillAttribute, 4) + TEST_FIELD_ALIGN (STARTUPINFOW, dwFillAttribute, 4) + TEST_FIELD_OFFSET(STARTUPINFOW, dwFillAttribute, 56) + TEST_FIELD_SIZE (STARTUPINFOW, dwFlags, 4) + TEST_FIELD_ALIGN (STARTUPINFOW, dwFlags, 4) + TEST_FIELD_OFFSET(STARTUPINFOW, dwFlags, 60) + TEST_FIELD_SIZE (STARTUPINFOW, wShowWindow, 2) + TEST_FIELD_ALIGN (STARTUPINFOW, wShowWindow, 2) + TEST_FIELD_OFFSET(STARTUPINFOW, wShowWindow, 64) + TEST_FIELD_SIZE (STARTUPINFOW, cbReserved2, 2) + TEST_FIELD_ALIGN (STARTUPINFOW, cbReserved2, 2) + TEST_FIELD_OFFSET(STARTUPINFOW, cbReserved2, 66) + TEST_FIELD_SIZE (STARTUPINFOW, lpReserved2, 8) + TEST_FIELD_ALIGN (STARTUPINFOW, lpReserved2, 8) + TEST_FIELD_OFFSET(STARTUPINFOW, lpReserved2, 72) + TEST_FIELD_SIZE (STARTUPINFOW, hStdInput, 8) + TEST_FIELD_ALIGN (STARTUPINFOW, hStdInput, 8) + TEST_FIELD_OFFSET(STARTUPINFOW, hStdInput, 80) + TEST_FIELD_SIZE (STARTUPINFOW, hStdOutput, 8) + TEST_FIELD_ALIGN (STARTUPINFOW, hStdOutput, 8) + TEST_FIELD_OFFSET(STARTUPINFOW, hStdOutput, 88) + TEST_FIELD_SIZE (STARTUPINFOW, hStdError, 8) + TEST_FIELD_ALIGN (STARTUPINFOW, hStdError, 8) + TEST_FIELD_OFFSET(STARTUPINFOW, hStdError, 96) +} + +static void test_pack_SYSTEMTIME(void) +{ + /* SYSTEMTIME */ + TEST_TYPE_SIZE (SYSTEMTIME, 16) + TEST_TYPE_ALIGN (SYSTEMTIME, 2) + TEST_FIELD_SIZE (SYSTEMTIME, wYear, 2) + TEST_FIELD_ALIGN (SYSTEMTIME, wYear, 2) + TEST_FIELD_OFFSET(SYSTEMTIME, wYear, 0) + TEST_FIELD_SIZE (SYSTEMTIME, wMonth, 2) + TEST_FIELD_ALIGN (SYSTEMTIME, wMonth, 2) + TEST_FIELD_OFFSET(SYSTEMTIME, wMonth, 2) + TEST_FIELD_SIZE (SYSTEMTIME, wDayOfWeek, 2) + TEST_FIELD_ALIGN (SYSTEMTIME, wDayOfWeek, 2) + TEST_FIELD_OFFSET(SYSTEMTIME, wDayOfWeek, 4) + TEST_FIELD_SIZE (SYSTEMTIME, wDay, 2) + TEST_FIELD_ALIGN (SYSTEMTIME, wDay, 2) + TEST_FIELD_OFFSET(SYSTEMTIME, wDay, 6) + TEST_FIELD_SIZE (SYSTEMTIME, wHour, 2) + TEST_FIELD_ALIGN (SYSTEMTIME, wHour, 2) + TEST_FIELD_OFFSET(SYSTEMTIME, wHour, 8) + TEST_FIELD_SIZE (SYSTEMTIME, wMinute, 2) + TEST_FIELD_ALIGN (SYSTEMTIME, wMinute, 2) + TEST_FIELD_OFFSET(SYSTEMTIME, wMinute, 10) + TEST_FIELD_SIZE (SYSTEMTIME, wSecond, 2) + TEST_FIELD_ALIGN (SYSTEMTIME, wSecond, 2) + TEST_FIELD_OFFSET(SYSTEMTIME, wSecond, 12) + TEST_FIELD_SIZE (SYSTEMTIME, wMilliseconds, 2) + TEST_FIELD_ALIGN (SYSTEMTIME, wMilliseconds, 2) + TEST_FIELD_OFFSET(SYSTEMTIME, wMilliseconds, 14) +} + +static void test_pack_SYSTEM_INFO(void) +{ + /* SYSTEM_INFO */ +} + +static void test_pack_SYSTEM_POWER_STATUS(void) +{ + /* SYSTEM_POWER_STATUS */ + TEST_TYPE_SIZE (SYSTEM_POWER_STATUS, 12) + TEST_TYPE_ALIGN (SYSTEM_POWER_STATUS, 4) + TEST_FIELD_SIZE (SYSTEM_POWER_STATUS, ACLineStatus, 1) + TEST_FIELD_ALIGN (SYSTEM_POWER_STATUS, ACLineStatus, 1) + TEST_FIELD_OFFSET(SYSTEM_POWER_STATUS, ACLineStatus, 0) + TEST_FIELD_SIZE (SYSTEM_POWER_STATUS, BatteryFlag, 1) + TEST_FIELD_ALIGN (SYSTEM_POWER_STATUS, BatteryFlag, 1) + TEST_FIELD_OFFSET(SYSTEM_POWER_STATUS, BatteryFlag, 1) + TEST_FIELD_SIZE (SYSTEM_POWER_STATUS, BatteryLifePercent, 1) + TEST_FIELD_ALIGN (SYSTEM_POWER_STATUS, BatteryLifePercent, 1) + TEST_FIELD_OFFSET(SYSTEM_POWER_STATUS, BatteryLifePercent, 2) + TEST_FIELD_SIZE (SYSTEM_POWER_STATUS, Reserved1, 1) + TEST_FIELD_ALIGN (SYSTEM_POWER_STATUS, Reserved1, 1) + TEST_FIELD_OFFSET(SYSTEM_POWER_STATUS, Reserved1, 3) + TEST_FIELD_SIZE (SYSTEM_POWER_STATUS, BatteryLifeTime, 4) + TEST_FIELD_ALIGN (SYSTEM_POWER_STATUS, BatteryLifeTime, 4) + TEST_FIELD_OFFSET(SYSTEM_POWER_STATUS, BatteryLifeTime, 4) + TEST_FIELD_SIZE (SYSTEM_POWER_STATUS, BatteryFullLifeTime, 4) + TEST_FIELD_ALIGN (SYSTEM_POWER_STATUS, BatteryFullLifeTime, 4) + TEST_FIELD_OFFSET(SYSTEM_POWER_STATUS, BatteryFullLifeTime, 8) +} + +static void test_pack_TIME_ZONE_INFORMATION(void) +{ + /* TIME_ZONE_INFORMATION */ + TEST_TYPE_SIZE (TIME_ZONE_INFORMATION, 172) + TEST_TYPE_ALIGN (TIME_ZONE_INFORMATION, 4) + TEST_FIELD_SIZE (TIME_ZONE_INFORMATION, Bias, 4) + TEST_FIELD_ALIGN (TIME_ZONE_INFORMATION, Bias, 4) + TEST_FIELD_OFFSET(TIME_ZONE_INFORMATION, Bias, 0) + TEST_FIELD_SIZE (TIME_ZONE_INFORMATION, StandardName, 64) + TEST_FIELD_ALIGN (TIME_ZONE_INFORMATION, StandardName, 2) + TEST_FIELD_OFFSET(TIME_ZONE_INFORMATION, StandardName, 4) + TEST_FIELD_SIZE (TIME_ZONE_INFORMATION, StandardDate, 16) + TEST_FIELD_ALIGN (TIME_ZONE_INFORMATION, StandardDate, 2) + TEST_FIELD_OFFSET(TIME_ZONE_INFORMATION, StandardDate, 68) + TEST_FIELD_SIZE (TIME_ZONE_INFORMATION, StandardBias, 4) + TEST_FIELD_ALIGN (TIME_ZONE_INFORMATION, StandardBias, 4) + TEST_FIELD_OFFSET(TIME_ZONE_INFORMATION, StandardBias, 84) + TEST_FIELD_SIZE (TIME_ZONE_INFORMATION, DaylightName, 64) + TEST_FIELD_ALIGN (TIME_ZONE_INFORMATION, DaylightName, 2) + TEST_FIELD_OFFSET(TIME_ZONE_INFORMATION, DaylightName, 88) + TEST_FIELD_SIZE (TIME_ZONE_INFORMATION, DaylightDate, 16) + TEST_FIELD_ALIGN (TIME_ZONE_INFORMATION, DaylightDate, 2) + TEST_FIELD_OFFSET(TIME_ZONE_INFORMATION, DaylightDate, 152) + TEST_FIELD_SIZE (TIME_ZONE_INFORMATION, DaylightBias, 4) + TEST_FIELD_ALIGN (TIME_ZONE_INFORMATION, DaylightBias, 4) + TEST_FIELD_OFFSET(TIME_ZONE_INFORMATION, DaylightBias, 168) +} + +static void test_pack_UNLOAD_DLL_DEBUG_INFO(void) +{ + /* UNLOAD_DLL_DEBUG_INFO */ + TEST_TYPE_SIZE (UNLOAD_DLL_DEBUG_INFO, 8) + TEST_TYPE_ALIGN (UNLOAD_DLL_DEBUG_INFO, 8) + TEST_FIELD_SIZE (UNLOAD_DLL_DEBUG_INFO, lpBaseOfDll, 8) + TEST_FIELD_ALIGN (UNLOAD_DLL_DEBUG_INFO, lpBaseOfDll, 8) + TEST_FIELD_OFFSET(UNLOAD_DLL_DEBUG_INFO, lpBaseOfDll, 0) +} + +static void test_pack_WAITORTIMERCALLBACK(void) +{ + /* WAITORTIMERCALLBACK */ + TEST_TYPE_SIZE (WAITORTIMERCALLBACK, 8) + TEST_TYPE_ALIGN (WAITORTIMERCALLBACK, 8) +} + +static void test_pack_WIN32_FILE_ATTRIBUTE_DATA(void) +{ + /* WIN32_FILE_ATTRIBUTE_DATA */ + TEST_TYPE_SIZE (WIN32_FILE_ATTRIBUTE_DATA, 36) + TEST_TYPE_ALIGN (WIN32_FILE_ATTRIBUTE_DATA, 4) + TEST_FIELD_SIZE (WIN32_FILE_ATTRIBUTE_DATA, dwFileAttributes, 4) + TEST_FIELD_ALIGN (WIN32_FILE_ATTRIBUTE_DATA, dwFileAttributes, 4) + TEST_FIELD_OFFSET(WIN32_FILE_ATTRIBUTE_DATA, dwFileAttributes, 0) + TEST_FIELD_SIZE (WIN32_FILE_ATTRIBUTE_DATA, ftCreationTime, 8) + TEST_FIELD_ALIGN (WIN32_FILE_ATTRIBUTE_DATA, ftCreationTime, 4) + TEST_FIELD_OFFSET(WIN32_FILE_ATTRIBUTE_DATA, ftCreationTime, 4) + TEST_FIELD_SIZE (WIN32_FILE_ATTRIBUTE_DATA, ftLastAccessTime, 8) + TEST_FIELD_ALIGN (WIN32_FILE_ATTRIBUTE_DATA, ftLastAccessTime, 4) + TEST_FIELD_OFFSET(WIN32_FILE_ATTRIBUTE_DATA, ftLastAccessTime, 12) + TEST_FIELD_SIZE (WIN32_FILE_ATTRIBUTE_DATA, ftLastWriteTime, 8) + TEST_FIELD_ALIGN (WIN32_FILE_ATTRIBUTE_DATA, ftLastWriteTime, 4) + TEST_FIELD_OFFSET(WIN32_FILE_ATTRIBUTE_DATA, ftLastWriteTime, 20) + TEST_FIELD_SIZE (WIN32_FILE_ATTRIBUTE_DATA, nFileSizeHigh, 4) + TEST_FIELD_ALIGN (WIN32_FILE_ATTRIBUTE_DATA, nFileSizeHigh, 4) + TEST_FIELD_OFFSET(WIN32_FILE_ATTRIBUTE_DATA, nFileSizeHigh, 28) + TEST_FIELD_SIZE (WIN32_FILE_ATTRIBUTE_DATA, nFileSizeLow, 4) + TEST_FIELD_ALIGN (WIN32_FILE_ATTRIBUTE_DATA, nFileSizeLow, 4) + TEST_FIELD_OFFSET(WIN32_FILE_ATTRIBUTE_DATA, nFileSizeLow, 32) +} + +static void test_pack_WIN32_FIND_DATAA(void) +{ + /* WIN32_FIND_DATAA */ + TEST_TYPE_SIZE (WIN32_FIND_DATAA, 320) + TEST_TYPE_ALIGN (WIN32_FIND_DATAA, 4) + TEST_FIELD_SIZE (WIN32_FIND_DATAA, dwFileAttributes, 4) + TEST_FIELD_ALIGN (WIN32_FIND_DATAA, dwFileAttributes, 4) + TEST_FIELD_OFFSET(WIN32_FIND_DATAA, dwFileAttributes, 0) + TEST_FIELD_SIZE (WIN32_FIND_DATAA, ftCreationTime, 8) + TEST_FIELD_ALIGN (WIN32_FIND_DATAA, ftCreationTime, 4) + TEST_FIELD_OFFSET(WIN32_FIND_DATAA, ftCreationTime, 4) + TEST_FIELD_SIZE (WIN32_FIND_DATAA, ftLastAccessTime, 8) + TEST_FIELD_ALIGN (WIN32_FIND_DATAA, ftLastAccessTime, 4) + TEST_FIELD_OFFSET(WIN32_FIND_DATAA, ftLastAccessTime, 12) + TEST_FIELD_SIZE (WIN32_FIND_DATAA, ftLastWriteTime, 8) + TEST_FIELD_ALIGN (WIN32_FIND_DATAA, ftLastWriteTime, 4) + TEST_FIELD_OFFSET(WIN32_FIND_DATAA, ftLastWriteTime, 20) + TEST_FIELD_SIZE (WIN32_FIND_DATAA, nFileSizeHigh, 4) + TEST_FIELD_ALIGN (WIN32_FIND_DATAA, nFileSizeHigh, 4) + TEST_FIELD_OFFSET(WIN32_FIND_DATAA, nFileSizeHigh, 28) + TEST_FIELD_SIZE (WIN32_FIND_DATAA, nFileSizeLow, 4) + TEST_FIELD_ALIGN (WIN32_FIND_DATAA, nFileSizeLow, 4) + TEST_FIELD_OFFSET(WIN32_FIND_DATAA, nFileSizeLow, 32) + TEST_FIELD_SIZE (WIN32_FIND_DATAA, dwReserved0, 4) + TEST_FIELD_ALIGN (WIN32_FIND_DATAA, dwReserved0, 4) + TEST_FIELD_OFFSET(WIN32_FIND_DATAA, dwReserved0, 36) + TEST_FIELD_SIZE (WIN32_FIND_DATAA, dwReserved1, 4) + TEST_FIELD_ALIGN (WIN32_FIND_DATAA, dwReserved1, 4) + TEST_FIELD_OFFSET(WIN32_FIND_DATAA, dwReserved1, 40) + TEST_FIELD_SIZE (WIN32_FIND_DATAA, cFileName, 260) + TEST_FIELD_ALIGN (WIN32_FIND_DATAA, cFileName, 1) + TEST_FIELD_OFFSET(WIN32_FIND_DATAA, cFileName, 44) + TEST_FIELD_SIZE (WIN32_FIND_DATAA, cAlternateFileName, 14) + TEST_FIELD_ALIGN (WIN32_FIND_DATAA, cAlternateFileName, 1) + TEST_FIELD_OFFSET(WIN32_FIND_DATAA, cAlternateFileName, 304) +} + +static void test_pack_WIN32_FIND_DATAW(void) +{ + /* WIN32_FIND_DATAW */ + TEST_TYPE_SIZE (WIN32_FIND_DATAW, 592) + TEST_TYPE_ALIGN (WIN32_FIND_DATAW, 4) + TEST_FIELD_SIZE (WIN32_FIND_DATAW, dwFileAttributes, 4) + TEST_FIELD_ALIGN (WIN32_FIND_DATAW, dwFileAttributes, 4) + TEST_FIELD_OFFSET(WIN32_FIND_DATAW, dwFileAttributes, 0) + TEST_FIELD_SIZE (WIN32_FIND_DATAW, ftCreationTime, 8) + TEST_FIELD_ALIGN (WIN32_FIND_DATAW, ftCreationTime, 4) + TEST_FIELD_OFFSET(WIN32_FIND_DATAW, ftCreationTime, 4) + TEST_FIELD_SIZE (WIN32_FIND_DATAW, ftLastAccessTime, 8) + TEST_FIELD_ALIGN (WIN32_FIND_DATAW, ftLastAccessTime, 4) + TEST_FIELD_OFFSET(WIN32_FIND_DATAW, ftLastAccessTime, 12) + TEST_FIELD_SIZE (WIN32_FIND_DATAW, ftLastWriteTime, 8) + TEST_FIELD_ALIGN (WIN32_FIND_DATAW, ftLastWriteTime, 4) + TEST_FIELD_OFFSET(WIN32_FIND_DATAW, ftLastWriteTime, 20) + TEST_FIELD_SIZE (WIN32_FIND_DATAW, nFileSizeHigh, 4) + TEST_FIELD_ALIGN (WIN32_FIND_DATAW, nFileSizeHigh, 4) + TEST_FIELD_OFFSET(WIN32_FIND_DATAW, nFileSizeHigh, 28) + TEST_FIELD_SIZE (WIN32_FIND_DATAW, nFileSizeLow, 4) + TEST_FIELD_ALIGN (WIN32_FIND_DATAW, nFileSizeLow, 4) + TEST_FIELD_OFFSET(WIN32_FIND_DATAW, nFileSizeLow, 32) + TEST_FIELD_SIZE (WIN32_FIND_DATAW, dwReserved0, 4) + TEST_FIELD_ALIGN (WIN32_FIND_DATAW, dwReserved0, 4) + TEST_FIELD_OFFSET(WIN32_FIND_DATAW, dwReserved0, 36) + TEST_FIELD_SIZE (WIN32_FIND_DATAW, dwReserved1, 4) + TEST_FIELD_ALIGN (WIN32_FIND_DATAW, dwReserved1, 4) + TEST_FIELD_OFFSET(WIN32_FIND_DATAW, dwReserved1, 40) + TEST_FIELD_SIZE (WIN32_FIND_DATAW, cFileName, 520) + TEST_FIELD_ALIGN (WIN32_FIND_DATAW, cFileName, 2) + TEST_FIELD_OFFSET(WIN32_FIND_DATAW, cFileName, 44) + TEST_FIELD_SIZE (WIN32_FIND_DATAW, cAlternateFileName, 28) + TEST_FIELD_ALIGN (WIN32_FIND_DATAW, cAlternateFileName, 2) + TEST_FIELD_OFFSET(WIN32_FIND_DATAW, cAlternateFileName, 564) +} + +static void test_pack_WIN32_STREAM_ID(void) +{ + /* WIN32_STREAM_ID (pack 8) */ + TEST_TYPE_SIZE (WIN32_STREAM_ID, 24) + TEST_TYPE_ALIGN (WIN32_STREAM_ID, 8) + TEST_FIELD_SIZE (WIN32_STREAM_ID, dwStreamId, 4) + TEST_FIELD_ALIGN (WIN32_STREAM_ID, dwStreamId, 4) + TEST_FIELD_OFFSET(WIN32_STREAM_ID, dwStreamId, 0) + TEST_FIELD_SIZE (WIN32_STREAM_ID, dwStreamAttributes, 4) + TEST_FIELD_ALIGN (WIN32_STREAM_ID, dwStreamAttributes, 4) + TEST_FIELD_OFFSET(WIN32_STREAM_ID, dwStreamAttributes, 4) + TEST_FIELD_SIZE (WIN32_STREAM_ID, Size, 8) + TEST_FIELD_ALIGN (WIN32_STREAM_ID, Size, 8) + TEST_FIELD_OFFSET(WIN32_STREAM_ID, Size, 8) + TEST_FIELD_SIZE (WIN32_STREAM_ID, dwStreamNameSize, 4) + TEST_FIELD_ALIGN (WIN32_STREAM_ID, dwStreamNameSize, 4) + TEST_FIELD_OFFSET(WIN32_STREAM_ID, dwStreamNameSize, 16) + TEST_FIELD_SIZE (WIN32_STREAM_ID, cStreamName, 2) + TEST_FIELD_ALIGN (WIN32_STREAM_ID, cStreamName, 2) + TEST_FIELD_OFFSET(WIN32_STREAM_ID, cStreamName, 20) +} + +#else /* _WIN64 */ + +static void test_pack_LPOSVERSIONINFOA(void) +{ + /* LPOSVERSIONINFOA */ + TEST_TYPE_SIZE (LPOSVERSIONINFOA, 4) + TEST_TYPE_ALIGN (LPOSVERSIONINFOA, 4) + TEST_TARGET_SIZE (LPOSVERSIONINFOA, 148) + TEST_TARGET_ALIGN(LPOSVERSIONINFOA, 4) +} + +static void test_pack_LPOSVERSIONINFOEXA(void) +{ + /* LPOSVERSIONINFOEXA */ + TEST_TYPE_SIZE (LPOSVERSIONINFOEXA, 4) + TEST_TYPE_ALIGN (LPOSVERSIONINFOEXA, 4) + TEST_TARGET_SIZE (LPOSVERSIONINFOEXA, 156) + TEST_TARGET_ALIGN(LPOSVERSIONINFOEXA, 4) +} + +static void test_pack_LPOSVERSIONINFOEXW(void) +{ + /* LPOSVERSIONINFOEXW */ + TEST_TYPE_SIZE (LPOSVERSIONINFOEXW, 4) + TEST_TYPE_ALIGN (LPOSVERSIONINFOEXW, 4) + TEST_TARGET_SIZE (LPOSVERSIONINFOEXW, 284) + TEST_TARGET_ALIGN(LPOSVERSIONINFOEXW, 4) +} + +static void test_pack_LPOSVERSIONINFOW(void) +{ + /* LPOSVERSIONINFOW */ + TEST_TYPE_SIZE (LPOSVERSIONINFOW, 4) + TEST_TYPE_ALIGN (LPOSVERSIONINFOW, 4) + TEST_TARGET_SIZE (LPOSVERSIONINFOW, 276) + TEST_TARGET_ALIGN(LPOSVERSIONINFOW, 4) +} + +static void test_pack_OSVERSIONINFOA(void) +{ + /* OSVERSIONINFOA */ + TEST_TYPE_SIZE (OSVERSIONINFOA, 148) + TEST_TYPE_ALIGN (OSVERSIONINFOA, 4) + TEST_FIELD_SIZE (OSVERSIONINFOA, dwOSVersionInfoSize, 4) + TEST_FIELD_ALIGN (OSVERSIONINFOA, dwOSVersionInfoSize, 4) + TEST_FIELD_OFFSET(OSVERSIONINFOA, dwOSVersionInfoSize, 0) + TEST_FIELD_SIZE (OSVERSIONINFOA, dwMajorVersion, 4) + TEST_FIELD_ALIGN (OSVERSIONINFOA, dwMajorVersion, 4) + TEST_FIELD_OFFSET(OSVERSIONINFOA, dwMajorVersion, 4) + TEST_FIELD_SIZE (OSVERSIONINFOA, dwMinorVersion, 4) + TEST_FIELD_ALIGN (OSVERSIONINFOA, dwMinorVersion, 4) + TEST_FIELD_OFFSET(OSVERSIONINFOA, dwMinorVersion, 8) + TEST_FIELD_SIZE (OSVERSIONINFOA, dwBuildNumber, 4) + TEST_FIELD_ALIGN (OSVERSIONINFOA, dwBuildNumber, 4) + TEST_FIELD_OFFSET(OSVERSIONINFOA, dwBuildNumber, 12) + TEST_FIELD_SIZE (OSVERSIONINFOA, dwPlatformId, 4) + TEST_FIELD_ALIGN (OSVERSIONINFOA, dwPlatformId, 4) + TEST_FIELD_OFFSET(OSVERSIONINFOA, dwPlatformId, 16) + TEST_FIELD_SIZE (OSVERSIONINFOA, szCSDVersion, 128) + TEST_FIELD_ALIGN (OSVERSIONINFOA, szCSDVersion, 1) + TEST_FIELD_OFFSET(OSVERSIONINFOA, szCSDVersion, 20) +} + +static void test_pack_OSVERSIONINFOEXA(void) +{ + /* OSVERSIONINFOEXA */ + TEST_TYPE_SIZE (OSVERSIONINFOEXA, 156) + TEST_TYPE_ALIGN (OSVERSIONINFOEXA, 4) + TEST_FIELD_SIZE (OSVERSIONINFOEXA, dwOSVersionInfoSize, 4) + TEST_FIELD_ALIGN (OSVERSIONINFOEXA, dwOSVersionInfoSize, 4) + TEST_FIELD_OFFSET(OSVERSIONINFOEXA, dwOSVersionInfoSize, 0) + TEST_FIELD_SIZE (OSVERSIONINFOEXA, dwMajorVersion, 4) + TEST_FIELD_ALIGN (OSVERSIONINFOEXA, dwMajorVersion, 4) + TEST_FIELD_OFFSET(OSVERSIONINFOEXA, dwMajorVersion, 4) + TEST_FIELD_SIZE (OSVERSIONINFOEXA, dwMinorVersion, 4) + TEST_FIELD_ALIGN (OSVERSIONINFOEXA, dwMinorVersion, 4) + TEST_FIELD_OFFSET(OSVERSIONINFOEXA, dwMinorVersion, 8) + TEST_FIELD_SIZE (OSVERSIONINFOEXA, dwBuildNumber, 4) + TEST_FIELD_ALIGN (OSVERSIONINFOEXA, dwBuildNumber, 4) + TEST_FIELD_OFFSET(OSVERSIONINFOEXA, dwBuildNumber, 12) + TEST_FIELD_SIZE (OSVERSIONINFOEXA, dwPlatformId, 4) + TEST_FIELD_ALIGN (OSVERSIONINFOEXA, dwPlatformId, 4) + TEST_FIELD_OFFSET(OSVERSIONINFOEXA, dwPlatformId, 16) + TEST_FIELD_SIZE (OSVERSIONINFOEXA, szCSDVersion, 128) + TEST_FIELD_ALIGN (OSVERSIONINFOEXA, szCSDVersion, 1) + TEST_FIELD_OFFSET(OSVERSIONINFOEXA, szCSDVersion, 20) + TEST_FIELD_SIZE (OSVERSIONINFOEXA, wServicePackMajor, 2) + TEST_FIELD_ALIGN (OSVERSIONINFOEXA, wServicePackMajor, 2) + TEST_FIELD_OFFSET(OSVERSIONINFOEXA, wServicePackMajor, 148) + TEST_FIELD_SIZE (OSVERSIONINFOEXA, wServicePackMinor, 2) + TEST_FIELD_ALIGN (OSVERSIONINFOEXA, wServicePackMinor, 2) + TEST_FIELD_OFFSET(OSVERSIONINFOEXA, wServicePackMinor, 150) + TEST_FIELD_SIZE (OSVERSIONINFOEXA, wSuiteMask, 2) + TEST_FIELD_ALIGN (OSVERSIONINFOEXA, wSuiteMask, 2) + TEST_FIELD_OFFSET(OSVERSIONINFOEXA, wSuiteMask, 152) + TEST_FIELD_SIZE (OSVERSIONINFOEXA, wProductType, 1) + TEST_FIELD_ALIGN (OSVERSIONINFOEXA, wProductType, 1) + TEST_FIELD_OFFSET(OSVERSIONINFOEXA, wProductType, 154) + TEST_FIELD_SIZE (OSVERSIONINFOEXA, wReserved, 1) + TEST_FIELD_ALIGN (OSVERSIONINFOEXA, wReserved, 1) + TEST_FIELD_OFFSET(OSVERSIONINFOEXA, wReserved, 155) +} + +static void test_pack_OSVERSIONINFOEXW(void) +{ + /* OSVERSIONINFOEXW */ + TEST_TYPE_SIZE (OSVERSIONINFOEXW, 284) + TEST_TYPE_ALIGN (OSVERSIONINFOEXW, 4) + TEST_FIELD_SIZE (OSVERSIONINFOEXW, dwOSVersionInfoSize, 4) + TEST_FIELD_ALIGN (OSVERSIONINFOEXW, dwOSVersionInfoSize, 4) + TEST_FIELD_OFFSET(OSVERSIONINFOEXW, dwOSVersionInfoSize, 0) + TEST_FIELD_SIZE (OSVERSIONINFOEXW, dwMajorVersion, 4) + TEST_FIELD_ALIGN (OSVERSIONINFOEXW, dwMajorVersion, 4) + TEST_FIELD_OFFSET(OSVERSIONINFOEXW, dwMajorVersion, 4) + TEST_FIELD_SIZE (OSVERSIONINFOEXW, dwMinorVersion, 4) + TEST_FIELD_ALIGN (OSVERSIONINFOEXW, dwMinorVersion, 4) + TEST_FIELD_OFFSET(OSVERSIONINFOEXW, dwMinorVersion, 8) + TEST_FIELD_SIZE (OSVERSIONINFOEXW, dwBuildNumber, 4) + TEST_FIELD_ALIGN (OSVERSIONINFOEXW, dwBuildNumber, 4) + TEST_FIELD_OFFSET(OSVERSIONINFOEXW, dwBuildNumber, 12) + TEST_FIELD_SIZE (OSVERSIONINFOEXW, dwPlatformId, 4) + TEST_FIELD_ALIGN (OSVERSIONINFOEXW, dwPlatformId, 4) + TEST_FIELD_OFFSET(OSVERSIONINFOEXW, dwPlatformId, 16) + TEST_FIELD_SIZE (OSVERSIONINFOEXW, szCSDVersion, 256) + TEST_FIELD_ALIGN (OSVERSIONINFOEXW, szCSDVersion, 2) + TEST_FIELD_OFFSET(OSVERSIONINFOEXW, szCSDVersion, 20) + TEST_FIELD_SIZE (OSVERSIONINFOEXW, wServicePackMajor, 2) + TEST_FIELD_ALIGN (OSVERSIONINFOEXW, wServicePackMajor, 2) + TEST_FIELD_OFFSET(OSVERSIONINFOEXW, wServicePackMajor, 276) + TEST_FIELD_SIZE (OSVERSIONINFOEXW, wServicePackMinor, 2) + TEST_FIELD_ALIGN (OSVERSIONINFOEXW, wServicePackMinor, 2) + TEST_FIELD_OFFSET(OSVERSIONINFOEXW, wServicePackMinor, 278) + TEST_FIELD_SIZE (OSVERSIONINFOEXW, wSuiteMask, 2) + TEST_FIELD_ALIGN (OSVERSIONINFOEXW, wSuiteMask, 2) + TEST_FIELD_OFFSET(OSVERSIONINFOEXW, wSuiteMask, 280) + TEST_FIELD_SIZE (OSVERSIONINFOEXW, wProductType, 1) + TEST_FIELD_ALIGN (OSVERSIONINFOEXW, wProductType, 1) + TEST_FIELD_OFFSET(OSVERSIONINFOEXW, wProductType, 282) + TEST_FIELD_SIZE (OSVERSIONINFOEXW, wReserved, 1) + TEST_FIELD_ALIGN (OSVERSIONINFOEXW, wReserved, 1) + TEST_FIELD_OFFSET(OSVERSIONINFOEXW, wReserved, 283) +} + +static void test_pack_OSVERSIONINFOW(void) +{ + /* OSVERSIONINFOW */ TEST_TYPE_SIZE (OSVERSIONINFOW, 276) TEST_TYPE_ALIGN (OSVERSIONINFOW, 4) TEST_FIELD_SIZE (OSVERSIONINFOW, dwOSVersionInfoSize, 4) @@ -312,7 +2159,7 @@ static void test_pack_PHKEY(void) static void test_pack_ACTCTXA(void) { - /* ACTCTXA (pack 4) */ + /* ACTCTXA */ TEST_TYPE_SIZE (ACTCTXA, 32) TEST_TYPE_ALIGN (ACTCTXA, 4) TEST_FIELD_SIZE (ACTCTXA, cbSize, 4) @@ -346,7 +2193,7 @@ static void test_pack_ACTCTXA(void) static void test_pack_ACTCTXW(void) { - /* ACTCTXW (pack 4) */ + /* ACTCTXW */ TEST_TYPE_SIZE (ACTCTXW, 32) TEST_TYPE_ALIGN (ACTCTXW, 4) TEST_FIELD_SIZE (ACTCTXW, cbSize, 4) @@ -380,7 +2227,7 @@ static void test_pack_ACTCTXW(void) static void test_pack_ACTCTX_SECTION_KEYED_DATA(void) { - /* ACTCTX_SECTION_KEYED_DATA (pack 4) */ + /* ACTCTX_SECTION_KEYED_DATA */ TEST_TYPE_SIZE (ACTCTX_SECTION_KEYED_DATA, 64) TEST_TYPE_ALIGN (ACTCTX_SECTION_KEYED_DATA, 4) TEST_FIELD_SIZE (ACTCTX_SECTION_KEYED_DATA, cbSize, 4) @@ -423,7 +2270,7 @@ static void test_pack_ACTCTX_SECTION_KEYED_DATA(void) static void test_pack_ACTCTX_SECTION_KEYED_DATA_2600(void) { - /* ACTCTX_SECTION_KEYED_DATA_2600 (pack 4) */ + /* ACTCTX_SECTION_KEYED_DATA_2600 */ TEST_TYPE_SIZE (ACTCTX_SECTION_KEYED_DATA_2600, 40) TEST_TYPE_ALIGN (ACTCTX_SECTION_KEYED_DATA_2600, 4) TEST_FIELD_SIZE (ACTCTX_SECTION_KEYED_DATA_2600, cbSize, 4) @@ -460,7 +2307,7 @@ static void test_pack_ACTCTX_SECTION_KEYED_DATA_2600(void) static void test_pack_ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA(void) { - /* ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA (pack 4) */ + /* ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA */ TEST_TYPE_SIZE (ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA, 20) TEST_TYPE_ALIGN (ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA, 4) TEST_FIELD_SIZE (ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA, lpInformation, 4) @@ -482,7 +2329,7 @@ static void test_pack_ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA(void) static void test_pack_ACTIVATION_CONTEXT_BASIC_INFORMATION(void) { - /* ACTIVATION_CONTEXT_BASIC_INFORMATION (pack 4) */ + /* ACTIVATION_CONTEXT_BASIC_INFORMATION */ TEST_TYPE_SIZE (ACTIVATION_CONTEXT_BASIC_INFORMATION, 8) TEST_TYPE_ALIGN (ACTIVATION_CONTEXT_BASIC_INFORMATION, 4) TEST_FIELD_SIZE (ACTIVATION_CONTEXT_BASIC_INFORMATION, hActCtx, 4) @@ -495,7 +2342,7 @@ static void test_pack_ACTIVATION_CONTEXT_BASIC_INFORMATION(void) static void test_pack_BY_HANDLE_FILE_INFORMATION(void) { - /* BY_HANDLE_FILE_INFORMATION (pack 4) */ + /* BY_HANDLE_FILE_INFORMATION */ TEST_TYPE_SIZE (BY_HANDLE_FILE_INFORMATION, 52) TEST_TYPE_ALIGN (BY_HANDLE_FILE_INFORMATION, 4) TEST_FIELD_SIZE (BY_HANDLE_FILE_INFORMATION, dwFileAttributes, 4) @@ -532,7 +2379,7 @@ static void test_pack_BY_HANDLE_FILE_INFORMATION(void) static void test_pack_COMMCONFIG(void) { - /* COMMCONFIG (pack 4) */ + /* COMMCONFIG */ TEST_TYPE_SIZE (COMMCONFIG, 52) TEST_TYPE_ALIGN (COMMCONFIG, 4) TEST_FIELD_SIZE (COMMCONFIG, dwSize, 4) @@ -563,7 +2410,7 @@ static void test_pack_COMMCONFIG(void) static void test_pack_COMMPROP(void) { - /* COMMPROP (pack 4) */ + /* COMMPROP */ TEST_TYPE_SIZE (COMMPROP, 64) TEST_TYPE_ALIGN (COMMPROP, 4) TEST_FIELD_SIZE (COMMPROP, wPacketLength, 2) @@ -624,7 +2471,7 @@ static void test_pack_COMMPROP(void) static void test_pack_COMMTIMEOUTS(void) { - /* COMMTIMEOUTS (pack 4) */ + /* COMMTIMEOUTS */ TEST_TYPE_SIZE (COMMTIMEOUTS, 20) TEST_TYPE_ALIGN (COMMTIMEOUTS, 4) TEST_FIELD_SIZE (COMMTIMEOUTS, ReadIntervalTimeout, 4) @@ -646,7 +2493,7 @@ static void test_pack_COMMTIMEOUTS(void) static void test_pack_COMSTAT(void) { - /* COMSTAT (pack 4) */ + /* COMSTAT */ TEST_TYPE_SIZE (COMSTAT, 12) TEST_TYPE_ALIGN (COMSTAT, 4) TEST_FIELD_SIZE (COMSTAT, cbInQue, 4) @@ -659,7 +2506,7 @@ static void test_pack_COMSTAT(void) static void test_pack_CREATE_PROCESS_DEBUG_INFO(void) { - /* CREATE_PROCESS_DEBUG_INFO (pack 4) */ + /* CREATE_PROCESS_DEBUG_INFO */ TEST_TYPE_SIZE (CREATE_PROCESS_DEBUG_INFO, 40) TEST_TYPE_ALIGN (CREATE_PROCESS_DEBUG_INFO, 4) TEST_FIELD_SIZE (CREATE_PROCESS_DEBUG_INFO, hFile, 4) @@ -696,7 +2543,7 @@ static void test_pack_CREATE_PROCESS_DEBUG_INFO(void) static void test_pack_CREATE_THREAD_DEBUG_INFO(void) { - /* CREATE_THREAD_DEBUG_INFO (pack 4) */ + /* CREATE_THREAD_DEBUG_INFO */ TEST_TYPE_SIZE (CREATE_THREAD_DEBUG_INFO, 12) TEST_TYPE_ALIGN (CREATE_THREAD_DEBUG_INFO, 4) TEST_FIELD_SIZE (CREATE_THREAD_DEBUG_INFO, hThread, 4) @@ -724,7 +2571,7 @@ static void test_pack_CRITICAL_SECTION_DEBUG(void) static void test_pack_DCB(void) { - /* DCB (pack 4) */ + /* DCB */ TEST_TYPE_SIZE (DCB, 28) TEST_TYPE_ALIGN (DCB, 4) TEST_FIELD_SIZE (DCB, DCBlength, 4) @@ -773,7 +2620,7 @@ static void test_pack_DCB(void) static void test_pack_DEBUG_EVENT(void) { - /* DEBUG_EVENT (pack 4) */ + /* DEBUG_EVENT */ TEST_FIELD_SIZE (DEBUG_EVENT, dwDebugEventCode, 4) TEST_FIELD_ALIGN (DEBUG_EVENT, dwDebugEventCode, 4) TEST_FIELD_OFFSET(DEBUG_EVENT, dwDebugEventCode, 0) @@ -829,7 +2676,7 @@ static void test_pack_ENUMRESTYPEPROCW(void) static void test_pack_EXCEPTION_DEBUG_INFO(void) { - /* EXCEPTION_DEBUG_INFO (pack 4) */ + /* EXCEPTION_DEBUG_INFO */ TEST_TYPE_SIZE (EXCEPTION_DEBUG_INFO, 84) TEST_TYPE_ALIGN (EXCEPTION_DEBUG_INFO, 4) TEST_FIELD_SIZE (EXCEPTION_DEBUG_INFO, ExceptionRecord, 80) @@ -842,7 +2689,7 @@ static void test_pack_EXCEPTION_DEBUG_INFO(void) static void test_pack_EXIT_PROCESS_DEBUG_INFO(void) { - /* EXIT_PROCESS_DEBUG_INFO (pack 4) */ + /* EXIT_PROCESS_DEBUG_INFO */ TEST_TYPE_SIZE (EXIT_PROCESS_DEBUG_INFO, 4) TEST_TYPE_ALIGN (EXIT_PROCESS_DEBUG_INFO, 4) TEST_FIELD_SIZE (EXIT_PROCESS_DEBUG_INFO, dwExitCode, 4) @@ -852,7 +2699,7 @@ static void test_pack_EXIT_PROCESS_DEBUG_INFO(void) static void test_pack_EXIT_THREAD_DEBUG_INFO(void) { - /* EXIT_THREAD_DEBUG_INFO (pack 4) */ + /* EXIT_THREAD_DEBUG_INFO */ TEST_TYPE_SIZE (EXIT_THREAD_DEBUG_INFO, 4) TEST_TYPE_ALIGN (EXIT_THREAD_DEBUG_INFO, 4) TEST_FIELD_SIZE (EXIT_THREAD_DEBUG_INFO, dwExitCode, 4) @@ -862,7 +2709,7 @@ static void test_pack_EXIT_THREAD_DEBUG_INFO(void) static void test_pack_HW_PROFILE_INFOA(void) { - /* HW_PROFILE_INFOA (pack 4) */ + /* HW_PROFILE_INFOA */ TEST_TYPE_SIZE (HW_PROFILE_INFOA, 124) TEST_TYPE_ALIGN (HW_PROFILE_INFOA, 4) TEST_FIELD_SIZE (HW_PROFILE_INFOA, dwDockInfo, 4) @@ -878,7 +2725,7 @@ static void test_pack_HW_PROFILE_INFOA(void) static void test_pack_HW_PROFILE_INFOW(void) { - /* HW_PROFILE_INFOW (pack 4) */ + /* HW_PROFILE_INFOW */ TEST_TYPE_SIZE (HW_PROFILE_INFOW, 244) TEST_TYPE_ALIGN (HW_PROFILE_INFOW, 4) TEST_FIELD_SIZE (HW_PROFILE_INFOW, dwDockInfo, 4) @@ -894,7 +2741,7 @@ static void test_pack_HW_PROFILE_INFOW(void) static void test_pack_LOAD_DLL_DEBUG_INFO(void) { - /* LOAD_DLL_DEBUG_INFO (pack 4) */ + /* LOAD_DLL_DEBUG_INFO */ TEST_TYPE_SIZE (LOAD_DLL_DEBUG_INFO, 24) TEST_TYPE_ALIGN (LOAD_DLL_DEBUG_INFO, 4) TEST_FIELD_SIZE (LOAD_DLL_DEBUG_INFO, hFile, 4) @@ -1201,7 +3048,7 @@ static void test_pack_LPWIN32_STREAM_ID(void) static void test_pack_MEMORYSTATUS(void) { - /* MEMORYSTATUS (pack 4) */ + /* MEMORYSTATUS */ TEST_TYPE_SIZE (MEMORYSTATUS, 32) TEST_TYPE_ALIGN (MEMORYSTATUS, 4) TEST_FIELD_SIZE (MEMORYSTATUS, dwLength, 4) @@ -1266,7 +3113,7 @@ static void test_pack_MEMORYSTATUSEX(void) static void test_pack_OFSTRUCT(void) { - /* OFSTRUCT (pack 4) */ + /* OFSTRUCT */ TEST_TYPE_SIZE (OFSTRUCT, 136) TEST_TYPE_ALIGN (OFSTRUCT, 2) TEST_FIELD_SIZE (OFSTRUCT, cBytes, 1) @@ -1291,7 +3138,7 @@ static void test_pack_OFSTRUCT(void) static void test_pack_OUTPUT_DEBUG_STRING_INFO(void) { - /* OUTPUT_DEBUG_STRING_INFO (pack 4) */ + /* OUTPUT_DEBUG_STRING_INFO */ TEST_TYPE_SIZE (OUTPUT_DEBUG_STRING_INFO, 8) TEST_TYPE_ALIGN (OUTPUT_DEBUG_STRING_INFO, 4) TEST_FIELD_SIZE (OUTPUT_DEBUG_STRING_INFO, lpDebugStringData, 4) @@ -1475,7 +3322,7 @@ static void test_pack_PQUERYACTCTXW_FUNC(void) static void test_pack_PROCESS_HEAP_ENTRY(void) { - /* PROCESS_HEAP_ENTRY (pack 4) */ + /* PROCESS_HEAP_ENTRY */ TEST_FIELD_SIZE (PROCESS_HEAP_ENTRY, lpData, 4) TEST_FIELD_ALIGN (PROCESS_HEAP_ENTRY, lpData, 4) TEST_FIELD_OFFSET(PROCESS_HEAP_ENTRY, lpData, 0) @@ -1495,7 +3342,7 @@ static void test_pack_PROCESS_HEAP_ENTRY(void) static void test_pack_PROCESS_INFORMATION(void) { - /* PROCESS_INFORMATION (pack 4) */ + /* PROCESS_INFORMATION */ TEST_TYPE_SIZE (PROCESS_INFORMATION, 16) TEST_TYPE_ALIGN (PROCESS_INFORMATION, 4) TEST_FIELD_SIZE (PROCESS_INFORMATION, hProcess, 4) @@ -1566,7 +3413,7 @@ static void test_pack_PWIN32_FIND_DATAW(void) static void test_pack_RIP_INFO(void) { - /* RIP_INFO (pack 4) */ + /* RIP_INFO */ TEST_TYPE_SIZE (RIP_INFO, 8) TEST_TYPE_ALIGN (RIP_INFO, 4) TEST_FIELD_SIZE (RIP_INFO, dwError, 4) @@ -1579,7 +3426,7 @@ static void test_pack_RIP_INFO(void) static void test_pack_SECURITY_ATTRIBUTES(void) { - /* SECURITY_ATTRIBUTES (pack 4) */ + /* SECURITY_ATTRIBUTES */ TEST_TYPE_SIZE (SECURITY_ATTRIBUTES, 12) TEST_TYPE_ALIGN (SECURITY_ATTRIBUTES, 4) TEST_FIELD_SIZE (SECURITY_ATTRIBUTES, nLength, 4) @@ -1595,7 +3442,7 @@ static void test_pack_SECURITY_ATTRIBUTES(void) static void test_pack_STARTUPINFOA(void) { - /* STARTUPINFOA (pack 4) */ + /* STARTUPINFOA */ TEST_TYPE_SIZE (STARTUPINFOA, 68) TEST_TYPE_ALIGN (STARTUPINFOA, 4) TEST_FIELD_SIZE (STARTUPINFOA, cb, 4) @@ -1656,7 +3503,7 @@ static void test_pack_STARTUPINFOA(void) static void test_pack_STARTUPINFOW(void) { - /* STARTUPINFOW (pack 4) */ + /* STARTUPINFOW */ TEST_TYPE_SIZE (STARTUPINFOW, 68) TEST_TYPE_ALIGN (STARTUPINFOW, 4) TEST_FIELD_SIZE (STARTUPINFOW, cb, 4) @@ -1717,7 +3564,7 @@ static void test_pack_STARTUPINFOW(void) static void test_pack_SYSTEMTIME(void) { - /* SYSTEMTIME (pack 4) */ + /* SYSTEMTIME */ TEST_TYPE_SIZE (SYSTEMTIME, 16) TEST_TYPE_ALIGN (SYSTEMTIME, 2) TEST_FIELD_SIZE (SYSTEMTIME, wYear, 2) @@ -1748,12 +3595,12 @@ static void test_pack_SYSTEMTIME(void) static void test_pack_SYSTEM_INFO(void) { - /* SYSTEM_INFO (pack 4) */ + /* SYSTEM_INFO */ } static void test_pack_SYSTEM_POWER_STATUS(void) { - /* SYSTEM_POWER_STATUS (pack 4) */ + /* SYSTEM_POWER_STATUS */ TEST_TYPE_SIZE (SYSTEM_POWER_STATUS, 12) TEST_TYPE_ALIGN (SYSTEM_POWER_STATUS, 4) TEST_FIELD_SIZE (SYSTEM_POWER_STATUS, ACLineStatus, 1) @@ -1778,7 +3625,7 @@ static void test_pack_SYSTEM_POWER_STATUS(void) static void test_pack_TIME_ZONE_INFORMATION(void) { - /* TIME_ZONE_INFORMATION (pack 4) */ + /* TIME_ZONE_INFORMATION */ TEST_TYPE_SIZE (TIME_ZONE_INFORMATION, 172) TEST_TYPE_ALIGN (TIME_ZONE_INFORMATION, 4) TEST_FIELD_SIZE (TIME_ZONE_INFORMATION, Bias, 4) @@ -1806,7 +3653,7 @@ static void test_pack_TIME_ZONE_INFORMATION(void) static void test_pack_UNLOAD_DLL_DEBUG_INFO(void) { - /* UNLOAD_DLL_DEBUG_INFO (pack 4) */ + /* UNLOAD_DLL_DEBUG_INFO */ TEST_TYPE_SIZE (UNLOAD_DLL_DEBUG_INFO, 4) TEST_TYPE_ALIGN (UNLOAD_DLL_DEBUG_INFO, 4) TEST_FIELD_SIZE (UNLOAD_DLL_DEBUG_INFO, lpBaseOfDll, 4) @@ -1823,7 +3670,7 @@ static void test_pack_WAITORTIMERCALLBACK(void) static void test_pack_WIN32_FILE_ATTRIBUTE_DATA(void) { - /* WIN32_FILE_ATTRIBUTE_DATA (pack 4) */ + /* WIN32_FILE_ATTRIBUTE_DATA */ TEST_TYPE_SIZE (WIN32_FILE_ATTRIBUTE_DATA, 36) TEST_TYPE_ALIGN (WIN32_FILE_ATTRIBUTE_DATA, 4) TEST_FIELD_SIZE (WIN32_FILE_ATTRIBUTE_DATA, dwFileAttributes, 4) @@ -1848,7 +3695,7 @@ static void test_pack_WIN32_FILE_ATTRIBUTE_DATA(void) static void test_pack_WIN32_FIND_DATAA(void) { - /* WIN32_FIND_DATAA (pack 4) */ + /* WIN32_FIND_DATAA */ TEST_TYPE_SIZE (WIN32_FIND_DATAA, 320) TEST_TYPE_ALIGN (WIN32_FIND_DATAA, 4) TEST_FIELD_SIZE (WIN32_FIND_DATAA, dwFileAttributes, 4) @@ -1885,7 +3732,7 @@ static void test_pack_WIN32_FIND_DATAA(void) static void test_pack_WIN32_FIND_DATAW(void) { - /* WIN32_FIND_DATAW (pack 4) */ + /* WIN32_FIND_DATAW */ TEST_TYPE_SIZE (WIN32_FIND_DATAW, 592) TEST_TYPE_ALIGN (WIN32_FIND_DATAW, 4) TEST_FIELD_SIZE (WIN32_FIND_DATAW, dwFileAttributes, 4) @@ -1942,6 +3789,8 @@ static void test_pack_WIN32_STREAM_ID(void) TEST_FIELD_OFFSET(WIN32_STREAM_ID, cStreamName, 20) } +#endif /* _WIN64 */ + static void test_pack(void) { test_pack_ACTCTXA(); @@ -2072,9 +3921,5 @@ static void test_pack(void) START_TEST(generated) { -#ifdef _WIN64 - ok(0, "The type size / alignment tests don't support Win64 yet\n"); -#else test_pack(); -#endif } diff --git a/rostests/winetests/kernel32/heap.c b/rostests/winetests/kernel32/heap.c index 7c755b9d509..1d49def44d8 100755 --- a/rostests/winetests/kernel32/heap.c +++ b/rostests/winetests/kernel32/heap.c @@ -30,7 +30,6 @@ #include "wine/test.h" - #define MAGIC_DEAD 0xdeadbeef /* some undocumented flags (names are made up) */ @@ -531,7 +530,7 @@ static void test_heap_checks( DWORD flags ) ok( p[15] == 0, "wrong padding %x\n", p[15] ); } } - else skip( "realloc in place failed\n "); + else skip( "realloc in place failed\n"); ret = HeapFree( GetProcessHeap(), 0, p ); ok( ret, "HeapFree failed\n" ); diff --git a/rostests/winetests/kernel32/path.c b/rostests/winetests/kernel32/path.c index be019483d57..8232fdfaaa7 100755 --- a/rostests/winetests/kernel32/path.c +++ b/rostests/winetests/kernel32/path.c @@ -1017,7 +1017,7 @@ static void test_GetLongPathNameA(void) /* Test a normal path with a small buffer size */ memset(temppath, 0, MAX_PATH); length = pGetLongPathNameA(tempfile, temppath, 4); - /* We have a failure so length should be the minumum plus the terminating '0' */ + /* We have a failure so length should be the minimum plus the terminating '0' */ ok(length >= lstrlen(tempfile) + 1, "Wrong length\n"); ok(temppath[0] == 0, "Buffer should not have been touched\n"); diff --git a/rostests/winetests/kernel32/thread.c b/rostests/winetests/kernel32/thread.c index afa67592a4a..4c4e764939d 100755 --- a/rostests/winetests/kernel32/thread.c +++ b/rostests/winetests/kernel32/thread.c @@ -814,9 +814,19 @@ static VOID test_thread_processor(void) ok(SetThreadAffinityMask(curthread,processMask+1)==0, "SetThreadAffinityMask passed for an illegal processor\n"); /* NOTE: Pre-Vista does not recognize the "all processors" flag (all bits set) */ - retMask = SetThreadAffinityMask(curthread,~0UL); + retMask = SetThreadAffinityMask(curthread,~0); ok(broken(retMask==0) || retMask==processMask, "SetThreadAffinityMask(thread,-1) failed to request all processors.\n"); + if (retMask == processMask && sizeof(ULONG_PTR) > sizeof(ULONG)) + { + /* only the low 32-bits matter */ + retMask = SetThreadAffinityMask(curthread,~(ULONG_PTR)0); + ok(retMask == processMask, "SetThreadAffinityMask failed\n"); + retMask = SetThreadAffinityMask(curthread,~(ULONG_PTR)0 >> 3); + ok(retMask == processMask, "SetThreadAffinityMask failed\n"); + retMask = SetThreadAffinityMask(curthread,~(ULONG_PTR)1); + ok(retMask == 0, "SetThreadAffinityMask succeeded\n"); + } /* NOTE: This only works on WinNT/2000/XP) */ if (pSetThreadIdealProcessor) { SetLastError(0xdeadbeef); From 07d8f76a27ec0a57e9b72e5d3ce9cd65227b1f53 Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Thu, 22 Apr 2010 11:25:56 +0000 Subject: [PATCH 035/131] [REGEDIT] Only set a registry path if the root node is not selected, adjust checks See issue #5297 for more details. svn path=/trunk/; revision=46991 --- reactos/base/applications/regedit/framewnd.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/reactos/base/applications/regedit/framewnd.c b/reactos/base/applications/regedit/framewnd.c index 6a90cc3edd2..9f42346e550 100644 --- a/reactos/base/applications/regedit/framewnd.c +++ b/reactos/base/applications/regedit/framewnd.c @@ -356,11 +356,11 @@ static UINT_PTR CALLBACK ExportRegistryFile_OFNHookProc(HWND hdlg, UINT uiMsg, W hwndExportAll = GetDlgItem(hdlg, IDC_EXPORT_ALL); if (hwndExportAll) - SendMessage(hwndExportAll, BM_SETCHECK, pszSelectedKey[0] ? BST_UNCHECKED : BST_CHECKED, 0); + SendMessage(hwndExportAll, BM_SETCHECK, pszSelectedKey ? BST_UNCHECKED : BST_CHECKED, 0); hwndExportBranch = GetDlgItem(hdlg, IDC_EXPORT_BRANCH); if (hwndExportBranch) - SendMessage(hwndExportBranch, BM_SETCHECK, pszSelectedKey[0] ? BST_CHECKED : BST_UNCHECKED, 0); + SendMessage(hwndExportBranch, BM_SETCHECK, pszSelectedKey ? BST_CHECKED : BST_UNCHECKED, 0); hwndExportBranchText = GetDlgItem(hdlg, IDC_EXPORT_BRANCH_TEXT); if (hwndExportBranchText) @@ -406,7 +406,12 @@ BOOL ExportRegistryFile(HWND hWnd) InitOpenFileName(hWnd, &ofn); LoadString(hInst, IDS_EXPORT_REG_FILE, Caption, sizeof(Caption)/sizeof(TCHAR)); ofn.lpstrTitle = Caption; - ofn.lCustData = (LPARAM) ExportKeyPath; + + /* Only set the path if a key (not the root node) is selected */ + if (hKeyRoot != 0) + { + ofn.lCustData = (LPARAM) ExportKeyPath; + } ofn.Flags = OFN_ENABLETEMPLATE | OFN_EXPLORER | OFN_ENABLEHOOK; ofn.lpfnHook = ExportRegistryFile_OFNHookProc; ofn.lpTemplateName = MAKEINTRESOURCE(IDD_EXPORTRANGE); From af6172876cb5f7eb84980f5f0b45bf4141fd7ece Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Thu, 22 Apr 2010 12:49:20 +0000 Subject: [PATCH 036/131] [REGEDIT] - Don't assign an uninitialized custom filter buffer to the OPENFILENAME structure, clean up commented out code - Allows standard file type filters to show up See issue #5307 for more details. svn path=/trunk/; revision=46992 --- reactos/base/applications/regedit/framewnd.c | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/reactos/base/applications/regedit/framewnd.c b/reactos/base/applications/regedit/framewnd.c index 9f42346e550..a6b4144bcef 100644 --- a/reactos/base/applications/regedit/framewnd.c +++ b/reactos/base/applications/regedit/framewnd.c @@ -228,8 +228,6 @@ static BOOL CheckCommDlgError(HWND hWnd) return TRUE; } -#define MAX_CUSTOM_FILTER_SIZE 50 -TCHAR CustomFilterBuffer[MAX_CUSTOM_FILTER_SIZE]; TCHAR FileNameBuffer[_MAX_PATH]; TCHAR FileTitleBuffer[_MAX_PATH]; @@ -275,25 +273,11 @@ static BOOL InitOpenFileName(HWND hWnd, OPENFILENAME* pofn) BuildFilterStrings(Filter, FilterPairs, sizeof(FilterPairs) / sizeof(FILTERPAIR)); pofn->lpstrFilter = Filter; - pofn->lpstrCustomFilter = CustomFilterBuffer; - pofn->nMaxCustFilter = MAX_CUSTOM_FILTER_SIZE; - pofn->nFilterIndex = 0; pofn->lpstrFile = FileNameBuffer; pofn->nMaxFile = _MAX_PATH; pofn->lpstrFileTitle = FileTitleBuffer; pofn->nMaxFileTitle = _MAX_PATH; - /* pofn->lpstrInitialDir = _T("");*/ - /* pofn->lpstrTitle = _T("Import Registry File");*/ - /* pofn->Flags = OFN_ENABLETEMPLATE + OFN_EXPLORER + OFN_ENABLESIZING;*/ pofn->Flags = OFN_HIDEREADONLY; - /* pofn->nFileOffset = ;*/ - /* pofn->nFileExtension = ;*/ - /* pofn->lpstrDefExt = _T("");*/ - /* pofn->lCustData = ;*/ - /* pofn->lpfnHook = ImportRegistryFile_OFNHookProc;*/ - /* pofn->lpTemplateName = _T("ID_DLG_IMPORT_REGFILE");*/ - /* pofn->lpTemplateName = MAKEINTRESOURCE(IDD_DIALOG1);*/ - /* pofn->FlagsEx = ;*/ return TRUE; } From c0d168b15aeb3a5de1d71bc39d3f523fd71b18b7 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Thu, 22 Apr 2010 20:35:58 +0000 Subject: [PATCH 037/131] [PCI] - Forward IRPs to our PDO instead of just completing them - Handle IRP_MN_START_DEVICE on the way back up the stack (allows the PDO code to assign resources to the bus) - Add some synchronous IRP forwarding copied from i8042prt svn path=/trunk/; revision=46996 --- reactos/drivers/bus/pci/fdo.c | 86 ++++++++++++++++++++++++++--------- 1 file changed, 65 insertions(+), 21 deletions(-) diff --git a/reactos/drivers/bus/pci/fdo.c b/reactos/drivers/bus/pci/fdo.c index 8072a89b455..b6753e10a5e 100644 --- a/reactos/drivers/bus/pci/fdo.c +++ b/reactos/drivers/bus/pci/fdo.c @@ -16,6 +16,46 @@ /*** PRIVATE *****************************************************************/ +static IO_COMPLETION_ROUTINE ForwardIrpAndWaitCompletion; + +static NTSTATUS NTAPI +ForwardIrpAndWaitCompletion( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + IN PVOID Context) +{ + UNREFERENCED_PARAMETER(DeviceObject); + if (Irp->PendingReturned) + KeSetEvent((PKEVENT)Context, IO_NO_INCREMENT, FALSE); + return STATUS_MORE_PROCESSING_REQUIRED; +} + +NTSTATUS NTAPI +ForwardIrpAndWait( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp) +{ + KEVENT Event; + NTSTATUS Status; + PDEVICE_OBJECT LowerDevice = ((PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->Ldo; + ASSERT(LowerDevice); + + KeInitializeEvent(&Event, NotificationEvent, FALSE); + IoCopyCurrentIrpStackLocationToNext(Irp); + + IoSetCompletionRoutine(Irp, ForwardIrpAndWaitCompletion, &Event, TRUE, TRUE, TRUE); + + Status = IoCallDriver(LowerDevice, Irp); + if (Status == STATUS_PENDING) + { + Status = KeWaitForSingleObject(&Event, Suspended, KernelMode, FALSE, NULL); + if (NT_SUCCESS(Status)) + Status = Irp->IoStatus.Status; + } + + return Status; +} + static NTSTATUS FdoLocateChildDevice( PPCI_DEVICE *Device, @@ -466,7 +506,7 @@ FdoPnpControl( { PFDO_DEVICE_EXTENSION DeviceExtension; PIO_STACK_LOCATION IrpSp; - NTSTATUS Status; + NTSTATUS Status = Irp->IoStatus.Status; DPRINT("Called\n"); @@ -492,8 +532,13 @@ FdoPnpControl( break; #endif case IRP_MN_QUERY_DEVICE_RELATIONS: + if (IrpSp->Parameters.QueryDeviceRelations.Type != BusRelations) + break; + Status = FdoQueryBusRelations(DeviceObject, Irp, IrpSp); - break; + Irp->IoStatus.Status = Status; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + return Status; #if 0 case IRP_MN_QUERY_PNP_DEVICE_STATE: Status = STATUS_NOT_IMPLEMENTED; @@ -513,38 +558,37 @@ FdoPnpControl( #endif case IRP_MN_START_DEVICE: DPRINT("IRP_MN_START_DEVICE received\n"); - Status = FdoStartDevice(DeviceObject, Irp); - break; + Status = ForwardIrpAndWait(DeviceObject, Irp); + if (NT_SUCCESS(Status)) + Status = FdoStartDevice(DeviceObject, Irp); + + Irp->IoStatus.Status = Status; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + return Status; case IRP_MN_STOP_DEVICE: /* Currently not supported */ Status = STATUS_UNSUCCESSFUL; - break; + Irp->IoStatus.Status = Status; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + return Status; #if 0 case IRP_MN_SURPRISE_REMOVAL: Status = STATUS_NOT_IMPLEMENTED; break; #endif + case IRP_MN_FILTER_RESOURCE_REQUIREMENTS: + break; + case IRP_MN_REMOVE_DEVICE: + DPRINT1("IRP_MN_REMOVE_DEVICE is UNIMPLEMENTED!\n"); + break; default: DPRINT1("Unknown IOCTL 0x%lx\n", IrpSp->MinorFunction); - /* fall through */ - - case IRP_MN_FILTER_RESOURCE_REQUIREMENTS: - /* - * Do NOT complete the IRP as it will be processed by the lower - * device object, which will complete the IRP - */ - IoSkipCurrentIrpStackLocation(Irp); - Status = IoCallDriver(DeviceExtension->Ldo, Irp); - return Status; break; } - - if (Status != STATUS_PENDING) { - if (Status != STATUS_NOT_IMPLEMENTED) - Irp->IoStatus.Status = Status; - IoCompleteRequest(Irp, IO_NO_INCREMENT); - } + Irp->IoStatus.Status = Status; + IoSkipCurrentIrpStackLocation(Irp); + Status = IoCallDriver(DeviceExtension->Ldo, Irp); DPRINT("Leaving. Status 0x%X\n", Status); From 1e1d4a34ac9f9127b79b1110d55f0df4413a0e82 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Thu, 22 Apr 2010 21:07:46 +0000 Subject: [PATCH 038/131] [NTOSKRNL] - Add a stub for IRP_MN_REMOVE_DEVICE in PnpRoot - Revert 2 incorrect changes from r46983 (DNF_ENUMERATED added to the DNF_ADDED assertion and setting the DNF_RESOURCE_REPORTED flag in IopStartDevice2) - Set the DNF_LEGACY_DRIVER flag if the AddDevice handler is missing - Add a helper function called IopSendRemoveDevice which sends IRP_MN_REMOVE_DEVICE to a device object - Call IopSendRemoveDevice if IRP_MN_START_DEVICE fails - Set the DNF_STARTED and DNF_ADDED flags for legacy drivers - Enable the DNF_ADDED assertion in IopStartDevice2 svn path=/trunk/; revision=46997 --- reactos/ntoskrnl/io/pnpmgr/pnpmgr.c | 54 ++++++++++++++++++---------- reactos/ntoskrnl/io/pnpmgr/pnproot.c | 5 +++ 2 files changed, 41 insertions(+), 18 deletions(-) diff --git a/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c b/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c index dbfada18ed9..645b837de81 100644 --- a/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c +++ b/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c @@ -66,19 +66,20 @@ IopInitializeDevice(PDEVICE_NODE DeviceNode, NTSTATUS Status; if (!DriverObject->DriverExtension->AddDevice) + { + DeviceNode->Flags |= DNF_LEGACY_DRIVER; + } + + if (DeviceNode->Flags & DNF_LEGACY_DRIVER) + { + DeviceNode->Flags |= DNF_ADDED + DNF_STARTED; return STATUS_SUCCESS; + } /* This is a Plug and Play driver */ DPRINT("Plug and Play driver found\n"); ASSERT(DeviceNode->PhysicalDeviceObject); - /* Check if this plug-and-play driver is used as a legacy one for this device node */ - if (IopDeviceNodeHasFlag(DeviceNode, DNF_LEGACY_DRIVER)) - { - IopDeviceNodeSetFlag(DeviceNode, DNF_ADDED); - return STATUS_SUCCESS; - } - DPRINT("Calling %wZ->AddDevice(%wZ)\n", &DriverObject->DriverName, &DeviceNode->InstancePath); @@ -122,6 +123,21 @@ IopInitializeDevice(PDEVICE_NODE DeviceNode, return STATUS_SUCCESS; } +VOID +NTAPI +IopSendRemoveDevice(IN PDEVICE_OBJECT DeviceObject) +{ + IO_STACK_LOCATION Stack; + PVOID Dummy; + + RtlZeroMemory(&Stack, sizeof(IO_STACK_LOCATION)); + Stack.MajorFunction = IRP_MJ_PNP; + Stack.MinorFunction = IRP_MN_REMOVE_DEVICE; + + /* Drivers should never fail a IRP_MN_REMOVE_DEVICE request */ + IopSynchronousCall(DeviceObject, &Stack, &Dummy); +} + VOID NTAPI IopStartDevice2(IN PDEVICE_OBJECT DeviceObject) @@ -156,10 +172,11 @@ IopStartDevice2(IN PDEVICE_OBJECT DeviceObject) Status = IopSynchronousCall(DeviceObject, &Stack, &Dummy); if (!NT_SUCCESS(Status)) { - /* We failed start */ - DeviceNode->Flags |= DNF_START_FAILED; + /* Send an IRP_MN_REMOVE_DEVICE request */ + IopSendRemoveDevice(DeviceObject); - /* TODO: Undo all the stuff we did up to this point */ + /* Set the appropriate flag */ + DeviceNode->Flags |= DNF_START_FAILED; DPRINT1("Warning: PnP Start failed (%wZ)\n", &DeviceNode->InstancePath); return; @@ -168,9 +185,6 @@ IopStartDevice2(IN PDEVICE_OBJECT DeviceObject) /* Otherwise, mark us as started */ DeviceNode->Flags |= DNF_STARTED; - /* We reported the resources */ - DeviceNode->Flags |= DNF_RESOURCE_REPORTED; - /* We now need enumeration */ DeviceNode->Flags |= DNF_NEED_ENUMERATION_ONLY; } @@ -184,10 +198,7 @@ IopStartAndEnumerateDevice(IN PDEVICE_NODE DeviceNode) PAGED_CODE(); /* Sanity check */ - // ASSERT((DeviceNode->Flags & DNF_ADDED) || (DeviceNode->Flags & DNF_ENUMERATED)); - if (!(DeviceNode->Flags & DNF_ADDED) && !(DeviceNode->Flags & DNF_ENUMERATED)) - DPRINT1("Warning: Starting a device node without DNF_ADDED or DNF_ENUMERATED (%wZ)\n", - &DeviceNode->InstancePath); + ASSERT((DeviceNode->Flags & DNF_ADDED)); ASSERT((DeviceNode->Flags & (DNF_RESOURCE_ASSIGNED | DNF_RESOURCE_REPORTED | DNF_NO_RESOURCE_REQUIRED))); @@ -243,6 +254,12 @@ IopStartDevice( UNICODE_STRING KeyName; OBJECT_ATTRIBUTES ObjectAttributes; + if (DeviceNode->Flags & (DNF_STARTED | DNF_START_REQUEST_PENDING)) + { + /* Nothing to do here */ + return STATUS_SUCCESS; + } + Status = IopAssignDeviceResources(DeviceNode); if (!NT_SUCCESS(Status)) goto ByeBye; @@ -542,8 +559,9 @@ IopCreateDeviceNode(PDEVICE_NODE ParentNode, return Status; } - /* This is for drivers passed on the command line to ntoskrnl.exe */ IopDeviceNodeSetFlag(Node, DNF_LEGACY_DRIVER); + IopDeviceNodeSetFlag(Node, DNF_ADDED); + IopDeviceNodeSetFlag(Node, DNF_STARTED); } Node->PhysicalDeviceObject = PhysicalDeviceObject; diff --git a/reactos/ntoskrnl/io/pnpmgr/pnproot.c b/reactos/ntoskrnl/io/pnpmgr/pnproot.c index 30c612f1fc3..6f1834e5298 100644 --- a/reactos/ntoskrnl/io/pnpmgr/pnproot.c +++ b/reactos/ntoskrnl/io/pnpmgr/pnproot.c @@ -1069,6 +1069,11 @@ PnpRootPdoPnpControl( DPRINT("IRP_MJ_PNP / IRP_MN_FILTER_RESOURCE_REQUIREMENTS\n"); break; + case IRP_MN_REMOVE_DEVICE: + DPRINT1("IRP_MN_REMOVE_DEVICE is UNIMPLEMENTED!\n"); + Status = STATUS_SUCCESS; + break; + case IRP_MN_QUERY_ID: /* 0x13 */ Status = PdoQueryId(DeviceObject, Irp, IrpSp); break; From 14347c75ad50fead45b67b447b8bfadfe8d92f9e Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Thu, 22 Apr 2010 22:28:49 +0000 Subject: [PATCH 039/131] Disable gdi batch for SelectObject with fonts. Fixes font regression. svn path=/trunk/; revision=46998 --- reactos/dll/win32/gdi32/objects/dc.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/reactos/dll/win32/gdi32/objects/dc.c b/reactos/dll/win32/gdi32/objects/dc.c index 34c31148bb3..2d90f60cdac 100644 --- a/reactos/dll/win32/gdi32/objects/dc.c +++ b/reactos/dll/win32/gdi32/objects/dc.c @@ -1540,7 +1540,7 @@ SelectObject(HDC hDC, PDC_ATTR pDc_Attr; HGDIOBJ hOldObj = NULL; UINT uType; - PTEB pTeb; +// PTEB pTeb; if(!GdiGetHandleUserData(hDC, GDI_OBJECT_TYPE_DC, (PVOID)&pDc_Attr)) { @@ -1582,6 +1582,7 @@ SelectObject(HDC hDC, case GDI_OBJECT_TYPE_FONT: hOldObj = pDc_Attr->hlfntNew; if (hOldObj == hGdiObj) return hOldObj; +#if 0 pDc_Attr->ulDirty_ &= ~SLOW_WIDTHS; pDc_Attr->ulDirty_ |= DIRTY_CHARSET; pDc_Attr->hlfntNew = hGdiObj; @@ -1603,6 +1604,7 @@ SelectObject(HDC hDC, if (pTeb->GdiBatchCount >= GDI_BatchLimit) NtGdiFlush(); return hOldObj; } +#endif // default for select object font return NtGdiSelectFont(hDC, hGdiObj); From ee1d26e73c541c33561522dfead0f6e01a7917d3 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Fri, 23 Apr 2010 22:16:59 +0000 Subject: [PATCH 040/131] [FORMATTING] - Apply consistent indentation svn path=/trunk/; revision=47003 --- reactos/lib/rtl/message.c | 198 ++++++++++++++++++++------------------ 1 file changed, 102 insertions(+), 96 deletions(-) diff --git a/reactos/lib/rtl/message.c b/reactos/lib/rtl/message.c index a2b17839324..065e260bf0b 100644 --- a/reactos/lib/rtl/message.c +++ b/reactos/lib/rtl/message.c @@ -17,105 +17,109 @@ /* * @implemented */ -NTSTATUS NTAPI -RtlFindMessage(PVOID BaseAddress, - ULONG Type, - ULONG Language, - ULONG MessageId, - PRTL_MESSAGE_RESOURCE_ENTRY *MessageResourceEntry) +NTSTATUS +NTAPI +RtlFindMessage( + PVOID BaseAddress, + ULONG Type, + ULONG Language, + ULONG MessageId, + PRTL_MESSAGE_RESOURCE_ENTRY *MessageResourceEntry) { - LDR_RESOURCE_INFO ResourceInfo; - PIMAGE_RESOURCE_DATA_ENTRY ResourceDataEntry; - PRTL_MESSAGE_RESOURCE_DATA MessageTable; - NTSTATUS Status; - ULONG EntryOffset = 0, IdOffset = 0; - PRTL_MESSAGE_RESOURCE_ENTRY MessageEntry; - ULONG i; + LDR_RESOURCE_INFO ResourceInfo; + PIMAGE_RESOURCE_DATA_ENTRY ResourceDataEntry; + PRTL_MESSAGE_RESOURCE_DATA MessageTable; + NTSTATUS Status; + ULONG EntryOffset = 0, IdOffset = 0; + PRTL_MESSAGE_RESOURCE_ENTRY MessageEntry; + ULONG i; - DPRINT("RtlFindMessage()\n"); + DPRINT("RtlFindMessage()\n"); - ResourceInfo.Type = Type; - ResourceInfo.Name = 1; - ResourceInfo.Language = Language; + ResourceInfo.Type = Type; + ResourceInfo.Name = 1; + ResourceInfo.Language = Language; - Status = LdrFindResource_U(BaseAddress, - &ResourceInfo, - RESOURCE_DATA_LEVEL, - &ResourceDataEntry); - if (!NT_SUCCESS(Status)) - { - return Status; - } + Status = LdrFindResource_U(BaseAddress, + &ResourceInfo, + RESOURCE_DATA_LEVEL, + &ResourceDataEntry); + if (!NT_SUCCESS(Status)) + { + return Status; + } - DPRINT("ResourceDataEntry: %p\n", ResourceDataEntry); + DPRINT("ResourceDataEntry: %p\n", ResourceDataEntry); - Status = LdrAccessResource(BaseAddress, - ResourceDataEntry, - (PVOID*)&MessageTable, - NULL); - if (!NT_SUCCESS(Status)) - { - return Status; - } + Status = LdrAccessResource(BaseAddress, + ResourceDataEntry, + (PVOID*)&MessageTable, + NULL); + if (!NT_SUCCESS(Status)) + { + return Status; + } - DPRINT("MessageTable: %p\n", MessageTable); + DPRINT("MessageTable: %p\n", MessageTable); - DPRINT("NumberOfBlocks %lu\n", MessageTable->NumberOfBlocks); - for (i = 0; i < MessageTable->NumberOfBlocks; i++) - { - DPRINT("LoId 0x%08lx HiId 0x%08lx Offset 0x%08lx\n", - MessageTable->Blocks[i].LowId, - MessageTable->Blocks[i].HighId, - MessageTable->Blocks[i].OffsetToEntries); - } + DPRINT("NumberOfBlocks %lu\n", MessageTable->NumberOfBlocks); + for (i = 0; i < MessageTable->NumberOfBlocks; i++) + { + DPRINT("LoId 0x%08lx HiId 0x%08lx Offset 0x%08lx\n", + MessageTable->Blocks[i].LowId, + MessageTable->Blocks[i].HighId, + MessageTable->Blocks[i].OffsetToEntries); + } - for (i = 0; i < MessageTable->NumberOfBlocks; i++) - { - if ((MessageId >= MessageTable->Blocks[i].LowId) && - (MessageId <= MessageTable->Blocks[i].HighId)) - { - EntryOffset = MessageTable->Blocks[i].OffsetToEntries; - IdOffset = MessageId - MessageTable->Blocks[i].LowId; - break; - } + for (i = 0; i < MessageTable->NumberOfBlocks; i++) + { + if ((MessageId >= MessageTable->Blocks[i].LowId) && + (MessageId <= MessageTable->Blocks[i].HighId)) + { + EntryOffset = MessageTable->Blocks[i].OffsetToEntries; + IdOffset = MessageId - MessageTable->Blocks[i].LowId; + break; + } - if (MessageId < MessageTable->Blocks[i].LowId) - { - return STATUS_MESSAGE_NOT_FOUND; - } - } + if (MessageId < MessageTable->Blocks[i].LowId) + { + return STATUS_MESSAGE_NOT_FOUND; + } + } - if (MessageTable->NumberOfBlocks <= i) - { - return STATUS_MESSAGE_NOT_FOUND; - } + if (MessageTable->NumberOfBlocks <= i) + { + return STATUS_MESSAGE_NOT_FOUND; + } - MessageEntry = (PRTL_MESSAGE_RESOURCE_ENTRY)((PUCHAR)MessageTable + MessageTable->Blocks[i].OffsetToEntries); + MessageEntry = (PRTL_MESSAGE_RESOURCE_ENTRY) + ((PUCHAR)MessageTable + MessageTable->Blocks[i].OffsetToEntries); - DPRINT("EntryOffset 0x%08lx\n", EntryOffset); - DPRINT("IdOffset 0x%08lx\n", IdOffset); + DPRINT("EntryOffset 0x%08lx\n", EntryOffset); + DPRINT("IdOffset 0x%08lx\n", IdOffset); - DPRINT("MessageEntry: %p\n", MessageEntry); - for (i = 0; i < IdOffset; i++) - { - MessageEntry = (PRTL_MESSAGE_RESOURCE_ENTRY)((PUCHAR)MessageEntry + (ULONG)MessageEntry->Length); - } + DPRINT("MessageEntry: %p\n", MessageEntry); + for (i = 0; i < IdOffset; i++) + { + MessageEntry = (PRTL_MESSAGE_RESOURCE_ENTRY) + ((PUCHAR)MessageEntry + (ULONG)MessageEntry->Length); + } - if (MessageEntry->Flags == 0) - { - DPRINT("AnsiText: %s\n", MessageEntry->Text); - } - else - { - DPRINT("UnicodeText: %S\n", (PWSTR)MessageEntry->Text); - } + if (MessageEntry->Flags == 0) + { + DPRINT("AnsiText: %s\n", MessageEntry->Text); + } + else + { + DPRINT("UnicodeText: %S\n", (PWSTR)MessageEntry->Text); + } - if (MessageResourceEntry != NULL) - { - *MessageResourceEntry = MessageEntry; - } + if (MessageResourceEntry != NULL) + { + *MessageResourceEntry = MessageEntry; + } - return STATUS_SUCCESS; + return STATUS_SUCCESS; } @@ -139,22 +143,24 @@ RtlFindMessage(PVOID BaseAddress, * * @unimplemented */ -NTSTATUS NTAPI -RtlFormatMessage(PWSTR Message, - UCHAR MaxWidth, - BOOLEAN IgnoreInserts, - BOOLEAN Ansi, - BOOLEAN ArgumentIsArray, - va_list *Arguments, - PWSTR Buffer, - ULONG BufferSize) +NTSTATUS +NTAPI +RtlFormatMessage( + PWSTR Message, + UCHAR MaxWidth, + BOOLEAN IgnoreInserts, + BOOLEAN Ansi, + BOOLEAN ArgumentIsArray, + va_list *Arguments, + PWSTR Buffer, + ULONG BufferSize) { - DPRINT1("RtlFormatMessage(%S, %u, %s, %s, %s, %s, %p, %lu)\n", - Message, MaxWidth, IgnoreInserts ? "TRUE" : "FALSE", Ansi ? "TRUE" : "FALSE", - ArgumentIsArray ? "TRUE" : "FALSE", (PSTR)Arguments, Buffer, BufferSize); + DPRINT1("RtlFormatMessage(%S, %u, %s, %s, %s, %s, %p, %lu)\n", + Message, MaxWidth, IgnoreInserts ? "TRUE" : "FALSE", Ansi ? "TRUE" : "FALSE", + ArgumentIsArray ? "TRUE" : "FALSE", (PSTR)Arguments, Buffer, BufferSize); - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; } /* EOF */ From 16910e9140b3586fadc3033c7fed47af9825cd6f Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Sat, 24 Apr 2010 08:51:07 +0000 Subject: [PATCH 041/131] [RBUILD] - Fix cleaning of msvc 10 project files svn path=/trunk/; revision=47004 --- reactos/tools/rbuild/backend/msvc/msvc.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/reactos/tools/rbuild/backend/msvc/msvc.cpp b/reactos/tools/rbuild/backend/msvc/msvc.cpp index 8991147a61a..688758c44a3 100644 --- a/reactos/tools/rbuild/backend/msvc/msvc.cpp +++ b/reactos/tools/rbuild/backend/msvc/msvc.cpp @@ -420,7 +420,11 @@ MSVCBackend::_clean_project_files ( void ) remove ( NcbFileName ( module ).c_str () ); remove ( SlnFileName ( module ).c_str () ); remove ( SuoFileName ( module ).c_str () ); - remove ( VcprojFileName ( module ).c_str () ); + + if ( configuration.VSProjectVersion == "10.00" ) + remove ( VcxprojFileName ( module ).c_str () ); + else + remove ( VcprojFileName ( module ).c_str () ); string username = getenv ( "USERNAME" ); string computername = getenv ( "COMPUTERNAME" ); From 9986cfddd8b28543825cd2708236b711e5feabf7 Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Sat, 24 Apr 2010 18:08:11 +0000 Subject: [PATCH 042/131] [NETSHELL] Fix some German resources: - Use BS_MULTILINE instead of embedding newline characters into text - Make groupboxes and text fit into the window svn path=/trunk/; revision=47005 --- reactos/dll/win32/netshell/lang/de-DE.rc | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/reactos/dll/win32/netshell/lang/de-DE.rc b/reactos/dll/win32/netshell/lang/de-DE.rc index 3192b29f977..de2c06bb65b 100644 --- a/reactos/dll/win32/netshell/lang/de-DE.rc +++ b/reactos/dll/win32/netshell/lang/de-DE.rc @@ -16,7 +16,7 @@ BEGIN GROUPBOX "Beschreibung", -1, 9, 153, 230, 46, BS_GROUPBOX LTEXT "Hier wird die Beschreibung des Elementes stehen....", IDC_DESCRIPTION, 15, 165, 217, 28, WS_GROUP CHECKBOX "&Symbol bei Verbindung im Infobereich anzeigen", IDC_SHOWTASKBAR, 9, 206, 230, 12, BS_AUTOCHECKBOX | WS_TABSTOP - CHECKBOX "&Benachrichtigen, wenn diese Verbindung eingeschrnkte oder\nkeine Konnektivitt besitzt", IDC_NOTIFYNOCONNECTION, 9, 220, 230, 24, BS_AUTOCHECKBOX | WS_TABSTOP + CHECKBOX "&Benachrichtigen, wenn diese Verbindung eingeschrnkte oder keine Konnektivitt besitzt", IDC_NOTIFYNOCONNECTION, 9, 220, 230, 24, BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP END IDD_STATUS DIALOGEX DISCARDABLE 0, 0, 200, 280 @@ -54,16 +54,16 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "Netzwerkuntersttzung" FONT 8, "MS Shell Dlg" BEGIN - GROUPBOX "Verbindungsstatus", -1, 9, 8, 200, 88, BS_GROUPBOX + GROUPBOX "Verbindungsstatus", -1, 9, 8, 182, 88, BS_GROUPBOX LTEXT "Adresstyp:", -1, 22, 20, 80, 8 LTEXT "IP-Adresse:", -1, 22, 34, 80, 8 LTEXT "Subnetzmaske:", -1, 22, 48, 80, 8 LTEXT "Standardgateway:", -1, 22, 62, 80, 8 - RTEXT "Nicht verfgbar", IDC_DETAILSTYPE, 122, 20, 80, 8 - RTEXT "000.000.000.000", IDC_DETAILSIP, 122, 34, 80, 8 - RTEXT "000.000.000.000", IDC_DETAILSSUBNET, 122, 48, 80, 8 - RTEXT "", IDC_DETAILSGATEWAY, 122, 62, 80, 8 + RTEXT "Nicht verfgbar", IDC_DETAILSTYPE, 100, 20, 80, 8 + RTEXT "000.000.000.000", IDC_DETAILSIP, 100, 34, 80, 8 + RTEXT "000.000.000.000", IDC_DETAILSSUBNET, 100, 48, 80, 8 + RTEXT "", IDC_DETAILSGATEWAY, 100, 62, 80, 8 PUSHBUTTON "&Details...", IDC_DETAILS, 22, 76, 62, 14 END From d35aa9621809528df2928592fa497eef3829ad5e Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Sat, 24 Apr 2010 18:12:31 +0000 Subject: [PATCH 043/131] [NETSHELL] - Load all LAN status icons with the same size - Only set the status icon if the icon occurred, don't set NULL icons (properties of LAN adapter window) See issue #3813 for more details. svn path=/trunk/; revision=47006 --- reactos/dll/win32/netshell/lanstatusui.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/dll/win32/netshell/lanstatusui.c b/reactos/dll/win32/netshell/lanstatusui.c index 3691289caac..1292ef1a843 100644 --- a/reactos/dll/win32/netshell/lanstatusui.c +++ b/reactos/dll/win32/netshell/lanstatusui.c @@ -165,8 +165,8 @@ UpdateLanStatus(HWND hwndDlg, LANSTATUSUI_CONTEXT * pContext) } else if (pContext->dwInOctets != IfEntry.dwInOctets && pContext->dwOutOctets != IfEntry.dwOutOctets && pContext->Status != 1) { + hIcon = LoadImage(netshell_hInstance, MAKEINTRESOURCE(IDI_NET_TRANSREC), IMAGE_ICON, 32, 32, LR_DEFAULTCOLOR); pContext->Status = 1; - hIcon = LoadImage(netshell_hInstance, MAKEINTRESOURCE(IDI_NET_TRANSREC), IMAGE_ICON, 0, 0, LR_DEFAULTCOLOR); } else if (pContext->dwInOctets != IfEntry.dwInOctets && pContext->Status != 2) { @@ -196,7 +196,7 @@ UpdateLanStatus(HWND hwndDlg, LANSTATUSUI_CONTEXT * pContext) } } - if (hwndDlg) + if (hwndDlg && hIcon) { hOldIcon = (HICON)SendDlgItemMessageW(hwndDlg, IDC_NETSTAT, STM_SETICON, (WPARAM)hIcon, 0); if (hOldIcon) From 740cd5ef909856eaa6d3978ca4d818f37157d112 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sat, 24 Apr 2010 22:37:45 +0000 Subject: [PATCH 044/131] [IP] - Don't try to close the connection again if it has already been terminated by the remote peer svn path=/trunk/; revision=47007 --- reactos/lib/drivers/ip/transport/tcp/tcp.c | 26 ++++++++++++++-------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/reactos/lib/drivers/ip/transport/tcp/tcp.c b/reactos/lib/drivers/ip/transport/tcp/tcp.c index ae02e4a2d05..187c9a56cc7 100644 --- a/reactos/lib/drivers/ip/transport/tcp/tcp.c +++ b/reactos/lib/drivers/ip/transport/tcp/tcp.c @@ -735,16 +735,24 @@ NTSTATUS TCPClose Socket = Connection->SocketContext; Connection->SocketContext = NULL; - /* We need to close here otherwise oskit will never indicate - * SEL_FIN and we will never fully close the connection - */ - Status = TCPTranslateError( OskitTCPClose( Socket ) ); - - if (!NT_SUCCESS(Status)) + /* Don't try to close again if the other side closed us already */ + if (Connection->SignalState != SEL_FIN) { - Connection->SocketContext = Socket; - UnlockObject(Connection, OldIrql); - return Status; + /* We need to close here otherwise oskit will never indicate + * SEL_FIN and we will never fully close the connection */ + Status = TCPTranslateError( OskitTCPClose( Socket ) ); + + if (!NT_SUCCESS(Status)) + { + Connection->SocketContext = Socket; + UnlockObject(Connection, OldIrql); + return Status; + } + } + else + { + /* We are already closed by the other end so return success */ + Status = STATUS_SUCCESS; } if (Connection->AddressFile) From 8ba6c78a50195a63aaa4b8a35baec13c5d19b32c Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Sun, 25 Apr 2010 10:45:06 +0000 Subject: [PATCH 045/131] [NETCFGX] - Improve the DNS data exchange between the basic IP settings and the advanced DNS panel - Simplify LaunchAdvancedTcpipSettings svn path=/trunk/; revision=47009 --- reactos/dll/win32/netcfgx/tcpipconf_notify.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/reactos/dll/win32/netcfgx/tcpipconf_notify.c b/reactos/dll/win32/netcfgx/tcpipconf_notify.c index 91c57ec1a2e..e582da43f96 100644 --- a/reactos/dll/win32/netcfgx/tcpipconf_notify.c +++ b/reactos/dll/win32/netcfgx/tcpipconf_notify.c @@ -1762,6 +1762,7 @@ StoreDNSSettings( pLast = pCur; pCur = pCur->Next; } + This->pCurrentConfig->AutoconfigActive = FALSE; } INT_PTR @@ -2046,7 +2047,6 @@ TcpipAdvancedDnsDlg( VOID LaunchAdvancedTcpipSettings( - HWND hDlg, HWND hwndDlg, TcpipConfNotifyImpl * This) { @@ -2069,14 +2069,14 @@ LaunchAdvancedTcpipSettings( pinfo.dwFlags = PSH_NOCONTEXTHELP | PSH_PROPTITLE | PSH_NOAPPLYNOW; pinfo.u3.phpage = hppages; pinfo.nPages = 3; - pinfo.hwndParent = hDlg; + pinfo.hwndParent = hwndDlg; pinfo.pszCaption = szBuffer; StoreTcpipBasicSettings(hwndDlg, This, FALSE); PropertySheetW(&pinfo); InitializeTcpipBasicDlgCtrls(hwndDlg, This->pCurrentConfig); - PropSheet_Changed(hDlg, hwndDlg); + PropSheet_Changed(GetParent(hwndDlg), hwndDlg); } INT_PTR @@ -2328,6 +2328,8 @@ InitializeTcpipBasicDlgCtrls( else { SendDlgItemMessageW(hwndDlg, IDC_FIXEDDNS, BM_SETCHECK, BST_CHECKED, 0); + EnableWindow(GetDlgItem(hwndDlg, IDC_DNS1), TRUE); + EnableWindow(GetDlgItem(hwndDlg, IDC_DNS2), TRUE); if (pCurSettings->Ns) { SendDlgItemMessageW(hwndDlg, IDC_DNS1, IPM_SETADDRESS, 0, (LPARAM)pCurSettings->Ns->IpAddress); @@ -2521,7 +2523,7 @@ TcpipBasicDlg( } break; case IDC_ADVANCED: - LaunchAdvancedTcpipSettings(GetParent(hwndDlg), hwndDlg, (TcpipConfNotifyImpl*)GetWindowLongPtr(hwndDlg, DWLP_USER)); + LaunchAdvancedTcpipSettings(hwndDlg, (TcpipConfNotifyImpl*)GetWindowLongPtr(hwndDlg, DWLP_USER)); break; } break; From b8998128ea920d321c78a447601184d918923623 Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Sun, 25 Apr 2010 10:47:10 +0000 Subject: [PATCH 046/131] [NETCFGX] - Save DHCP and DNS settings from the basic TCP/IP panel independently of each other See issue #5193 for more details. svn path=/trunk/; revision=47010 --- reactos/dll/win32/netcfgx/tcpipconf_notify.c | 34 +++++++++++--------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/reactos/dll/win32/netcfgx/tcpipconf_notify.c b/reactos/dll/win32/netcfgx/tcpipconf_notify.c index e582da43f96..14b9a4ab2f4 100644 --- a/reactos/dll/win32/netcfgx/tcpipconf_notify.c +++ b/reactos/dll/win32/netcfgx/tcpipconf_notify.c @@ -3280,23 +3280,25 @@ INetCfgComponentControl_fnApplyRegistryChanges( RegSetValueExW(hKey, L"DefaultGateway", 0, REG_MULTI_SZ, (LPBYTE)L"", 1 * sizeof(WCHAR)); RegSetValueExW(hKey, L"DefaultGatewayMetric", 0, REG_MULTI_SZ, (LPBYTE)L"\0", sizeof(WCHAR) * 2); } - - if (!pCurrentConfig->Ns || pCurrentConfig->AutoconfigActive) - { - RegSetValueExW(hKey, L"NameServer", 0, REG_SZ, (LPBYTE)L"", 1 * sizeof(WCHAR)); - } - else - { - pStr = CreateMultiSzString(pCurrentConfig->Ns, IPADDR, &dwSize, TRUE); - if(pStr) - { - RegSetValueExW(hKey, L"NameServer", 0, REG_SZ, (LPBYTE)pStr, dwSize); - RegDeleteValueW(hKey, L"DhcpNameServer"); - CoTaskMemFree(pStr); - } - } - RegCloseKey(hKey); } + + if (!pCurrentConfig->Ns || pCurrentConfig->AutoconfigActive) + { + RegSetValueExW(hKey, L"NameServer", 0, REG_SZ, (LPBYTE)L"", 1 * sizeof(WCHAR)); + } + else + { + pStr = CreateMultiSzString(pCurrentConfig->Ns, IPADDR, &dwSize, TRUE); + if(pStr) + { + + RegSetValueExW(hKey, L"NameServer", 0, REG_SZ, (LPBYTE)pStr, dwSize); + RegDeleteValueW(hKey, L"DhcpNameServer"); + CoTaskMemFree(pStr); + } + } + + RegCloseKey(hKey); } return S_OK; } From 49496ddec65489aaf0bc692533892f5aaa5e131b Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Sun, 25 Apr 2010 12:13:01 +0000 Subject: [PATCH 047/131] [SYSSETUP] - Create a modeless syssetup dialog so we can explicitly ignore intermediate WM_CLOSE messages (modal property sheets handle them automatically) See issue #4960 for more details. svn path=/trunk/; revision=47011 --- reactos/dll/win32/syssetup/wizard.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/reactos/dll/win32/syssetup/wizard.c b/reactos/dll/win32/syssetup/wizard.c index 7a084f56c26..63d6bc2ed88 100644 --- a/reactos/dll/win32/syssetup/wizard.c +++ b/reactos/dll/win32/syssetup/wizard.c @@ -1960,6 +1960,7 @@ FinishDlgProc(HWND hwndDlg, case WM_DESTROY: { SetupIsActive(0); + PostQuitMessage(0); return TRUE; } @@ -1999,7 +2000,7 @@ FinishDlgProc(HWND hwndDlg, break; case PSN_WIZFINISH: - /* Handle a Finish button click, if necessary */ + DestroyWindow(GetParent(hwndDlg)); break; default: @@ -2269,6 +2270,8 @@ InstallWizard(VOID) HPROPSHEETPAGE ahpsp[8]; PROPSHEETPAGE psp = {0}; UINT nPages = 0; + HWND hWnd; + MSG msg; /* Clear setup data */ ZeroMemory(&SetupData, sizeof(SETUPDATA)); @@ -2345,7 +2348,7 @@ InstallWizard(VOID) /* Create the property sheet */ psh.dwSize = sizeof(PROPSHEETHEADER); - psh.dwFlags = PSH_WIZARD97 | PSH_WATERMARK | PSH_HEADER; + psh.dwFlags = PSH_WIZARD97 | PSH_WATERMARK | PSH_HEADER | PSH_MODELESS; psh.hInstance = hDllInstance; psh.hwndParent = NULL; psh.nPages = nPages; @@ -2358,7 +2361,17 @@ InstallWizard(VOID) SetupData.hTitleFont = CreateTitleFont(); /* Display the wizard */ - PropertySheet(&psh); + hWnd = (HWND)PropertySheet(&psh); + ShowWindow(hWnd, SW_SHOW); + + while (GetMessage(&msg, NULL, 0, 0)) + { + if(!IsDialogMessage(hWnd, &msg)) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + } DeleteObject(SetupData.hTitleFont); } From 0225b59c2d856b63ddb95401a437d9788a35bd66 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sun, 25 Apr 2010 15:58:34 +0000 Subject: [PATCH 048/131] [NEWINFLIB] Add a UNICODE-aware version of the inflib library. It is not used by other components yet but usetup and mkhive will use it in the future. ATTENTION: This commit might break the build bot because I could not test a build on a Linux system. svn path=/trunk/; revision=47016 --- reactos/lib/lib.rbuild | 3 + reactos/lib/newinflib/README.txt | 16 + reactos/lib/newinflib/builddep.h | 98 ++++ reactos/lib/newinflib/infcommon.h | 16 + reactos/lib/newinflib/infcore.c | 831 ++++++++++++++++++++++++++++ reactos/lib/newinflib/infget.c | 668 ++++++++++++++++++++++ reactos/lib/newinflib/infhost.h | 86 +++ reactos/lib/newinflib/infhostgen.c | 316 +++++++++++ reactos/lib/newinflib/infhostget.c | 249 +++++++++ reactos/lib/newinflib/infhostput.c | 115 ++++ reactos/lib/newinflib/infhostrtl.c | 151 +++++ reactos/lib/newinflib/inflib.h | 15 + reactos/lib/newinflib/inflib.mak | 76 +++ reactos/lib/newinflib/inflib.rbuild | 31 ++ reactos/lib/newinflib/infpriv.h | 145 +++++ reactos/lib/newinflib/infput.c | 264 +++++++++ reactos/lib/newinflib/infros.h | 81 +++ reactos/lib/newinflib/infrosgen.c | 370 +++++++++++++ reactos/lib/newinflib/infrosget.c | 140 +++++ reactos/lib/newinflib/infrosput.c | 132 +++++ 20 files changed, 3803 insertions(+) create mode 100644 reactos/lib/newinflib/README.txt create mode 100644 reactos/lib/newinflib/builddep.h create mode 100644 reactos/lib/newinflib/infcommon.h create mode 100644 reactos/lib/newinflib/infcore.c create mode 100644 reactos/lib/newinflib/infget.c create mode 100644 reactos/lib/newinflib/infhost.h create mode 100644 reactos/lib/newinflib/infhostgen.c create mode 100644 reactos/lib/newinflib/infhostget.c create mode 100644 reactos/lib/newinflib/infhostput.c create mode 100644 reactos/lib/newinflib/infhostrtl.c create mode 100644 reactos/lib/newinflib/inflib.h create mode 100644 reactos/lib/newinflib/inflib.mak create mode 100644 reactos/lib/newinflib/inflib.rbuild create mode 100644 reactos/lib/newinflib/infpriv.h create mode 100644 reactos/lib/newinflib/infput.c create mode 100644 reactos/lib/newinflib/infros.h create mode 100644 reactos/lib/newinflib/infrosgen.c create mode 100644 reactos/lib/newinflib/infrosget.c create mode 100644 reactos/lib/newinflib/infrosput.c diff --git a/reactos/lib/lib.rbuild b/reactos/lib/lib.rbuild index 42e49d6ab2f..fe9cf995715 100644 --- a/reactos/lib/lib.rbuild +++ b/reactos/lib/lib.rbuild @@ -37,6 +37,9 @@ + + + diff --git a/reactos/lib/newinflib/README.txt b/reactos/lib/newinflib/README.txt new file mode 100644 index 00000000000..5e27e2b0d5e --- /dev/null +++ b/reactos/lib/newinflib/README.txt @@ -0,0 +1,16 @@ +Routines to handle .inf files. + +This is the UNICODE-enabled version of inflib. It will be used by usetup and mkhive. + +This library is used to share .inf handling code between build tools and +ReactOS code. Two versions are built, "inflib_host" (for use by build tools) +and "inflib" (for use by ReactOS code). Both depend on the same core source, +with a wrapper for the appropriate interface. +Most of the differences between the host and the ReactOS environment are +abstracted away in builddep.h. Of particular note is that the host version +uses Ansi characters while the ReactOS version uses Unicode. So, the core +source uses TCHARs. builddep.h depends on a preprocessor variable INFLIB_HOST +which is defined when building the host version (inflib.mak) but not defined +when building the ReactOS version (inflib.xml). +The wrappers have "host" or "ros" in their filename. The library interface is +"infhost.h" for the host version, "infros.h" for the ReactOS version. diff --git a/reactos/lib/newinflib/builddep.h b/reactos/lib/newinflib/builddep.h new file mode 100644 index 00000000000..c768a2ca88b --- /dev/null +++ b/reactos/lib/newinflib/builddep.h @@ -0,0 +1,98 @@ +/* + * PROJECT: .inf file parser + * LICENSE: GPL - See COPYING in the top level directory + * COPYRIGHT: Copyright 2005 Ge van Geldorp + */ + +#ifdef INFLIB_HOST + +/* Definitions native to the host on which we're building */ + +#include + +#include +#include +#include +#include + +#define FREE(Area) free(Area) +#define MALLOC(Size) malloc((size_t)(Size)) +#define ZEROMEMORY(Area, Size) memset((Area), '\0', (size_t)(Size)) +#define MEMCPY(Dest, Src, Size) memcpy((Dest), (Src), (size_t)(Size)) + +#define STATUS_SUCCESS 0 +#define INF_STATUS_SUCCESS 0 +#define INF_STATUS_NO_MEMORY ENOMEM +#define INF_STATUS_INVALID_PARAMETER EINVAL +#define INF_STATUS_NOT_FOUND ENOENT +#define INF_STATUS_BUFFER_OVERFLOW E2BIG +#define INF_SUCCESS(x) (0 == (x)) + +typedef char TCHAR, *PTCHAR, *PTSTR; +typedef const TCHAR *PCTSTR; +typedef WORD LCID; + +#define _T(x) x +#define _tcsicmp strcasecmp +#define _tcslen strlen +#define _tcscpy strcpy +#define _tcstoul strtoul +#define _tcstol strtol +#define STRFMT "%s" + +#ifdef _MSC_VER +#define strcasecmp _stricmp +#endif + +#define IS_TEXT_UNICODE_ASCII16 1 +#define IS_TEXT_UNICODE_REVERSE_ASCII16 16 +#define IS_TEXT_UNICODE_STATISTICS 2 +#define IS_TEXT_UNICODE_REVERSE_STATISTICS 32 +#define IS_TEXT_UNICODE_CONTROLS 4 +#define IS_TEXT_UNICODE_REVERSE_CONTROLS 64 +#define IS_TEXT_UNICODE_SIGNATURE 8 +#define IS_TEXT_UNICODE_REVERSE_SIGNATURE 128 +#define IS_TEXT_UNICODE_ILLEGAL_CHARS 256 +#define IS_TEXT_UNICODE_ODD_LENGTH 512 +#define IS_TEXT_UNICODE_NULL_BYTES 4096 +#define IS_TEXT_UNICODE_UNICODE_MASK 15 +#define IS_TEXT_UNICODE_REVERSE_MASK 240 +#define IS_TEXT_UNICODE_NOT_UNICODE_MASK 3840 +#define IS_TEXT_UNICODE_NOT_ASCII_MASK 61440 + +#define SUBLANG_NEUTRAL 0 +#define PRIMARYLANGID(lgid) ((WORD)(lgid) & 0x3ff) +#define MAKELANGID(p, s) ((((WORD)(s)) << 10) | (WORD)(p)) + + +#else /* ! defined(INFLIB_HOST) */ + +/* ReactOS definitions */ + +#define UNICODE +#define _UNICODE +#define WIN32_NO_STATUS +#include +#define NTOS_MODE_USER +#include +#include + +extern PVOID InfpHeap; + +#define FREE(Area) RtlFreeHeap(InfpHeap, 0, (Area)) +#define MALLOC(Size) RtlAllocateHeap(InfpHeap, 0, (Size)) +#define ZEROMEMORY(Area, Size) RtlZeroMemory((Area), (Size)) +#define MEMCPY(Dest, Src, Size) RtlCopyMemory((Dest), (Src), (Size)) + +#define INF_STATUS_SUCCESS STATUS_SUCCESS +#define INF_STATUS_NO_MEMORY STATUS_NO_MEMORY +#define INF_STATUS_INVALID_PARAMETER STATUS_INVALID_PARAMETER +#define INF_STATUS_NOT_FOUND STATUS_NOT_FOUND +#define INF_STATUS_BUFFER_OVERFLOW STATUS_BUFFER_OVERFLOW +#define INF_SUCCESS(x) (0 <= (x)) + +#define STRFMT "%S" + +#endif /* INFLIB_HOST */ + +/* EOF */ diff --git a/reactos/lib/newinflib/infcommon.h b/reactos/lib/newinflib/infcommon.h new file mode 100644 index 00000000000..a80f2029078 --- /dev/null +++ b/reactos/lib/newinflib/infcommon.h @@ -0,0 +1,16 @@ +/* + * PROJECT: .inf file parser + * LICENSE: GPL - See COPYING in the top level directory + * PROGRAMMER: Royce Mitchell III + * Eric Kohl + * Ge van Geldorp + */ + +#pragma once + +#define MAX_INF_STRING_LENGTH 512 + +typedef void *HINF, **PHINF; +typedef struct _INFCONTEXT *PINFCONTEXT; + +/* EOF */ diff --git a/reactos/lib/newinflib/infcore.c b/reactos/lib/newinflib/infcore.c new file mode 100644 index 00000000000..3582ec56787 --- /dev/null +++ b/reactos/lib/newinflib/infcore.c @@ -0,0 +1,831 @@ +/* + * PROJECT: .inf file parser + * LICENSE: GPL - See COPYING in the top level directory + * PROGRAMMER: Royce Mitchell III + * Eric Kohl + * Ge van Geldorp + */ + +/* INCLUDES *****************************************************************/ + +#include "inflib.h" + +#define NDEBUG +#include + +#define CONTROL_Z '\x1a' +#define MAX_SECTION_NAME_LEN 255 +#define MAX_FIELD_LEN 511 /* larger fields get silently truncated */ +/* actual string limit is MAX_INF_STRING_LENGTH+1 (plus terminating null) under Windows */ +#define MAX_STRING_LEN (MAX_INF_STRING_LENGTH+1) + + +/* parser definitions */ + +enum parser_state +{ + LINE_START, /* at beginning of a line */ + SECTION_NAME, /* parsing a section name */ + KEY_NAME, /* parsing a key name */ + VALUE_NAME, /* parsing a value name */ + EOL_BACKSLASH, /* backslash at end of line */ + QUOTES, /* inside quotes */ + LEADING_SPACES, /* leading spaces */ + TRAILING_SPACES, /* trailing spaces */ + COMMENT, /* inside a comment */ + NB_PARSER_STATES +}; + +struct parser +{ + const WCHAR *start; /* start position of item being parsed */ + const WCHAR *end; /* end of buffer */ + PINFCACHE file; /* file being built */ + enum parser_state state; /* current parser state */ + enum parser_state stack[4]; /* state stack */ + int stack_pos; /* current pos in stack */ + + PINFCACHESECTION cur_section; /* pointer to the section being parsed*/ + PINFCACHELINE line; /* current line */ + unsigned int line_pos; /* current line position in file */ + INFSTATUS error; /* error code */ + unsigned int token_len; /* current token len */ + WCHAR token[MAX_FIELD_LEN+1]; /* current token */ +}; + +typedef const WCHAR * (*parser_state_func)( struct parser *parser, const WCHAR *pos ); + +/* parser state machine functions */ +static const WCHAR *line_start_state( struct parser *parser, const WCHAR *pos ); +static const WCHAR *section_name_state( struct parser *parser, const WCHAR *pos ); +static const WCHAR *key_name_state( struct parser *parser, const WCHAR *pos ); +static const WCHAR *value_name_state( struct parser *parser, const WCHAR *pos ); +static const WCHAR *eol_backslash_state( struct parser *parser, const WCHAR *pos ); +static const WCHAR *quotes_state( struct parser *parser, const WCHAR *pos ); +static const WCHAR *leading_spaces_state( struct parser *parser, const WCHAR *pos ); +static const WCHAR *trailing_spaces_state( struct parser *parser, const WCHAR *pos ); +static const WCHAR *comment_state( struct parser *parser, const WCHAR *pos ); + +static const parser_state_func parser_funcs[NB_PARSER_STATES] = +{ + line_start_state, /* LINE_START */ + section_name_state, /* SECTION_NAME */ + key_name_state, /* KEY_NAME */ + value_name_state, /* VALUE_NAME */ + eol_backslash_state, /* EOL_BACKSLASH */ + quotes_state, /* QUOTES */ + leading_spaces_state, /* LEADING_SPACES */ + trailing_spaces_state, /* TRAILING_SPACES */ + comment_state /* COMMENT */ +}; + + +/* PRIVATE FUNCTIONS ********************************************************/ + +static PINFCACHELINE +InfpFreeLine (PINFCACHELINE Line) +{ + PINFCACHELINE Next; + PINFCACHEFIELD Field; + + if (Line == NULL) + { + return NULL; + } + + Next = Line->Next; + if (Line->Key != NULL) + { + FREE (Line->Key); + Line->Key = NULL; + } + + /* Remove data fields */ + while (Line->FirstField != NULL) + { + Field = Line->FirstField->Next; + FREE (Line->FirstField); + Line->FirstField = Field; + } + Line->LastField = NULL; + + FREE (Line); + + return Next; +} + + +PINFCACHESECTION +InfpFreeSection (PINFCACHESECTION Section) +{ + PINFCACHESECTION Next; + + if (Section == NULL) + { + return NULL; + } + + /* Release all keys */ + Next = Section->Next; + while (Section->FirstLine != NULL) + { + Section->FirstLine = InfpFreeLine (Section->FirstLine); + } + Section->LastLine = NULL; + + FREE (Section); + + return Next; +} + + +PINFCACHESECTION +InfpFindSection(PINFCACHE Cache, + PCWSTR Name) +{ + PINFCACHESECTION Section = NULL; + + if (Cache == NULL || Name == NULL) + { + return NULL; + } + + /* iterate through list of sections */ + Section = Cache->FirstSection; + while (Section != NULL) + { + if (_wcsicmp (Section->Name, Name) == 0) + { + return Section; + } + + /* get the next section*/ + Section = Section->Next; + } + + return NULL; +} + + +PINFCACHESECTION +InfpAddSection(PINFCACHE Cache, + PCWSTR Name) +{ + PINFCACHESECTION Section = NULL; + ULONG Size; + + if (Cache == NULL || Name == NULL) + { + DPRINT("Invalid parameter\n"); + return NULL; + } + + /* Allocate and initialize the new section */ + Size = (ULONG)FIELD_OFFSET(INFCACHESECTION, + Name[wcslen (Name) + 1]); + Section = (PINFCACHESECTION)MALLOC(Size); + if (Section == NULL) + { + DPRINT("MALLOC() failed\n"); + return NULL; + } + ZEROMEMORY (Section, + Size); + + /* Copy section name */ + wcscpy (Section->Name, Name); + + /* Append section */ + if (Cache->FirstSection == NULL) + { + Cache->FirstSection = Section; + Cache->LastSection = Section; + } + else + { + Cache->LastSection->Next = Section; + Section->Prev = Cache->LastSection; + Cache->LastSection = Section; + } + + return Section; +} + + +PINFCACHELINE +InfpAddLine(PINFCACHESECTION Section) +{ + PINFCACHELINE Line; + + if (Section == NULL) + { + DPRINT("Invalid parameter\n"); + return NULL; + } + + Line = (PINFCACHELINE)MALLOC(sizeof(INFCACHELINE)); + if (Line == NULL) + { + DPRINT("MALLOC() failed\n"); + return NULL; + } + ZEROMEMORY(Line, + sizeof(INFCACHELINE)); + + /* Append line */ + if (Section->FirstLine == NULL) + { + Section->FirstLine = Line; + Section->LastLine = Line; + } + else + { + Section->LastLine->Next = Line; + Line->Prev = Section->LastLine; + Section->LastLine = Line; + } + Section->LineCount++; + + return Line; +} + + +PVOID +InfpAddKeyToLine(PINFCACHELINE Line, + PCWSTR Key) +{ + if (Line == NULL) + { + DPRINT1("Invalid Line\n"); + return NULL; + } + + if (Line->Key != NULL) + { + DPRINT1("Line already has a key\n"); + return NULL; + } + + Line->Key = (PWCHAR)MALLOC((wcslen(Key) + 1) * sizeof(WCHAR)); + if (Line->Key == NULL) + { + DPRINT1("MALLOC() failed\n"); + return NULL; + } + + wcscpy(Line->Key, Key); + + return (PVOID)Line->Key; +} + + +PVOID +InfpAddFieldToLine(PINFCACHELINE Line, + PCWSTR Data) +{ + PINFCACHEFIELD Field; + ULONG Size; + + Size = (ULONG)FIELD_OFFSET(INFCACHEFIELD, + Data[wcslen(Data) + 1]); + Field = (PINFCACHEFIELD)MALLOC(Size); + if (Field == NULL) + { + DPRINT1("MALLOC() failed\n"); + return NULL; + } + ZEROMEMORY (Field, + Size); + wcscpy (Field->Data, Data); + + /* Append key */ + if (Line->FirstField == NULL) + { + Line->FirstField = Field; + Line->LastField = Field; + } + else + { + Line->LastField->Next = Field; + Field->Prev = Line->LastField; + Line->LastField = Field; + } + Line->FieldCount++; + + return (PVOID)Field; +} + + +PINFCACHELINE +InfpFindKeyLine(PINFCACHESECTION Section, + PCWSTR Key) +{ + PINFCACHELINE Line; + + Line = Section->FirstLine; + while (Line != NULL) + { + if (Line->Key != NULL && _wcsicmp (Line->Key, Key) == 0) + { + return Line; + } + + Line = Line->Next; + } + + return NULL; +} + + +/* push the current state on the parser stack */ +__inline static void push_state( struct parser *parser, enum parser_state state ) +{ +// assert( parser->stack_pos < sizeof(parser->stack)/sizeof(parser->stack[0]) ); + parser->stack[parser->stack_pos++] = state; +} + + +/* pop the current state */ +__inline static void pop_state( struct parser *parser ) +{ +// assert( parser->stack_pos ); + parser->state = parser->stack[--parser->stack_pos]; +} + + +/* set the parser state and return the previous one */ +__inline static enum parser_state set_state( struct parser *parser, enum parser_state state ) +{ + enum parser_state ret = parser->state; + parser->state = state; + return ret; +} + + +/* check if the pointer points to an end of file */ +__inline static int is_eof( struct parser *parser, const WCHAR *ptr ) +{ + return (ptr >= parser->end || *ptr == CONTROL_Z); +} + + +/* check if the pointer points to an end of line */ +__inline static int is_eol( struct parser *parser, const WCHAR *ptr ) +{ + return (ptr >= parser->end || + *ptr == CONTROL_Z || + *ptr == '\n' || + (*ptr == '\r' && *(ptr + 1) == '\n')); +} + + +/* push data from current token start up to pos into the current token */ +static int push_token( struct parser *parser, const WCHAR *pos ) +{ + UINT len = (UINT)(pos - parser->start); + const WCHAR *src = parser->start; + WCHAR *dst = parser->token + parser->token_len; + + if (len > MAX_FIELD_LEN - parser->token_len) + len = MAX_FIELD_LEN - parser->token_len; + + parser->token_len += len; + for ( ; len > 0; len--, dst++, src++) + { + if (*src) + { + *dst = *src; + } + else + { + *dst = ' '; + } + } + + *dst = 0; + parser->start = pos; + + return 0; +} + + + +/* add a section with the current token as name */ +static PVOID add_section_from_token( struct parser *parser ) +{ + PINFCACHESECTION Section; + + if (parser->token_len > MAX_SECTION_NAME_LEN) + { + parser->error = INF_STATUS_SECTION_NAME_TOO_LONG; + return NULL; + } + + Section = InfpFindSection(parser->file, + parser->token); + if (Section == NULL) + { + /* need to create a new one */ + Section= InfpAddSection(parser->file, + parser->token); + if (Section == NULL) + { + parser->error = INF_STATUS_NOT_ENOUGH_MEMORY; + return NULL; + } + } + + parser->token_len = 0; + parser->cur_section = Section; + + return (PVOID)Section; +} + + +/* add a field containing the current token to the current line */ +static struct field *add_field_from_token( struct parser *parser, int is_key ) +{ + PVOID field; + + if (!parser->line) /* need to start a new line */ + { + if (parser->cur_section == NULL) /* got a line before the first section */ + { + parser->error = INF_STATUS_WRONG_INF_STYLE; + return NULL; + } + + parser->line = InfpAddLine(parser->cur_section); + if (parser->line == NULL) + goto error; + } + else + { +// assert(!is_key); + } + + if (is_key) + { + field = InfpAddKeyToLine(parser->line, parser->token); + } + else + { + field = InfpAddFieldToLine(parser->line, parser->token); + } + + if (field != NULL) + { + parser->token_len = 0; + return field; + } + +error: + parser->error = INF_STATUS_NOT_ENOUGH_MEMORY; + return NULL; +} + + +/* close the current line and prepare for parsing a new one */ +static void close_current_line( struct parser *parser ) +{ + parser->line = NULL; +} + + + +/* handler for parser LINE_START state */ +static const WCHAR *line_start_state( struct parser *parser, const WCHAR *pos ) +{ + const WCHAR *p; + + for (p = pos; !is_eof( parser, p ); p++) + { + switch(*p) + { + case '\r': + continue; + + case '\n': + parser->line_pos++; + close_current_line( parser ); + break; + + case ';': + push_state( parser, LINE_START ); + set_state( parser, COMMENT ); + return p + 1; + + case '[': + parser->start = p + 1; + set_state( parser, SECTION_NAME ); + return p + 1; + + default: + if (!iswspace(*p)) + { + parser->start = p; + set_state( parser, KEY_NAME ); + return p; + } + break; + } + } + close_current_line( parser ); + return NULL; +} + + +/* handler for parser SECTION_NAME state */ +static const WCHAR *section_name_state( struct parser *parser, const WCHAR *pos ) +{ + const WCHAR *p; + + for (p = pos; !is_eol( parser, p ); p++) + { + if (*p == ']') + { + push_token( parser, p ); + if (add_section_from_token( parser ) == NULL) + return NULL; + push_state( parser, LINE_START ); + set_state( parser, COMMENT ); /* ignore everything else on the line */ + return p + 1; + } + } + parser->error = INF_STATUS_BAD_SECTION_NAME_LINE; /* unfinished section name */ + return NULL; +} + + +/* handler for parser KEY_NAME state */ +static const WCHAR *key_name_state( struct parser *parser, const WCHAR *pos ) +{ + const WCHAR *p, *token_end = parser->start; + + for (p = pos; !is_eol( parser, p ); p++) + { + if (*p == ',') break; + switch(*p) + { + + case '=': + push_token( parser, token_end ); + if (!add_field_from_token( parser, 1 )) return NULL; + parser->start = p + 1; + push_state( parser, VALUE_NAME ); + set_state( parser, LEADING_SPACES ); + return p + 1; + case ';': + push_token( parser, token_end ); + if (!add_field_from_token( parser, 0 )) return NULL; + push_state( parser, LINE_START ); + set_state( parser, COMMENT ); + return p + 1; + case '"': + push_token( parser, token_end ); + parser->start = p + 1; + push_state( parser, KEY_NAME ); + set_state( parser, QUOTES ); + return p + 1; + case '\\': + push_token( parser, token_end ); + parser->start = p; + push_state( parser, KEY_NAME ); + set_state( parser, EOL_BACKSLASH ); + return p; + default: + if (!iswspace(*p)) token_end = p + 1; + else + { + push_token( parser, p ); + push_state( parser, KEY_NAME ); + set_state( parser, TRAILING_SPACES ); + return p; + } + break; + } + } + push_token( parser, token_end ); + set_state( parser, VALUE_NAME ); + return p; +} + + +/* handler for parser VALUE_NAME state */ +static const WCHAR *value_name_state( struct parser *parser, const WCHAR *pos ) +{ + const WCHAR *p, *token_end = parser->start; + + for (p = pos; !is_eol( parser, p ); p++) + { + switch(*p) + { + case ';': + push_token( parser, token_end ); + if (!add_field_from_token( parser, 0 )) return NULL; + push_state( parser, LINE_START ); + set_state( parser, COMMENT ); + return p + 1; + case ',': + push_token( parser, token_end ); + if (!add_field_from_token( parser, 0 )) return NULL; + parser->start = p + 1; + push_state( parser, VALUE_NAME ); + set_state( parser, LEADING_SPACES ); + return p + 1; + case '"': + push_token( parser, token_end ); + parser->start = p + 1; + push_state( parser, VALUE_NAME ); + set_state( parser, QUOTES ); + return p + 1; + case '\\': + push_token( parser, token_end ); + parser->start = p; + push_state( parser, VALUE_NAME ); + set_state( parser, EOL_BACKSLASH ); + return p; + default: + if (!isspace(*p)) token_end = p + 1; + else + { + push_token( parser, p ); + push_state( parser, VALUE_NAME ); + set_state( parser, TRAILING_SPACES ); + return p; + } + break; + } + } + push_token( parser, token_end ); + if (!add_field_from_token( parser, 0 )) return NULL; + set_state( parser, LINE_START ); + return p; +} + + +/* handler for parser EOL_BACKSLASH state */ +static const WCHAR *eol_backslash_state( struct parser *parser, const WCHAR *pos ) +{ + const WCHAR *p; + + for (p = pos; !is_eof( parser, p ); p++) + { + switch(*p) + { + case '\r': + continue; + + case '\n': + parser->line_pos++; + parser->start = p + 1; + set_state( parser, LEADING_SPACES ); + return p + 1; + + case '\\': + continue; + + case ';': + push_state( parser, EOL_BACKSLASH ); + set_state( parser, COMMENT ); + return p + 1; + + default: + if (iswspace(*p)) + continue; + push_token( parser, p ); + pop_state( parser ); + return p; + } + } + parser->start = p; + pop_state( parser ); + + return p; +} + + +/* handler for parser QUOTES state */ +static const WCHAR *quotes_state( struct parser *parser, const WCHAR *pos ) +{ + const WCHAR *p, *token_end = parser->start; + + for (p = pos; !is_eol( parser, p ); p++) + { + if (*p == '"') + { + if (p+1 < parser->end && p[1] == '"') /* double quotes */ + { + push_token( parser, p + 1 ); + parser->start = token_end = p + 2; + p++; + } + else /* end of quotes */ + { + push_token( parser, p ); + parser->start = p + 1; + pop_state( parser ); + return p + 1; + } + } + } + push_token( parser, p ); + pop_state( parser ); + return p; +} + + +/* handler for parser LEADING_SPACES state */ +static const WCHAR *leading_spaces_state( struct parser *parser, const WCHAR *pos ) +{ + const WCHAR *p; + + for (p = pos; !is_eol( parser, p ); p++) + { + if (*p == '\\') + { + parser->start = p; + set_state( parser, EOL_BACKSLASH ); + return p; + } + if (!iswspace(*p)) + break; + } + parser->start = p; + pop_state( parser ); + return p; +} + + +/* handler for parser TRAILING_SPACES state */ +static const WCHAR *trailing_spaces_state( struct parser *parser, const WCHAR *pos ) +{ + const WCHAR *p; + + for (p = pos; !is_eol( parser, p ); p++) + { + if (*p == '\\') + { + set_state( parser, EOL_BACKSLASH ); + return p; + } + if (!iswspace(*p)) + break; + } + pop_state( parser ); + return p; +} + + +/* handler for parser COMMENT state */ +static const WCHAR *comment_state( struct parser *parser, const WCHAR *pos ) +{ + const WCHAR *p = pos; + + while (!is_eol( parser, p )) + p++; + pop_state( parser ); + return p; +} + + +/* parse a complete buffer */ +INFSTATUS +InfpParseBuffer (PINFCACHE file, + const WCHAR *buffer, + const WCHAR *end, + PULONG error_line) +{ + struct parser parser; + const WCHAR *pos = buffer; + + parser.start = buffer; + parser.end = end; + parser.file = file; + parser.line = NULL; + parser.state = LINE_START; + parser.stack_pos = 0; + parser.cur_section = NULL; + parser.line_pos = 1; + parser.error = 0; + parser.token_len = 0; + + /* parser main loop */ + while (pos) + pos = (parser_funcs[parser.state])(&parser, pos); + + if (parser.error) + { + if (error_line) + *error_line = parser.line_pos; + return parser.error; + } + + /* find the [strings] section */ + file->StringsSection = InfpFindSection(file, + L"Strings"); + + return INF_STATUS_SUCCESS; +} + +/* EOF */ diff --git a/reactos/lib/newinflib/infget.c b/reactos/lib/newinflib/infget.c new file mode 100644 index 00000000000..1cdbebf2ee5 --- /dev/null +++ b/reactos/lib/newinflib/infget.c @@ -0,0 +1,668 @@ +/* + * PROJECT: .inf file parser + * LICENSE: GPL - See COPYING in the top level directory + * PROGRAMMER: Royce Mitchell III + * Eric Kohl + * Ge van Geldorp + */ + +/* INCLUDES *****************************************************************/ + +#include "inflib.h" + +#define NDEBUG +#include + +static unsigned int +InfpSubstituteString(PINFCACHE Inf, + const WCHAR *text, + WCHAR *buffer, + unsigned int size); + +/* retrieve the string substitution for a given string, or NULL if not found */ +/* if found, len is set to the substitution length */ +static PCWSTR +InfpGetSubstitutionString(PINFCACHE Inf, + PCWSTR str, + unsigned int *len, + BOOL no_trailing_slash) +{ + static const WCHAR percent = '%'; + + INFSTATUS Status = INF_STATUS_NOT_FOUND; + PINFCONTEXT Context = NULL; + PWCHAR Data = NULL; + WCHAR ValueName[MAX_INF_STRING_LENGTH +1]; + WCHAR StringLangId[13]; + + if (!*len) /* empty string (%%) is replaced by single percent */ + { + *len = 1; + return &percent; + } + + wcsncpy(ValueName, str, *len); + ValueName[*len] = 0; + + DPRINT("Value name: %S\n", ValueName); + + if (Inf->LocaleId != 0) + { + swprintf(StringLangId, + L"Strings.%04hx", + Inf->LocaleId); + + Status = InfpFindFirstLine(Inf, + StringLangId, + ValueName, + &Context); + if (Status != INF_STATUS_SUCCESS) + { + swprintf(StringLangId, + L"Strings.%04hx", + MAKELANGID(PRIMARYLANGID(Inf->LocaleId), SUBLANG_NEUTRAL)); + + Status = InfpFindFirstLine(Inf, + StringLangId, + ValueName, + &Context); + if (Status != INF_STATUS_SUCCESS) + { + Status = InfpFindFirstLine(Inf, + L"Strings", + ValueName, + &Context); + } + } + } + else + { + Status = InfpFindFirstLine(Inf, + L"Strings", + ValueName, + &Context); + } + + if (Status != INF_STATUS_SUCCESS || Context == NULL) + return NULL; + + Status = InfpGetData(Context, + NULL, + &Data); + + InfpFreeContext(Context); + + if (Status == STATUS_SUCCESS) + { + *len = wcslen(Data); + DPRINT("Substitute: %S Length: %ul\n", Data, *len); + return Data; + } + + return NULL; +} + + +/* do string substitutions on the specified text */ +/* the buffer is assumed to be large enough */ +/* returns necessary length not including terminating null */ +static unsigned int +InfpSubstituteString(PINFCACHE Inf, + PCWSTR text, + PWSTR buffer, + unsigned int size) +{ + const WCHAR *start, *subst, *p; + unsigned int len, total = 0; + int inside = 0; + + if (!buffer) size = MAX_INF_STRING_LENGTH + 1; + for (p = start = text; *p; p++) + { + if (*p != '%') continue; + inside = !inside; + if (inside) /* start of a %xx% string */ + { + len = (unsigned int)(p - start); + if (len > size - 1) len = size - 1; + if (buffer) memcpy( buffer + total, start, len * sizeof(WCHAR) ); + total += len; + size -= len; + start = p; + } + else /* end of the %xx% string, find substitution */ + { + len = (unsigned int)(p - start - 1); + subst = InfpGetSubstitutionString( Inf, start + 1, &len, p[1] == '\\' ); + if (!subst) + { + subst = start; + len = (unsigned int)(p - start + 1); + } + if (len > size - 1) len = size - 1; + if (buffer) memcpy( buffer + total, subst, len * sizeof(WCHAR) ); + total += len; + size -= len; + start = p + 1; + } + } + + if (start != p) /* unfinished string, copy it */ + { + len = (unsigned int)(p - start); + if (len > size - 1) len = size - 1; + if (buffer) memcpy( buffer + total, start, len * sizeof(WCHAR) ); + total += len; + } + if (buffer && size) buffer[total] = 0; + return total; +} + + +INFSTATUS +InfpFindFirstLine(PINFCACHE Cache, + PCWSTR Section, + PCWSTR Key, + PINFCONTEXT *Context) +{ + PINFCACHESECTION CacheSection; + PINFCACHELINE CacheLine; + + if (Cache == NULL || Section == NULL || Context == NULL) + { + DPRINT1("Invalid parameter\n"); + return INF_STATUS_INVALID_PARAMETER; + } + + CacheSection = InfpFindSection(Cache, Section); + if (NULL == CacheSection) + { + DPRINT("Section not found\n"); + return INF_STATUS_NOT_FOUND; + } + + if (Key != NULL) + { + CacheLine = InfpFindKeyLine(CacheSection, Key); + } + else + { + CacheLine = CacheSection->FirstLine; + } + + if (NULL == CacheLine) + { + DPRINT("Key not found\n"); + return INF_STATUS_NOT_FOUND; + } + + *Context = MALLOC(sizeof(INFCONTEXT)); + if (NULL == *Context) + { + DPRINT1("MALLOC() failed\n"); + return INF_STATUS_NO_MEMORY; + } + (*Context)->Inf = (PVOID)Cache; + (*Context)->Section = (PVOID)CacheSection; + (*Context)->Line = (PVOID)CacheLine; + + return INF_STATUS_SUCCESS; +} + + +INFSTATUS +InfpFindNextLine(PINFCONTEXT ContextIn, + PINFCONTEXT ContextOut) +{ + PINFCACHELINE CacheLine; + + if (ContextIn == NULL || ContextOut == NULL) + return INF_STATUS_INVALID_PARAMETER; + + if (ContextIn->Line == NULL) + return INF_STATUS_INVALID_PARAMETER; + + CacheLine = (PINFCACHELINE)ContextIn->Line; + if (CacheLine->Next == NULL) + return INF_STATUS_NOT_FOUND; + + if (ContextIn != ContextOut) + { + ContextOut->Inf = ContextIn->Inf; + ContextOut->Section = ContextIn->Section; + } + ContextOut->Line = (PVOID)(CacheLine->Next); + + return INF_STATUS_SUCCESS; +} + + +INFSTATUS +InfpFindFirstMatchLine(PINFCONTEXT ContextIn, + PCWSTR Key, + PINFCONTEXT ContextOut) +{ + PINFCACHELINE CacheLine; + + if (ContextIn == NULL || ContextOut == NULL || Key == NULL || *Key == 0) + return INF_STATUS_INVALID_PARAMETER; + + if (ContextIn->Inf == NULL || ContextIn->Section == NULL) + return INF_STATUS_INVALID_PARAMETER; + + CacheLine = ((PINFCACHESECTION)(ContextIn->Section))->FirstLine; + while (CacheLine != NULL) + { + if (CacheLine->Key != NULL && _wcsicmp (CacheLine->Key, Key) == 0) + { + + if (ContextIn != ContextOut) + { + ContextOut->Inf = ContextIn->Inf; + ContextOut->Section = ContextIn->Section; + } + ContextOut->Line = (PVOID)CacheLine; + + return INF_STATUS_SUCCESS; + } + + CacheLine = CacheLine->Next; + } + + return INF_STATUS_NOT_FOUND; +} + + +INFSTATUS +InfpFindNextMatchLine(PINFCONTEXT ContextIn, + PCWSTR Key, + PINFCONTEXT ContextOut) +{ + PINFCACHELINE CacheLine; + + if (ContextIn == NULL || ContextOut == NULL || Key == NULL || *Key == 0) + return INF_STATUS_INVALID_PARAMETER; + + if (ContextIn->Inf == NULL || ContextIn->Section == NULL || ContextIn->Line == NULL) + return INF_STATUS_INVALID_PARAMETER; + + CacheLine = (PINFCACHELINE)ContextIn->Line; + while (CacheLine != NULL) + { + if (CacheLine->Key != NULL && _wcsicmp (CacheLine->Key, Key) == 0) + { + + if (ContextIn != ContextOut) + { + ContextOut->Inf = ContextIn->Inf; + ContextOut->Section = ContextIn->Section; + } + ContextOut->Line = (PVOID)CacheLine; + + return INF_STATUS_SUCCESS; + } + + CacheLine = CacheLine->Next; + } + + return INF_STATUS_NOT_FOUND; +} + + +LONG +InfpGetLineCount(HINF InfHandle, + PCWSTR Section) +{ + PINFCACHE Cache; + PINFCACHESECTION CacheSection; + + if (InfHandle == NULL || Section == NULL) + { + DPRINT("Invalid parameter\n"); + return -1; + } + + Cache = (PINFCACHE)InfHandle; + + /* Iterate through list of sections */ + CacheSection = Cache->FirstSection; + while (CacheSection != NULL) + { + /* Are the section names the same? */ + if (_wcsicmp(CacheSection->Name, Section) == 0) + { + return CacheSection->LineCount; + } + + /* Get the next section */ + CacheSection = CacheSection->Next; + } + + DPRINT("Section not found\n"); + + return -1; +} + + +/* InfpGetLineText */ + + +LONG +InfpGetFieldCount(PINFCONTEXT Context) +{ + if (Context == NULL || Context->Line == NULL) + return 0; + + return ((PINFCACHELINE)Context->Line)->FieldCount; +} + + +INFSTATUS +InfpGetBinaryField(PINFCONTEXT Context, + ULONG FieldIndex, + PUCHAR ReturnBuffer, + ULONG ReturnBufferSize, + PULONG RequiredSize) +{ + PINFCACHELINE CacheLine; + PINFCACHEFIELD CacheField; + ULONG Index; + ULONG Size; + PUCHAR Ptr; + + if (Context == NULL || Context->Line == NULL || FieldIndex == 0) + { + DPRINT("Invalid parameter\n"); + return INF_STATUS_INVALID_PARAMETER; + } + + if (RequiredSize != NULL) + *RequiredSize = 0; + + CacheLine = (PINFCACHELINE)Context->Line; + + if (FieldIndex > (ULONG)CacheLine->FieldCount) + return INF_STATUS_NOT_FOUND; + + CacheField = CacheLine->FirstField; + for (Index = 1; Index < FieldIndex; Index++) + CacheField = CacheField->Next; + + Size = (ULONG)CacheLine->FieldCount - FieldIndex + 1; + + if (RequiredSize != NULL) + *RequiredSize = Size; + + if (ReturnBuffer != NULL) + { + if (ReturnBufferSize < Size) + return INF_STATUS_BUFFER_OVERFLOW; + + /* Copy binary data */ + Ptr = ReturnBuffer; + while (CacheField != NULL) + { + *Ptr = (UCHAR)wcstoul(CacheField->Data, NULL, 16); + + Ptr++; + CacheField = CacheField->Next; + } + } + + return INF_STATUS_SUCCESS; +} + + +INFSTATUS +InfpGetIntField(PINFCONTEXT Context, + ULONG FieldIndex, + PLONG IntegerValue) +{ + PINFCACHELINE CacheLine; + PINFCACHEFIELD CacheField; + ULONG Index; + PWCHAR Ptr; + + if (Context == NULL || Context->Line == NULL || IntegerValue == NULL) + { + DPRINT("Invalid parameter\n"); + return INF_STATUS_INVALID_PARAMETER; + } + + CacheLine = (PINFCACHELINE)Context->Line; + + if (FieldIndex > (ULONG)CacheLine->FieldCount) + { + DPRINT("Invalid parameter\n"); + return INF_STATUS_INVALID_PARAMETER; + } + + if (FieldIndex == 0) + { + Ptr = CacheLine->Key; + } + else + { + CacheField = CacheLine->FirstField; + for (Index = 1; Index < FieldIndex; Index++) + CacheField = CacheField->Next; + + Ptr = CacheField->Data; + } + + *IntegerValue = (LONG)wcstol(Ptr, NULL, 0); + + return INF_STATUS_SUCCESS; +} + + +INFSTATUS +InfpGetMultiSzField(PINFCONTEXT Context, + ULONG FieldIndex, + PWSTR ReturnBuffer, + ULONG ReturnBufferSize, + PULONG RequiredSize) +{ + PINFCACHELINE CacheLine; + PINFCACHEFIELD CacheField; + PINFCACHEFIELD FieldPtr; + ULONG Index; + ULONG Size; + PWCHAR Ptr; + + if (Context == NULL || Context->Line == NULL || FieldIndex == 0) + { + DPRINT("Invalid parameter\n"); + return INF_STATUS_INVALID_PARAMETER; + } + + if (RequiredSize != NULL) + *RequiredSize = 0; + + CacheLine = (PINFCACHELINE)Context->Line; + + if (FieldIndex > (ULONG)CacheLine->FieldCount) + return INF_STATUS_INVALID_PARAMETER; + + CacheField = CacheLine->FirstField; + for (Index = 1; Index < FieldIndex; Index++) + CacheField = CacheField->Next; + + /* Calculate the required buffer size */ + FieldPtr = CacheField; + Size = 0; + while (FieldPtr != NULL) + { + Size += ((ULONG)wcslen (FieldPtr->Data) + 1); + FieldPtr = FieldPtr->Next; + } + Size++; + + if (RequiredSize != NULL) + *RequiredSize = Size; + + if (ReturnBuffer != NULL) + { + if (ReturnBufferSize < Size) + return INF_STATUS_BUFFER_OVERFLOW; + + /* Copy multi-sz string */ + Ptr = ReturnBuffer; + FieldPtr = CacheField; + while (FieldPtr != NULL) + { + Size = (ULONG)wcslen (FieldPtr->Data) + 1; + + wcscpy (Ptr, FieldPtr->Data); + + Ptr = Ptr + Size; + FieldPtr = FieldPtr->Next; + } + *Ptr = 0; + } + + return INF_STATUS_SUCCESS; +} + + +INFSTATUS +InfpGetStringField(PINFCONTEXT Context, + ULONG FieldIndex, + PWSTR ReturnBuffer, + ULONG ReturnBufferSize, + PULONG RequiredSize) +{ + PINFCACHELINE CacheLine; + PINFCACHEFIELD CacheField; + ULONG Index; + PWCHAR Ptr; + ULONG Size; + + if (Context == NULL || Context->Line == NULL || FieldIndex == 0) + { + DPRINT("Invalid parameter\n"); + return INF_STATUS_INVALID_PARAMETER; + } + + if (RequiredSize != NULL) + *RequiredSize = 0; + + CacheLine = (PINFCACHELINE)Context->Line; + + if (FieldIndex > (ULONG)CacheLine->FieldCount) + return INF_STATUS_INVALID_PARAMETER; + + if (FieldIndex == 0) + { + Ptr = CacheLine->Key; + } + else + { + CacheField = CacheLine->FirstField; + for (Index = 1; Index < FieldIndex; Index++) + CacheField = CacheField->Next; + + Ptr = CacheField->Data; + } + +// Size = (ULONG)wcslen (Ptr) + 1; + Size = InfpSubstituteString(Context->Inf, + Ptr, + NULL, + 0); + + if (RequiredSize != NULL) + *RequiredSize = Size + 1; + + if (ReturnBuffer != NULL) + { + if (ReturnBufferSize <= Size) + return INF_STATUS_BUFFER_OVERFLOW; + +// wcscpy (ReturnBuffer, Ptr); + InfpSubstituteString(Context->Inf, + Ptr, + ReturnBuffer, + ReturnBufferSize); + } + + return INF_STATUS_SUCCESS; +} + + +INFSTATUS +InfpGetData(PINFCONTEXT Context, + PWCHAR *Key, + PWCHAR *Data) +{ + PINFCACHELINE CacheKey; + + if (Context == NULL || Context->Line == NULL || Data == NULL) + { + DPRINT("Invalid parameter\n"); + return INF_STATUS_INVALID_PARAMETER; + } + + CacheKey = (PINFCACHELINE)Context->Line; + if (Key != NULL) + *Key = CacheKey->Key; + + if (Data != NULL) + { + if (CacheKey->FirstField == NULL) + { + *Data = NULL; + } + else + { + *Data = CacheKey->FirstField->Data; + } + } + + return INF_STATUS_SUCCESS; +} + + +INFSTATUS +InfpGetDataField(PINFCONTEXT Context, + ULONG FieldIndex, + PWCHAR *Data) +{ + PINFCACHELINE CacheLine; + PINFCACHEFIELD CacheField; + ULONG Index; + + if (Context == NULL || Context->Line == NULL || Data == NULL) + { + DPRINT("Invalid parameter\n"); + return INF_STATUS_INVALID_PARAMETER; + } + + CacheLine = (PINFCACHELINE)Context->Line; + + if (FieldIndex > (ULONG)CacheLine->FieldCount) + return INF_STATUS_INVALID_PARAMETER; + + if (FieldIndex == 0) + { + *Data = CacheLine->Key; + } + else + { + CacheField = CacheLine->FirstField; + for (Index = 1; Index < FieldIndex; Index++) + CacheField = CacheField->Next; + + *Data = CacheField->Data; + } + + return INF_STATUS_SUCCESS; +} + +VOID +InfpFreeContext(PINFCONTEXT Context) +{ + FREE(Context); +} + +/* EOF */ diff --git a/reactos/lib/newinflib/infhost.h b/reactos/lib/newinflib/infhost.h new file mode 100644 index 00000000000..6cdb37cbfa1 --- /dev/null +++ b/reactos/lib/newinflib/infhost.h @@ -0,0 +1,86 @@ +/* + * PROJECT: .inf file parser + * LICENSE: GPL - See COPYING in the top level directory + * PROGRAMMER: Royce Mitchell III + * Eric Kohl + * Ge van Geldorp + */ + +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#include "infcommon.h" + +extern NTSTATUS NTAPI RtlMultiByteToUnicodeN(IN PWCHAR UnicodeString, + IN ULONG UnicodeSize, IN PULONG ResultSize, IN PCSTR MbString, IN ULONG MbSize); + +extern BOOLEAN NTAPI RtlIsTextUnicode( PVOID buf, INT len, INT *pf ); + + +extern int InfHostOpenBufferedFile(PHINF InfHandle, + void *Buffer, + ULONG BufferSize, + LCID LocaleId, + ULONG *ErrorLine); +extern int InfHostOpenFile(PHINF InfHandle, + const CHAR *FileName, + LCID LocaleId, + ULONG *ErrorLine); +extern int InfHostWriteFile(HINF InfHandle, + const CHAR *FileName, + const CHAR *HeaderComment); +extern void InfHostCloseFile(HINF InfHandle); +extern int InfHostFindFirstLine(HINF InfHandle, + const WCHAR *Section, + const WCHAR *Key, + PINFCONTEXT *Context); +extern int InfHostFindNextLine(PINFCONTEXT ContextIn, + PINFCONTEXT ContextOut); +extern int InfHostFindFirstMatchLine(PINFCONTEXT ContextIn, + const WCHAR *Key, + PINFCONTEXT ContextOut); +extern int InfHostFindNextMatchLine(PINFCONTEXT ContextIn, + const WCHAR *Key, + PINFCONTEXT ContextOut); +extern LONG InfHostGetLineCount(HINF InfHandle, + const WCHAR *Section); +extern LONG InfHostGetFieldCount(PINFCONTEXT Context); +extern int InfHostGetBinaryField(PINFCONTEXT Context, + ULONG FieldIndex, + UCHAR *ReturnBuffer, + ULONG ReturnBufferSize, + ULONG *RequiredSize); +extern int InfHostGetIntField(PINFCONTEXT Context, + ULONG FieldIndex, + ULONG *IntegerValue); +extern int InfHostGetMultiSzField(PINFCONTEXT Context, + ULONG FieldIndex, + WCHAR *ReturnBuffer, + ULONG ReturnBufferSize, + ULONG *RequiredSize); +extern int InfHostGetStringField(PINFCONTEXT Context, + ULONG FieldIndex, + WCHAR *ReturnBuffer, + ULONG ReturnBufferSize, + ULONG *RequiredSize); +extern int InfHostGetData(PINFCONTEXT Context, + WCHAR **Key, + WCHAR **Data); +extern int InfHostGetDataField(PINFCONTEXT Context, + ULONG FieldIndex, + WCHAR **Data); +extern int InfHostFindOrAddSection(HINF InfHandle, + const WCHAR *Section, + PINFCONTEXT *Context); +extern int InfHostAddLine(PINFCONTEXT Context, const WCHAR *Key); +extern int InfHostAddField(PINFCONTEXT Context, const WCHAR *Data); +extern void InfHostFreeContext(PINFCONTEXT Context); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +/* EOF */ diff --git a/reactos/lib/newinflib/infhostgen.c b/reactos/lib/newinflib/infhostgen.c new file mode 100644 index 00000000000..e5ad1b96e9b --- /dev/null +++ b/reactos/lib/newinflib/infhostgen.c @@ -0,0 +1,316 @@ +/* + * PROJECT: .inf file parser + * LICENSE: GPL - See COPYING in the top level directory + * PROGRAMMER: Royce Mitchell III + * Eric Kohl + * Ge van Geldorp + */ + +/* INCLUDES *****************************************************************/ + +#include "inflib.h" +#include "infhost.h" + +#define NDEBUG +#include + +/* PUBLIC FUNCTIONS *********************************************************/ + +int +InfHostOpenBufferedFile(PHINF InfHandle, + void *Buffer, + ULONG BufferSize, + LCID LocaleId, + ULONG *ErrorLine) +{ + INFSTATUS Status; + PINFCACHE Cache; + WCHAR *FileBuffer; + ULONG FileBufferSize; + + *InfHandle = NULL; + *ErrorLine = (ULONG)-1; + + /* Allocate file buffer */ + FileBufferSize = BufferSize + 2; + FileBuffer = MALLOC(FileBufferSize); + if (FileBuffer == NULL) + { + DPRINT1("MALLOC() failed\n"); + return(INF_STATUS_INSUFFICIENT_RESOURCES); + } + + MEMCPY(FileBuffer, Buffer, BufferSize); + + /* Append string terminator */ + FileBuffer[BufferSize] = 0; + FileBuffer[BufferSize + 1] = 0; + + /* Allocate infcache header */ + Cache = (PINFCACHE)MALLOC(sizeof(INFCACHE)); + if (Cache == NULL) + { + DPRINT1("MALLOC() failed\n"); + FREE(FileBuffer); + return(INF_STATUS_INSUFFICIENT_RESOURCES); + } + + /* Initialize inicache header */ + ZEROMEMORY(Cache, + sizeof(INFCACHE)); + + Cache->LocaleId = LocaleId; + + if (!RtlIsTextUnicode(FileBuffer, (INT)FileBufferSize, NULL)) + { +// static const BYTE utf8_bom[3] = { 0xef, 0xbb, 0xbf }; + WCHAR *new_buff; +// UINT codepage = CP_ACP; + UINT offset = 0; + +// if (BufferSize > sizeof(utf8_bom) && !memcmp(FileBuffer, utf8_bom, sizeof(utf8_bom) )) +// { +// codepage = CP_UTF8; +// offset = sizeof(utf8_bom); +// } + + new_buff = MALLOC(FileBufferSize * sizeof(WCHAR)); + if (new_buff != NULL) + { +// DWORD len = MultiByteToWideChar( codepage, 0, (char *)FileBuffer + offset, +// FileBufferSize - offset, new_buff, FileBufferSize); + + ULONG len; + Status = RtlMultiByteToUnicodeN(new_buff, + FileBufferSize * sizeof(WCHAR), + &len, + (char *)FileBuffer + offset, + FileBufferSize - offset); + + Status = InfpParseBuffer(Cache, + new_buff, + new_buff + len / sizeof(WCHAR), + ErrorLine); + FREE(new_buff); + } + else + Status = INF_STATUS_INSUFFICIENT_RESOURCES; + } + else + { + WCHAR *new_buff = (WCHAR *)FileBuffer; + /* UCS-16 files should start with the Unicode BOM; we should skip it */ + if (*new_buff == 0xfeff) + { + new_buff++; + FileBufferSize -= sizeof(WCHAR); + } + Status = InfpParseBuffer(Cache, + new_buff, + (WCHAR*)((char*)new_buff + FileBufferSize), + ErrorLine); + } + + /* Parse the inf buffer */ +// Status = InfpParseBuffer (Cache, +// FileBuffer, +// FileBuffer + BufferSize, +// ErrorLine); + if (!INF_SUCCESS(Status)) + { + FREE(Cache); + Cache = NULL; + } + + /* Free file buffer */ + FREE(FileBuffer); + + *InfHandle = (HINF)Cache; + + return INF_SUCCESS(Status) ? 0 : -1; +} + + +int +InfHostOpenFile(PHINF InfHandle, + const CHAR *FileName, + LCID LocaleId, + ULONG *ErrorLine) +{ + FILE *File; + CHAR *FileBuffer; + ULONG FileLength; + ULONG FileBufferLength; + PINFCACHE Cache; + INFSTATUS Status = INF_STATUS_SUCCESS; + + *InfHandle = NULL; + *ErrorLine = (ULONG)-1; + + /* Open the inf file */ + File = fopen(FileName, "rb"); + if (NULL == File) + { + DPRINT1("fopen() failed (errno %d)\n", errno); + return -1; + } + + DPRINT("fopen() successful\n"); + + /* Query file size */ + if (fseek(File, (size_t)0, SEEK_END)) + { + DPRINT1("fseek() to EOF failed (errno %d)\n", errno); + fclose(File); + return -1; + } + + FileLength = (ULONG)ftell(File); + if ((ULONG) -1 == FileLength) + { + DPRINT1("ftell() failed (errno %d)\n", errno); + fclose(File); + return -1; + } + DPRINT("File size: %u\n", (UINT)FileLength); + + /* Rewind */ + if (fseek(File, (size_t)0, SEEK_SET)) + { + DPRINT1("fseek() to BOF failed (errno %d)\n", errno); + fclose(File); + return -1; + } + + /* Allocate file buffer */ + FileBufferLength = FileLength + 2; + FileBuffer = MALLOC(FileBufferLength); + if (FileBuffer == NULL) + { + DPRINT1("MALLOC() failed\n"); + fclose(File); + return -1; + } + + /* Read file */ + if (FileLength != fread(FileBuffer, (size_t)1, (size_t)FileLength, File)) + { + DPRINT1("fread() failed (errno %d)\n", errno); + fclose(File); + return -1; + } + + fclose(File); + + /* Append string terminator */ + FileBuffer[FileLength] = 0; + FileBuffer[FileLength + 1] = 0; + + /* Allocate infcache header */ + Cache = (PINFCACHE)MALLOC(sizeof(INFCACHE)); + if (Cache == NULL) + { + DPRINT1("MALLOC() failed\n"); + FREE(FileBuffer); + return -1; + } + + /* Initialize inicache header */ + ZEROMEMORY(Cache, + sizeof(INFCACHE)); + + Cache->LocaleId = LocaleId; + + /* Parse the inf buffer */ + if (!RtlIsTextUnicode(FileBuffer, (INT)FileBufferLength, NULL)) + { +// static const BYTE utf8_bom[3] = { 0xef, 0xbb, 0xbf }; + WCHAR *new_buff; +// UINT codepage = CP_ACP; + UINT offset = 0; + +// if (FileLength > sizeof(utf8_bom) && !memcmp(FileBuffer, utf8_bom, sizeof(utf8_bom) )) +// { +// codepage = CP_UTF8; +// offset = sizeof(utf8_bom); +// } + + new_buff = MALLOC(FileBufferLength * sizeof(WCHAR)); + if (new_buff != NULL) + { +// DWORD len = MultiByteToWideChar( codepage, 0, (char *)FileBuffer + offset, +// FileLength - offset, new_buff, FileLength); + + ULONG len; + Status = RtlMultiByteToUnicodeN(new_buff, + FileBufferLength * sizeof(WCHAR), + &len, + (char *)FileBuffer + offset, + FileBufferLength - offset); + + Status = InfpParseBuffer(Cache, + new_buff, + new_buff + len / sizeof(WCHAR), + ErrorLine); + + FREE(new_buff); + } + else + Status = INF_STATUS_INSUFFICIENT_RESOURCES; + } + else + { + WCHAR *new_buff = (WCHAR *)FileBuffer; + /* UCS-16 files should start with the Unicode BOM; we should skip it */ + if (*new_buff == 0xfeff) + { + new_buff++; + FileBufferLength -= sizeof(WCHAR); + } + Status = InfpParseBuffer(Cache, + new_buff, + (WCHAR*)((char*)new_buff + FileBufferLength), + ErrorLine); + } + +// Status = InfpParseBuffer (Cache, +// FileBuffer, +// FileBuffer + FileLength, +// ErrorLine); + if (!INF_SUCCESS(Status)) + { + FREE(Cache); + Cache = NULL; + } + + /* Free file buffer */ + FREE(FileBuffer); + + *InfHandle = (HINF)Cache; + + return INF_SUCCESS(Status) ? 0 : -1; +} + + +void +InfHostCloseFile(HINF InfHandle) +{ + PINFCACHE Cache; + + Cache = (PINFCACHE)InfHandle; + + if (Cache == NULL) + { + return; + } + + while (Cache->FirstSection != NULL) + { + Cache->FirstSection = InfpFreeSection(Cache->FirstSection); + } + Cache->LastSection = NULL; + + FREE(Cache); +} + +/* EOF */ diff --git a/reactos/lib/newinflib/infhostget.c b/reactos/lib/newinflib/infhostget.c new file mode 100644 index 00000000000..bd49be17002 --- /dev/null +++ b/reactos/lib/newinflib/infhostget.c @@ -0,0 +1,249 @@ +/* + * PROJECT: .inf file parser + * LICENSE: GPL - See COPYING in the top level directory + * PROGRAMMER: Royce Mitchell III + * Eric Kohl + * Ge van Geldorp + */ + +/* INCLUDES *****************************************************************/ + +#include "inflib.h" +#include "infhost.h" + +#define NDEBUG +#include + +int +InfHostFindFirstLine(HINF InfHandle, + const WCHAR *Section, + const WCHAR *Key, + PINFCONTEXT *Context) +{ + INFSTATUS Status; + + Status = InfpFindFirstLine(InfHandle, Section, Key, Context); + if (INF_SUCCESS(Status)) + { + return 0; + } + else + { + errno = Status; + return -1; + } +} + + +int +InfHostFindNextLine(PINFCONTEXT ContextIn, + PINFCONTEXT ContextOut) +{ + INFSTATUS Status; + + Status = InfpFindNextLine(ContextIn, ContextOut); + if (INF_SUCCESS(Status)) + { + return 0; + } + else + { + errno = Status; + return -1; + } +} + + +int +InfHostFindFirstMatchLine(PINFCONTEXT ContextIn, + const WCHAR *Key, + PINFCONTEXT ContextOut) +{ + INFSTATUS Status; + + Status = InfpFindFirstMatchLine(ContextIn, Key, ContextOut); + if (INF_SUCCESS(Status)) + { + return 0; + } + else + { + errno = Status; + return -1; + } +} + + +int +InfHostFindNextMatchLine(PINFCONTEXT ContextIn, + const WCHAR *Key, + PINFCONTEXT ContextOut) +{ + INFSTATUS Status; + + Status = InfpFindNextMatchLine(ContextIn, Key, ContextOut); + if (INF_SUCCESS(Status)) + { + return 0; + } + else + { + errno = Status; + return -1; + } +} + + +LONG +InfHostGetLineCount(HINF InfHandle, + PCWSTR Section) +{ + return InfpGetLineCount(InfHandle, Section); +} + + +/* InfGetLineText */ + + +LONG +InfHostGetFieldCount(PINFCONTEXT Context) +{ + return InfpGetFieldCount(Context); +} + + +int +InfHostGetBinaryField(PINFCONTEXT Context, + ULONG FieldIndex, + UCHAR *ReturnBuffer, + ULONG ReturnBufferSize, + ULONG *RequiredSize) +{ + INFSTATUS Status; + + Status = InfpGetBinaryField(Context, FieldIndex, ReturnBuffer, + ReturnBufferSize, RequiredSize); + if (INF_SUCCESS(Status)) + { + return 0; + } + else + { + errno = Status; + return -1; + } +} + + +int +InfHostGetIntField(PINFCONTEXT Context, + ULONG FieldIndex, + ULONG *IntegerValue) +{ + INFSTATUS Status; + + Status = InfpGetIntField(Context, FieldIndex, (PLONG)IntegerValue); + if (INF_SUCCESS(Status)) + { + return 0; + } + else + { + errno = Status; + return -1; + } +} + + +int +InfHostGetMultiSzField(PINFCONTEXT Context, + ULONG FieldIndex, + WCHAR *ReturnBuffer, + ULONG ReturnBufferSize, + ULONG *RequiredSize) +{ + INFSTATUS Status; + + Status = InfpGetMultiSzField(Context, FieldIndex, ReturnBuffer, + ReturnBufferSize, RequiredSize); + if (INF_SUCCESS(Status)) + { + return 0; + } + else + { + errno = Status; + return -1; + } +} + + +int +InfHostGetStringField(PINFCONTEXT Context, + ULONG FieldIndex, + WCHAR *ReturnBuffer, + ULONG ReturnBufferSize, + ULONG *RequiredSize) +{ + INFSTATUS Status; + + Status = InfpGetStringField(Context, FieldIndex, ReturnBuffer, + ReturnBufferSize, RequiredSize); + if (INF_SUCCESS(Status)) + { + return 0; + } + else + { + errno = Status; + return -1; + } +} + + +int +InfHostGetData(PINFCONTEXT Context, + WCHAR **Key, + WCHAR **Data) +{ + INFSTATUS Status; + + Status = InfpGetData(Context, Key, Data); + if (INF_SUCCESS(Status)) + { + return 0; + } + else + { + errno = Status; + return -1; + } +} + + +int +InfHostGetDataField(PINFCONTEXT Context, + ULONG FieldIndex, + WCHAR **Data) +{ + INFSTATUS Status; + + Status = InfpGetDataField(Context, FieldIndex, Data); + if (INF_SUCCESS(Status)) + { + return 0; + } + else + { + errno = Status; + return -1; + } +} + +VOID +InfHostFreeContext(PINFCONTEXT Context) +{ + InfpFreeContext(Context); +} + +/* EOF */ diff --git a/reactos/lib/newinflib/infhostput.c b/reactos/lib/newinflib/infhostput.c new file mode 100644 index 00000000000..a5233e50545 --- /dev/null +++ b/reactos/lib/newinflib/infhostput.c @@ -0,0 +1,115 @@ +/* + * PROJECT: .inf file parser + * LICENSE: GPL - See COPYING in the top level directory + * COPYRIGHT: Copyright 2005 Ge van Geldorp + */ + +/* INCLUDES *****************************************************************/ + +#include "inflib.h" +#include "infhost.h" + +#define NDEBUG +#include + +int +InfHostWriteFile(HINF InfHandle, + const CHAR *FileName, + const CHAR *HeaderComment) +{ + WCHAR *Buffer; + ULONG BufferSize; + INFSTATUS Status; + FILE *File; + + Status = InfpBuildFileBuffer((PINFCACHE) InfHandle, &Buffer, &BufferSize); + if (! INF_SUCCESS(Status)) + { + errno = Status; + return -1; + } + + File = fopen(FileName, "wb"); + if (NULL == File) + { + FREE(Buffer); + DPRINT1("fopen() failed (errno %d)\n", errno); + return -1; + } + + DPRINT("fopen() successful\n"); + + if (NULL != HeaderComment && '\0' != *HeaderComment) + { +// fprintf(File, "; %s\r\n\r\n", HeaderComment); + } + + if (BufferSize != fwrite(Buffer, (size_t)1, (size_t)BufferSize, File)) + { + DPRINT1("fwrite() failed (errno %d)\n", errno); + fclose(File); + FREE(Buffer); + return -1; + } + + fclose(File); + + FREE(Buffer); + + return 0; +} + +int +InfHostFindOrAddSection(HINF InfHandle, + const WCHAR *Section, + PINFCONTEXT *Context) +{ + INFSTATUS Status; + + Status = InfpFindOrAddSection((PINFCACHE) InfHandle, Section, Context); + if (INF_SUCCESS(Status)) + { + return 0; + } + else + { + errno = Status; + return -1; + } +} + +int +InfHostAddLine(PINFCONTEXT Context, const WCHAR *Key) +{ + INFSTATUS Status; + + Status = InfpAddLineWithKey(Context, Key); + if (INF_SUCCESS(Status)) + { + return 0; + } + else + { + errno = Status; + return -1; + } +} + +int +InfHostAddField(PINFCONTEXT Context, const WCHAR *Data) +{ + INFSTATUS Status; + + Status = InfpAddField(Context, Data); + if (INF_SUCCESS(Status)) + { + return 0; + } + else + { + errno = Status; + return -1; + } +} + +/* EOF */ diff --git a/reactos/lib/newinflib/infhostrtl.c b/reactos/lib/newinflib/infhostrtl.c new file mode 100644 index 00000000000..c9a522149df --- /dev/null +++ b/reactos/lib/newinflib/infhostrtl.c @@ -0,0 +1,151 @@ +/* + * PROJECT: .inf file parser + * LICENSE: GPL - See COPYING in the top level directory + * PROGRAMMER: Royce Mitchell III + * Eric Kohl + * Ge van Geldorp + */ + +/* INCLUDES *****************************************************************/ + +#include "inflib.h" +#include "infhost.h" + +#define NDEBUG +#include + +NTSTATUS NTAPI +RtlMultiByteToUnicodeN( + IN PWCHAR UnicodeString, + IN ULONG UnicodeSize, + IN PULONG ResultSize, + IN PCSTR MbString, + IN ULONG MbSize) +{ + ULONG Size = 0; + ULONG i; + PUCHAR WideString; + + /* single-byte code page */ + if (MbSize > (UnicodeSize / sizeof(WCHAR))) + Size = UnicodeSize / sizeof(WCHAR); + else + Size = MbSize; + + if (ResultSize != NULL) + *ResultSize = Size * sizeof(WCHAR); + + WideString = (PUCHAR)UnicodeString; + for (i = 0; i <= Size; i++) + { + WideString[2 * i + 0] = (UCHAR)MbString[i]; + WideString[2 * i + 1] = 0; + } + + return STATUS_SUCCESS; +} + + +BOOLEAN +NTAPI +RtlIsTextUnicode( PVOID buf, INT len, INT *pf ) +{ + static const WCHAR std_control_chars[] = {'\r','\n','\t',' ',0x3000,0}; + static const WCHAR byterev_control_chars[] = {0x0d00,0x0a00,0x0900,0x2000,0}; + const WCHAR *s = buf; + int i; + unsigned int flags = MAXULONG, out_flags = 0; + + if (len < sizeof(WCHAR)) + { + /* FIXME: MSDN documents IS_TEXT_UNICODE_BUFFER_TOO_SMALL but there is no such thing... */ + if (pf) *pf = 0; + return FALSE; + } + if (pf) + flags = (unsigned int)*pf; + /* + * Apply various tests to the text string. According to the + * docs, each test "passed" sets the corresponding flag in + * the output flags. But some of the tests are mutually + * exclusive, so I don't see how you could pass all tests ... + */ + + /* Check for an odd length ... pass if even. */ + if (len & 1) out_flags |= IS_TEXT_UNICODE_ODD_LENGTH; + + if (((char *)buf)[len - 1] == 0) + len--; /* Windows seems to do something like that to avoid e.g. false IS_TEXT_UNICODE_NULL_BYTES */ + + len /= (INT)sizeof(WCHAR); + /* Windows only checks the first 256 characters */ + if (len > 256) len = 256; + + /* Check for the special byte order unicode marks. */ + if (*s == 0xFEFF) out_flags |= IS_TEXT_UNICODE_SIGNATURE; + if (*s == 0xFFFE) out_flags |= IS_TEXT_UNICODE_REVERSE_SIGNATURE; + + /* apply some statistical analysis */ + if (flags & IS_TEXT_UNICODE_STATISTICS) + { + int stats = 0; + /* FIXME: checks only for ASCII characters in the unicode stream */ + for (i = 0; i < len; i++) + { + if (s[i] <= 255) stats++; + } + if (stats > len / 2) + out_flags |= IS_TEXT_UNICODE_STATISTICS; + } + + /* Check for unicode NULL chars */ + if (flags & IS_TEXT_UNICODE_NULL_BYTES) + { + for (i = 0; i < len; i++) + { + if (!(s[i] & 0xff) || !(s[i] >> 8)) + { + out_flags |= IS_TEXT_UNICODE_NULL_BYTES; + break; + } + } + } + + if (flags & IS_TEXT_UNICODE_CONTROLS) + { + for (i = 0; i < len; i++) + { + if (wcschr(std_control_chars, s[i])) + { + out_flags |= IS_TEXT_UNICODE_CONTROLS; + break; + } + } + } + + if (flags & IS_TEXT_UNICODE_REVERSE_CONTROLS) + { + for (i = 0; i < len; i++) + { + if (wcschr(byterev_control_chars, s[i])) + { + out_flags |= IS_TEXT_UNICODE_REVERSE_CONTROLS; + break; + } + } + } + + if (pf) + { + out_flags &= (unsigned int)*pf; + *pf = (INT)out_flags; + } + /* check for flags that indicate it's definitely not valid Unicode */ + if (out_flags & (IS_TEXT_UNICODE_REVERSE_MASK | IS_TEXT_UNICODE_NOT_UNICODE_MASK)) return FALSE; + /* now check for invalid ASCII, and assume Unicode if so */ + if (out_flags & IS_TEXT_UNICODE_NOT_ASCII_MASK) return TRUE; + /* now check for Unicode flags */ + if (out_flags & IS_TEXT_UNICODE_UNICODE_MASK) return TRUE; + /* no flags set */ + return FALSE; +} diff --git a/reactos/lib/newinflib/inflib.h b/reactos/lib/newinflib/inflib.h new file mode 100644 index 00000000000..7dff17fa035 --- /dev/null +++ b/reactos/lib/newinflib/inflib.h @@ -0,0 +1,15 @@ +/* + * PROJECT: .inf file parser + * LICENSE: GPL - See COPYING in the top level directory + * COPYRIGHT: Copyright 2005 Ge van Geldorp + */ + +#include +#include +#include + +#include "builddep.h" +#include "infcommon.h" +#include "infpriv.h" + +/* EOF */ diff --git a/reactos/lib/newinflib/inflib.mak b/reactos/lib/newinflib/inflib.mak new file mode 100644 index 00000000000..a0edbe26b96 --- /dev/null +++ b/reactos/lib/newinflib/inflib.mak @@ -0,0 +1,76 @@ +INFLIB_BASE = $(LIB_BASE_)newinflib +INFLIB_BASE_ = $(INFLIB_BASE)$(SEP) +INFLIB_INT = $(INTERMEDIATE_)$(INFLIB_BASE)_host +INFLIB_INT_ = $(INTERMEDIATE_)$(INFLIB_BASE)_host$(SEP) +INFLIB_OUT = $(OUTPUT_)$(INFLIB_BASE)_host +INFLIB_OUT_ = $(OUTPUT_)$(INFLIB_BASE)_host$(SEP) + +$(INFLIB_INT): | $(LIB_INT) + $(ECHO_MKDIR) + ${mkdir} $@ + +ifneq ($(INTERMEDIATE),$(OUTPUT)) +$(INFLIB_OUT): | $(OUTPUT_)$(LIB_BASE) + $(ECHO_MKDIR) + ${mkdir} $@ +endif + +INFLIB_HOST_TARGET = \ + $(INFLIB_OUT)$(SEP)newinflib.a + +INFLIB_HOST_SOURCES = $(addprefix $(INFLIB_BASE_), \ + infcore.c \ + infget.c \ + infput.c \ + infhostgen.c \ + infhostget.c \ + infhostput.c \ + infhostrtl.c \ + ) + +INFLIB_HOST_OBJECTS = \ + $(subst $(INFLIB_BASE), $(INFLIB_INT), $(INFLIB_HOST_SOURCES:.c=.o)) + +INFLIB_HOST_CFLAGS = -O3 -Wall -Wpointer-arith -Wconversion \ + -Wstrict-prototypes -Wmissing-prototypes -DINFLIB_HOST \ + -Iinclude/reactos -Iinclude $(HOST_CFLAGS) + +$(INFLIB_HOST_TARGET): $(INFLIB_HOST_OBJECTS) | $(INFLIB_OUT) + $(ECHO_HOSTAR) + $(host_ar) -r $@ $(INFLIB_HOST_OBJECTS) + +$(INFLIB_INT_)infcore.o: $(INFLIB_BASE_)infcore.c | $(INFLIB_INT) + $(ECHO_HOSTCC) + ${host_gcc} $(INFLIB_HOST_CFLAGS) -c $< -o $@ + +$(INFLIB_INT_)infget.o: $(INFLIB_BASE_)infget.c | $(INFLIB_INT) + $(ECHO_HOSTCC) + ${host_gcc} $(INFLIB_HOST_CFLAGS) -c $< -o $@ + +$(INFLIB_INT_)infput.o: $(INFLIB_BASE_)infput.c | $(INFLIB_INT) + $(ECHO_HOSTCC) + ${host_gcc} $(INFLIB_HOST_CFLAGS) -c $< -o $@ + +$(INFLIB_INT_)infhostgen.o: $(INFLIB_BASE_)infhostgen.c | $(INFLIB_INT) + $(ECHO_HOSTCC) + ${host_gcc} $(INFLIB_HOST_CFLAGS) -c $< -o $@ + +$(INFLIB_INT_)infhostget.o: $(INFLIB_BASE_)infhostget.c | $(INFLIB_INT) + $(ECHO_HOSTCC) + ${host_gcc} $(INFLIB_HOST_CFLAGS) -c $< -o $@ + +$(INFLIB_INT_)infhostput.o: $(INFLIB_BASE_)infhostput.c | $(INFLIB_INT) + $(ECHO_HOSTCC) + ${host_gcc} $(INFLIB_HOST_CFLAGS) -c $< -o $@ + +$(INFLIB_INT_)infhostrtl.o: $(INFLIB_BASE_)infhostrtl.c | $(INFLIB_INT) + $(ECHO_HOSTCC) + ${host_gcc} $(INFLIB_HOST_CFLAGS) -c $< -o $@ + +.PHONY: newinflib_host +newinflib_host: $(INFLIB_HOST_TARGET) + +.PHONY: newinflib_host_clean +newinflib_host_clean: + -@$(rm) $(INFLIB_HOST_TARGET) $(INFLIB_HOST_OBJECTS) 2>$(NUL) +clean: newinflib_host_clean diff --git a/reactos/lib/newinflib/inflib.rbuild b/reactos/lib/newinflib/inflib.rbuild new file mode 100644 index 00000000000..fc7c2cdd7bb --- /dev/null +++ b/reactos/lib/newinflib/inflib.rbuild @@ -0,0 +1,31 @@ + + + + + . + infcore.c + infget.c + infput.c + infrosgen.c + infrosget.c + infrosput.c + + + . + + + -Wpointer-arith + -Wconversion + -Wstrict-prototypes + -Wmissing-prototypes + + + infcore.c + infget.c + infput.c + infhostgen.c + infhostget.c + infhostput.c + infhostrtl.c + + diff --git a/reactos/lib/newinflib/infpriv.h b/reactos/lib/newinflib/infpriv.h new file mode 100644 index 00000000000..0d2cea94dc4 --- /dev/null +++ b/reactos/lib/newinflib/infpriv.h @@ -0,0 +1,145 @@ +/* + * PROJECT: .inf file parser + * LICENSE: GPL - See COPYING in the top level directory + * PROGRAMMER: Royce Mitchell III + * Eric Kohl + * Ge van Geldorp + */ + +#pragma once + +#ifndef FIELD_OFFSET +#define FIELD_OFFSET(t,f) ((ptrdiff_t)&(((t*)0)->f)) +#endif + +#define INF_STATUS_INSUFFICIENT_RESOURCES ((INFSTATUS)0xC000009A) +#define INF_STATUS_BAD_SECTION_NAME_LINE ((INFSTATUS)0xC0700001) +#define INF_STATUS_SECTION_NAME_TOO_LONG ((INFSTATUS)0xC0700002) +#define INF_STATUS_WRONG_INF_STYLE ((INFSTATUS)0xC0700003) +#define INF_STATUS_NOT_ENOUGH_MEMORY ((INFSTATUS)0xC0700004) + +typedef struct _INFCACHEFIELD +{ + struct _INFCACHEFIELD *Next; + struct _INFCACHEFIELD *Prev; + + WCHAR Data[1]; +} INFCACHEFIELD, *PINFCACHEFIELD; + +typedef struct _INFCACHELINE +{ + struct _INFCACHELINE *Next; + struct _INFCACHELINE *Prev; + + LONG FieldCount; + + PWCHAR Key; + + PINFCACHEFIELD FirstField; + PINFCACHEFIELD LastField; + +} INFCACHELINE, *PINFCACHELINE; + +typedef struct _INFCACHESECTION +{ + struct _INFCACHESECTION *Next; + struct _INFCACHESECTION *Prev; + + PINFCACHELINE FirstLine; + PINFCACHELINE LastLine; + + LONG LineCount; + + WCHAR Name[1]; +} INFCACHESECTION, *PINFCACHESECTION; + +typedef struct _INFCACHE +{ + LCID LocaleId; + PINFCACHESECTION FirstSection; + PINFCACHESECTION LastSection; + + PINFCACHESECTION StringsSection; +} INFCACHE, *PINFCACHE; + +typedef struct _INFCONTEXT +{ + PINFCACHE Inf; + PINFCACHESECTION Section; + PINFCACHELINE Line; +} INFCONTEXT; + +typedef int INFSTATUS; + +/* FUNCTIONS ****************************************************************/ + +extern INFSTATUS InfpParseBuffer(PINFCACHE file, + const WCHAR *buffer, + const WCHAR *end, + PULONG error_line); +extern PINFCACHESECTION InfpFreeSection(PINFCACHESECTION Section); +extern PINFCACHESECTION InfpAddSection(PINFCACHE Cache, + PCWSTR Name); +extern PINFCACHELINE InfpAddLine(PINFCACHESECTION Section); +extern PVOID InfpAddKeyToLine(PINFCACHELINE Line, + PCWSTR Key); +extern PVOID InfpAddFieldToLine(PINFCACHELINE Line, + PCWSTR Data); +extern PINFCACHELINE InfpFindKeyLine(PINFCACHESECTION Section, + PCWSTR Key); +extern PINFCACHESECTION InfpFindSection(PINFCACHE Cache, + PCWSTR Section); + +extern INFSTATUS InfpBuildFileBuffer(PINFCACHE InfHandle, + PWCHAR *Buffer, + PULONG BufferSize); + +extern INFSTATUS InfpFindFirstLine(PINFCACHE InfHandle, + PCWSTR Section, + PCWSTR Key, + PINFCONTEXT *Context); +extern INFSTATUS InfpFindNextLine(PINFCONTEXT ContextIn, + PINFCONTEXT ContextOut); +extern INFSTATUS InfpFindFirstMatchLine(PINFCONTEXT ContextIn, + PCWSTR Key, + PINFCONTEXT ContextOut); +extern INFSTATUS InfpFindNextMatchLine(PINFCONTEXT ContextIn, + PCWSTR Key, + PINFCONTEXT ContextOut); +extern LONG InfpGetLineCount(HINF InfHandle, + PCWSTR Section); +extern LONG InfpGetFieldCount(PINFCONTEXT Context); +extern INFSTATUS InfpGetBinaryField(PINFCONTEXT Context, + ULONG FieldIndex, + PUCHAR ReturnBuffer, + ULONG ReturnBufferSize, + PULONG RequiredSize); +extern INFSTATUS InfpGetIntField(PINFCONTEXT Context, + ULONG FieldIndex, + PLONG IntegerValue); +extern INFSTATUS InfpGetMultiSzField(PINFCONTEXT Context, + ULONG FieldIndex, + PWSTR ReturnBuffer, + ULONG ReturnBufferSize, + PULONG RequiredSize); +extern INFSTATUS InfpGetStringField(PINFCONTEXT Context, + ULONG FieldIndex, + PWSTR ReturnBuffer, + ULONG ReturnBufferSize, + PULONG RequiredSize); +extern INFSTATUS InfpGetData(PINFCONTEXT Context, + PWCHAR *Key, + PWCHAR *Data); +extern INFSTATUS InfpGetDataField(PINFCONTEXT Context, + ULONG FieldIndex, + PWCHAR *Data); + +extern INFSTATUS InfpFindOrAddSection(PINFCACHE Cache, + PCWSTR Section, + PINFCONTEXT *Context); +extern INFSTATUS InfpAddLineWithKey(PINFCONTEXT Context, PCWSTR Key); +extern INFSTATUS InfpAddField(PINFCONTEXT Context, PCWSTR Data); + +extern VOID InfpFreeContext(PINFCONTEXT Context); + +/* EOF */ diff --git a/reactos/lib/newinflib/infput.c b/reactos/lib/newinflib/infput.c new file mode 100644 index 00000000000..2d60af0fb9f --- /dev/null +++ b/reactos/lib/newinflib/infput.c @@ -0,0 +1,264 @@ +/* + * PROJECT: .inf file parser + * LICENSE: GPL - See COPYING in the top level directory + * COPYRIGHT: Copyright 2005 Ge van Geldorp + */ + +/* INCLUDES *****************************************************************/ + +#include "inflib.h" + +#define NDEBUG +#include + +#define EOL L"\r\n" +#define SIZE_INC 1024 + +typedef struct _OUTPUTBUFFER +{ + PWCHAR Buffer; + PWCHAR Current; + ULONG TotalSize; + ULONG FreeSize; + INFSTATUS Status; +} OUTPUTBUFFER, *POUTPUTBUFFER; + +static void +Output(POUTPUTBUFFER OutBuf, PCWSTR Text) +{ + ULONG Length; + PWCHAR NewBuf; + ULONG NewSize; + + /* Skip mode? */ + if (! INF_SUCCESS(OutBuf->Status)) + { + return; + } + + /* Doesn't fit? */ + Length = (ULONG)wcslen(Text) * sizeof(WCHAR); + if (OutBuf->FreeSize < Length + 1 && INF_SUCCESS(OutBuf->Status)) + { + DPRINT("Out of free space. TotalSize %u FreeSize %u Length %u\n", + (UINT)OutBuf->TotalSize, (UINT)OutBuf->FreeSize, (UINT)Length); + /* Round up to next SIZE_INC */ + NewSize = OutBuf->TotalSize + + (((Length + 1) - OutBuf->FreeSize + (SIZE_INC - 1)) / + SIZE_INC) * SIZE_INC; + DPRINT("NewSize %u\n", (UINT)NewSize); + NewBuf = MALLOC(NewSize); + /* Abort if failed */ + if (NULL == NewBuf) + { + DPRINT1("MALLOC() failed\n"); + OutBuf->Status = INF_STATUS_NO_MEMORY; + return; + } + + /* Need to copy old contents? */ + if (NULL != OutBuf->Buffer) + { + DPRINT("Copying %u bytes from old content\n", + (UINT)(OutBuf->TotalSize - OutBuf->FreeSize)); + MEMCPY(NewBuf, OutBuf->Buffer, OutBuf->TotalSize - OutBuf->FreeSize); + OutBuf->Current = NewBuf + (OutBuf->Current - OutBuf->Buffer); + FREE(OutBuf->Buffer); + } + else + { + OutBuf->Current = NewBuf; + } + OutBuf->Buffer = NewBuf; + OutBuf->FreeSize += NewSize - OutBuf->TotalSize; + OutBuf->TotalSize = NewSize; + DPRINT("After reallocation TotalSize %u FreeSize %u\n", + (UINT)OutBuf->TotalSize, (UINT)OutBuf->FreeSize); + } + + /* We're guaranteed to have enough room now. Copy char by char because of + possible "conversion" from Unicode to Ansi */ + while (Length--) + { + *OutBuf->Current++ = *Text++; + OutBuf->FreeSize--; + } + *OutBuf->Current = '\0'; +} + +INFSTATUS +InfpBuildFileBuffer(PINFCACHE Cache, + PWCHAR *Buffer, + PULONG BufferSize) +{ + OUTPUTBUFFER OutBuf; + PINFCACHESECTION CacheSection; + PINFCACHELINE CacheLine; + PINFCACHEFIELD CacheField; + PWCHAR p; + BOOLEAN NeedQuotes; + + OutBuf.Buffer = NULL; + OutBuf.Current = NULL; + OutBuf.FreeSize = 0; + OutBuf.TotalSize = 0; + OutBuf.Status = INF_STATUS_SUCCESS; + + /* Iterate through list of sections */ + CacheSection = Cache->FirstSection; + while (CacheSection != NULL) + { + DPRINT("Processing section %S\n", CacheSection->Name); + if (CacheSection != Cache->FirstSection) + { + Output(&OutBuf, EOL); + } + Output(&OutBuf, L"["); + Output(&OutBuf, CacheSection->Name); + Output(&OutBuf, L"]"); + Output(&OutBuf, EOL); + + /* Iterate through list of lines */ + CacheLine = CacheSection->FirstLine; + while (CacheLine != NULL) + { + if (NULL != CacheLine->Key) + { + DPRINT("Line with key %S\n", CacheLine->Key); + Output(&OutBuf, CacheLine->Key); + Output(&OutBuf, L" = "); + } + else + { + DPRINT("Line without key\n"); + } + + /* Iterate through list of lines */ + CacheField = CacheLine->FirstField; + while (CacheField != NULL) + { + if (CacheField != CacheLine->FirstField) + { + Output(&OutBuf, L","); + } + p = CacheField->Data; + NeedQuotes = FALSE; + while (L'\0' != *p && ! NeedQuotes) + { + NeedQuotes = (BOOLEAN)(L',' == *p || L';' == *p || + L'\\' == *p); + p++; + } + if (NeedQuotes) + { + Output(&OutBuf, L"\""); + Output(&OutBuf, CacheField->Data); + Output(&OutBuf, L"\""); + } + else + { + Output(&OutBuf, CacheField->Data); + } + + /* Get the next field */ + CacheField = CacheField->Next; + } + + Output(&OutBuf, EOL); + /* Get the next line */ + CacheLine = CacheLine->Next; + } + + /* Get the next section */ + CacheSection = CacheSection->Next; + } + + if (INF_SUCCESS(OutBuf.Status)) + { + *Buffer = OutBuf.Buffer; + *BufferSize = OutBuf.TotalSize - OutBuf.FreeSize; + } + else if (NULL != OutBuf.Buffer) + { + FREE(OutBuf.Buffer); + } + + return INF_STATUS_SUCCESS; +} + +INFSTATUS +InfpFindOrAddSection(PINFCACHE Cache, + PCWSTR Section, + PINFCONTEXT *Context) +{ + DPRINT("InfpFindOrAddSection section %S\n", Section); + + *Context = MALLOC(sizeof(INFCONTEXT)); + if (NULL == *Context) + { + DPRINT1("MALLOC() failed\n"); + return INF_STATUS_NO_MEMORY; + } + + (*Context)->Inf = Cache; + (*Context)->Section = InfpFindSection(Cache, Section); + (*Context)->Line = NULL; + if (NULL == (*Context)->Section) + { + DPRINT("Section not found, creating it\n"); + (*Context)->Section = InfpAddSection(Cache, Section); + if (NULL == (*Context)->Section) + { + DPRINT("Failed to create section\n"); + FREE(*Context); + return INF_STATUS_NO_MEMORY; + } + } + + return INF_STATUS_SUCCESS; +} + +INFSTATUS +InfpAddLineWithKey(PINFCONTEXT Context, PCWSTR Key) +{ + if (NULL == Context) + { + DPRINT1("Invalid parameter\n"); + return INF_STATUS_INVALID_PARAMETER; + } + + Context->Line = InfpAddLine(Context->Section); + if (NULL == Context->Line) + { + DPRINT("Failed to create line\n"); + return INF_STATUS_NO_MEMORY; + } + + if (NULL != Key && NULL == InfpAddKeyToLine(Context->Line, Key)) + { + DPRINT("Failed to add key\n"); + return INF_STATUS_NO_MEMORY; + } + + return INF_STATUS_SUCCESS; +} + +INFSTATUS +InfpAddField(PINFCONTEXT Context, PCWSTR Data) +{ + if (NULL == Context || NULL == Context->Line) + { + DPRINT1("Invalid parameter\n"); + return INF_STATUS_INVALID_PARAMETER; + } + + if (NULL == InfpAddFieldToLine(Context->Line, Data)) + { + DPRINT("Failed to add field\n"); + return INF_STATUS_NO_MEMORY; + } + + return INF_STATUS_SUCCESS; +} + +/* EOF */ diff --git a/reactos/lib/newinflib/infros.h b/reactos/lib/newinflib/infros.h new file mode 100644 index 00000000000..c467af9f3fb --- /dev/null +++ b/reactos/lib/newinflib/infros.h @@ -0,0 +1,81 @@ +/* + * PROJECT: .inf file parser + * LICENSE: GPL - See COPYING in the top level directory + * PROGRAMMER: Royce Mitchell III + * Eric Kohl + * Ge van Geldorp + */ + +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#include + +extern VOID InfSetHeap(PVOID Heap); +extern NTSTATUS InfOpenBufferedFile(PHINF InfHandle, + PVOID Buffer, + ULONG BufferSize, + LCID LocaleId, + PULONG ErrorLine); +extern NTSTATUS InfOpenFile(PHINF InfHandle, + PUNICODE_STRING FileName, + LCID LocaleId, + PULONG ErrorLine); +extern NTSTATUS InfWriteFile(HINF InfHandle, + PUNICODE_STRING FileName, + PUNICODE_STRING HeaderComment); +extern VOID InfCloseFile(HINF InfHandle); +extern BOOLEAN InfFindFirstLine(HINF InfHandle, + PCWSTR Section, + PCWSTR Key, + PINFCONTEXT *Context); +extern BOOLEAN InfFindNextLine(PINFCONTEXT ContextIn, + PINFCONTEXT ContextOut); +extern BOOLEAN InfFindFirstMatchLine(PINFCONTEXT ContextIn, + PCWSTR Key, + PINFCONTEXT ContextOut); +extern BOOLEAN InfFindNextMatchLine(PINFCONTEXT ContextIn, + PCWSTR Key, + PINFCONTEXT ContextOut); +extern LONG InfGetLineCount(HINF InfHandle, + PCWSTR Section); +extern LONG InfGetFieldCount(PINFCONTEXT Context); +extern BOOLEAN InfGetBinaryField(PINFCONTEXT Context, + ULONG FieldIndex, + PUCHAR ReturnBuffer, + ULONG ReturnBufferSize, + PULONG RequiredSize); +extern BOOLEAN InfGetIntField(PINFCONTEXT Context, + ULONG FieldIndex, + PLONG IntegerValue); +extern BOOLEAN InfGetMultiSzField(PINFCONTEXT Context, + ULONG FieldIndex, + PWSTR ReturnBuffer, + ULONG ReturnBufferSize, + PULONG RequiredSize); +extern BOOLEAN InfGetStringField(PINFCONTEXT Context, + ULONG FieldIndex, + PWSTR ReturnBuffer, + ULONG ReturnBufferSize, + PULONG RequiredSize); +extern BOOLEAN InfGetData(PINFCONTEXT Context, + PWCHAR *Key, + PWCHAR *Data); +extern BOOLEAN InfGetDataField(PINFCONTEXT Context, + ULONG FieldIndex, + PWCHAR *Data); +extern BOOLEAN InfFindOrAddSection(HINF InfHandle, + PCWSTR Section, + PINFCONTEXT *Context); +extern BOOLEAN InfAddLine(PINFCONTEXT Context, PCWSTR Key); +extern BOOLEAN InfAddField(PINFCONTEXT Context, PCWSTR Data); +extern VOID InfFreeContext(PINFCONTEXT Context); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +/* EOF */ diff --git a/reactos/lib/newinflib/infrosgen.c b/reactos/lib/newinflib/infrosgen.c new file mode 100644 index 00000000000..8ea53ae58d2 --- /dev/null +++ b/reactos/lib/newinflib/infrosgen.c @@ -0,0 +1,370 @@ +/* + * PROJECT: .inf file parser + * LICENSE: GPL - See COPYING in the top level directory + * PROGRAMMER: Royce Mitchell III + * Eric Kohl + * Ge van Geldorp + */ + +/* INCLUDES *****************************************************************/ + +#include "inflib.h" +#include "infros.h" + +#define NDEBUG +#include + +/* PRIVATE FUNCTIONS ********************************************************/ + +static int InfpHeapRefCount; + +static VOID +CheckHeap() +{ + if (NULL == InfpHeap) + { + InfpHeap = RtlCreateHeap(HEAP_GROWABLE, NULL, 0, 0, NULL, NULL); + } + if (0 <= InfpHeapRefCount) + { + InfpHeapRefCount++; + } +} + + +/* PUBLIC FUNCTIONS *********************************************************/ + +PVOID InfpHeap; + +VOID +InfSetHeap(PVOID Heap) +{ + if (NULL == InfpHeap) + { + InfpHeap = Heap; + InfpHeapRefCount = -1; + } +} + + +NTSTATUS +InfOpenBufferedFile(PHINF InfHandle, + PVOID Buffer, + ULONG BufferSize, + LCID LocaleId, + PULONG ErrorLine) +{ + INFSTATUS Status; + PINFCACHE Cache; + PCHAR FileBuffer; + ULONG FileBufferSize; + + CheckHeap(); + + *InfHandle = NULL; + *ErrorLine = (ULONG)-1; + + /* Allocate file buffer */ + FileBufferSize = BufferSize + 2; + FileBuffer = MALLOC(FileBufferSize); + if (FileBuffer == NULL) + { + DPRINT1("MALLOC() failed\n"); + return(INF_STATUS_INSUFFICIENT_RESOURCES); + } + + MEMCPY(FileBuffer, Buffer, BufferSize); + + /* Append string terminator */ + FileBuffer[BufferSize] = 0; + FileBuffer[BufferSize + 1] = 0; + + /* Allocate infcache header */ + Cache = (PINFCACHE)MALLOC(sizeof(INFCACHE)); + if (Cache == NULL) + { + DPRINT("MALLOC() failed\n"); + FREE(FileBuffer); + return(INF_STATUS_INSUFFICIENT_RESOURCES); + } + + /* Initialize inicache header */ + ZEROMEMORY(Cache, + sizeof(INFCACHE)); + + Cache->LocaleId = LocaleId; + + if (!RtlIsTextUnicode(FileBuffer, FileBufferSize, NULL)) + { +// static const BYTE utf8_bom[3] = { 0xef, 0xbb, 0xbf }; + WCHAR *new_buff; +// UINT codepage = CP_ACP; + UINT offset = 0; + +// if (BufferSize > sizeof(utf8_bom) && !memcmp(FileBuffer, utf8_bom, sizeof(utf8_bom) )) +// { +// codepage = CP_UTF8; +// offset = sizeof(utf8_bom); +// } + + new_buff = MALLOC(FileBufferSize * sizeof(WCHAR)); + if (new_buff != NULL) + { +// DWORD len = MultiByteToWideChar( codepage, 0, (char *)FileBuffer + offset, +// FileBufferSize - offset, new_buff, FileBufferSize); + + ULONG len; + Status = RtlMultiByteToUnicodeN(new_buff, + FileBufferSize * sizeof(WCHAR), + &len, + (char *)FileBuffer + offset, + FileBufferSize - offset); + + Status = InfpParseBuffer(Cache, + new_buff, + new_buff + len, + ErrorLine); + FREE(new_buff); + } + else + Status = INF_STATUS_INSUFFICIENT_RESOURCES; + } + else + { + WCHAR *new_buff = (WCHAR *)FileBuffer; + /* UCS-16 files should start with the Unicode BOM; we should skip it */ + if (*new_buff == 0xfeff) + { + new_buff++; + FileBufferSize -= sizeof(WCHAR); + } + Status = InfpParseBuffer(Cache, + new_buff, + (WCHAR*)((char*)new_buff + FileBufferSize), + ErrorLine); + } + + if (!INF_SUCCESS(Status)) + { + FREE(Cache); + Cache = NULL; + } + + /* Free file buffer */ + FREE(FileBuffer); + + *InfHandle = (HINF)Cache; + + return(Status); +} + + +NTSTATUS +InfOpenFile(PHINF InfHandle, + PUNICODE_STRING FileName, + LCID LocaleId, + PULONG ErrorLine) +{ + OBJECT_ATTRIBUTES ObjectAttributes; + FILE_STANDARD_INFORMATION FileInfo; + IO_STATUS_BLOCK IoStatusBlock; + HANDLE FileHandle; + NTSTATUS Status; + PCHAR FileBuffer; + ULONG FileLength; + ULONG FileBufferLength; + LARGE_INTEGER FileOffset; + PINFCACHE Cache; + + CheckHeap(); + + *InfHandle = NULL; + *ErrorLine = (ULONG)-1; + + /* Open the inf file */ + InitializeObjectAttributes(&ObjectAttributes, + FileName, + 0, + NULL, + NULL); + + Status = NtOpenFile(&FileHandle, + GENERIC_READ | SYNCHRONIZE, + &ObjectAttributes, + &IoStatusBlock, + FILE_SHARE_READ, + FILE_SYNCHRONOUS_IO_NONALERT | FILE_NON_DIRECTORY_FILE); + if (!INF_SUCCESS(Status)) + { + DPRINT("NtOpenFile() failed (Status %lx)\n", Status); + return(Status); + } + + DPRINT("NtOpenFile() successful\n"); + + /* Query file size */ + Status = NtQueryInformationFile(FileHandle, + &IoStatusBlock, + &FileInfo, + sizeof(FILE_STANDARD_INFORMATION), + FileStandardInformation); + if (!INF_SUCCESS(Status)) + { + DPRINT("NtQueryInformationFile() failed (Status %lx)\n", Status); + NtClose(FileHandle); + return(Status); + } + + FileLength = FileInfo.EndOfFile.u.LowPart; + + DPRINT("File size: %lu\n", FileLength); + + /* Allocate file buffer */ + FileBufferLength = FileLength + 2; + FileBuffer = MALLOC(FileBufferLength); + if (FileBuffer == NULL) + { + DPRINT1("MALLOC() failed\n"); + NtClose(FileHandle); + return(INF_STATUS_INSUFFICIENT_RESOURCES); + } + + /* Read file */ + FileOffset.QuadPart = 0ULL; + Status = NtReadFile(FileHandle, + NULL, + NULL, + NULL, + &IoStatusBlock, + FileBuffer, + FileLength, + &FileOffset, + NULL); + + /* Append string terminator */ + FileBuffer[FileLength] = 0; + FileBuffer[FileLength + 1] = 0; + + NtClose(FileHandle); + + if (!INF_SUCCESS(Status)) + { + DPRINT("NtReadFile() failed (Status %lx)\n", Status); + FREE(FileBuffer); + return(Status); + } + + /* Allocate infcache header */ + Cache = (PINFCACHE)MALLOC(sizeof(INFCACHE)); + if (Cache == NULL) + { + DPRINT("MALLOC() failed\n"); + FREE(FileBuffer); + return(INF_STATUS_INSUFFICIENT_RESOURCES); + } + + /* Initialize inicache header */ + ZEROMEMORY(Cache, + sizeof(INFCACHE)); + + Cache->LocaleId = LocaleId; + + /* Parse the inf buffer */ + if (!RtlIsTextUnicode(FileBuffer, FileBufferLength, NULL)) + { +// static const BYTE utf8_bom[3] = { 0xef, 0xbb, 0xbf }; + WCHAR *new_buff; +// UINT codepage = CP_ACP; + UINT offset = 0; + +// if (FileLength > sizeof(utf8_bom) && !memcmp(FileBuffer, utf8_bom, sizeof(utf8_bom) )) +// { +// codepage = CP_UTF8; +// offset = sizeof(utf8_bom); +// } + + new_buff = MALLOC(FileBufferLength * sizeof(WCHAR)); + if (new_buff != NULL) + { +// DWORD len = MultiByteToWideChar( codepage, 0, (char *)FileBuffer + offset, +// FileLength - offset, new_buff, FileLength); + + ULONG len; + Status = RtlMultiByteToUnicodeN(new_buff, + FileBufferLength * sizeof(WCHAR), + &len, + (char *)FileBuffer + offset, + FileBufferLength - offset); + + Status = InfpParseBuffer(Cache, + new_buff, + new_buff + len, + ErrorLine); + FREE(new_buff); + } + else + Status = INF_STATUS_INSUFFICIENT_RESOURCES; + } + else + { + WCHAR *new_buff = (WCHAR *)FileBuffer; + /* UCS-16 files should start with the Unicode BOM; we should skip it */ + if (*new_buff == 0xfeff) + { + new_buff++; + FileBufferLength -= sizeof(WCHAR); + } + Status = InfpParseBuffer(Cache, + new_buff, + (WCHAR*)((char*)new_buff + FileBufferLength), + ErrorLine); + } + + if (!INF_SUCCESS(Status)) + { + FREE(Cache); + Cache = NULL; + } + + /* Free file buffer */ + FREE(FileBuffer); + + *InfHandle = (HINF)Cache; + + return(Status); +} + + +VOID +InfCloseFile(HINF InfHandle) +{ + PINFCACHE Cache; + + Cache = (PINFCACHE)InfHandle; + + if (Cache == NULL) + { + return; + } + + while (Cache->FirstSection != NULL) + { + Cache->FirstSection = InfpFreeSection(Cache->FirstSection); + } + Cache->LastSection = NULL; + + FREE(Cache); + + if (0 < InfpHeapRefCount) + { + InfpHeapRefCount--; + if (0 == InfpHeapRefCount) + { + RtlDestroyHeap(InfpHeap); + InfpHeap = NULL; + } + } +} + + +/* EOF */ diff --git a/reactos/lib/newinflib/infrosget.c b/reactos/lib/newinflib/infrosget.c new file mode 100644 index 00000000000..9f3e7b06abf --- /dev/null +++ b/reactos/lib/newinflib/infrosget.c @@ -0,0 +1,140 @@ +/* + * PROJECT: .inf file parser + * LICENSE: GPL - See COPYING in the top level directory + * PROGRAMMER: Royce Mitchell III + * Eric Kohl + * Ge van Geldorp + */ + +/* INCLUDES *****************************************************************/ + +#include "inflib.h" +#include "infros.h" + +#define NDEBUG +#include + + +BOOLEAN +InfFindFirstLine(HINF InfHandle, + PCWSTR Section, + PCWSTR Key, + PINFCONTEXT *Context) +{ + return INF_SUCCESS(InfpFindFirstLine(InfHandle, Section, Key, Context)); +} + + +BOOLEAN +InfFindNextLine(PINFCONTEXT ContextIn, + PINFCONTEXT ContextOut) +{ + return INF_SUCCESS(InfpFindNextLine(ContextIn, ContextOut)); +} + + +BOOLEAN +InfFindFirstMatchLine(PINFCONTEXT ContextIn, + PCWSTR Key, + PINFCONTEXT ContextOut) +{ + return INF_SUCCESS(InfpFindFirstMatchLine(ContextIn, Key, ContextOut)); +} + + +BOOLEAN +InfFindNextMatchLine(PINFCONTEXT ContextIn, + PCWSTR Key, + PINFCONTEXT ContextOut) +{ + return INF_SUCCESS(InfpFindNextMatchLine(ContextIn, Key, ContextOut)); +} + + +LONG +InfGetLineCount(HINF InfHandle, + PCWSTR Section) +{ + return InfpGetLineCount(InfHandle, Section); +} + + +/* InfGetLineText */ + + +LONG +InfGetFieldCount(PINFCONTEXT Context) +{ + return InfpGetFieldCount(Context); +} + + +BOOLEAN +InfGetBinaryField(PINFCONTEXT Context, + ULONG FieldIndex, + PUCHAR ReturnBuffer, + ULONG ReturnBufferSize, + PULONG RequiredSize) +{ + return INF_SUCCESS(InfpGetBinaryField(Context, FieldIndex, ReturnBuffer, + ReturnBufferSize, RequiredSize)); +} + + +BOOLEAN +InfGetIntField(PINFCONTEXT Context, + ULONG FieldIndex, + PLONG IntegerValue) +{ + return INF_SUCCESS(InfpGetIntField(Context, FieldIndex, IntegerValue)); +} + + +BOOLEAN +InfGetMultiSzField(PINFCONTEXT Context, + ULONG FieldIndex, + PWSTR ReturnBuffer, + ULONG ReturnBufferSize, + PULONG RequiredSize) +{ + return INF_SUCCESS(InfpGetMultiSzField(Context, FieldIndex, ReturnBuffer, + ReturnBufferSize, RequiredSize)); +} + + +BOOLEAN +InfGetStringField(PINFCONTEXT Context, + ULONG FieldIndex, + PWSTR ReturnBuffer, + ULONG ReturnBufferSize, + PULONG RequiredSize) +{ + return INF_SUCCESS(InfpGetStringField(Context, FieldIndex, ReturnBuffer, + ReturnBufferSize, RequiredSize)); +} + + +BOOLEAN +InfGetData(PINFCONTEXT Context, + PWCHAR *Key, + PWCHAR *Data) +{ + return INF_SUCCESS(InfpGetData(Context, Key, Data)); +} + + +BOOLEAN +InfGetDataField (PINFCONTEXT Context, + ULONG FieldIndex, + PWCHAR *Data) +{ + return INF_SUCCESS(InfpGetDataField(Context, FieldIndex, Data)); +} + +VOID +InfFreeContext(PINFCONTEXT Context) +{ + InfpFreeContext(Context); +} + +/* EOF */ diff --git a/reactos/lib/newinflib/infrosput.c b/reactos/lib/newinflib/infrosput.c new file mode 100644 index 00000000000..4c6ca5a3bca --- /dev/null +++ b/reactos/lib/newinflib/infrosput.c @@ -0,0 +1,132 @@ +/* + * PROJECT: .inf file parser + * LICENSE: GPL - See COPYING in the top level directory + * COPYRIGHT: Copyright 2005 Ge van Geldorp + */ + +/* INCLUDES *****************************************************************/ + +#include "inflib.h" +#include "infros.h" + +#define NDEBUG +#include + +NTSTATUS +InfWriteFile(HINF InfHandle, + PUNICODE_STRING FileName, + PUNICODE_STRING HeaderComment) +{ + OBJECT_ATTRIBUTES ObjectAttributes; + IO_STATUS_BLOCK IoStatusBlock; + HANDLE FileHandle; + NTSTATUS Status; + INFSTATUS InfStatus; + PWCHAR Buffer; + ULONG BufferSize; + PWCHAR HeaderBuffer; + ULONG HeaderBufferSize; + UINT Index; + + InfStatus = InfpBuildFileBuffer((PINFCACHE) InfHandle, &Buffer, &BufferSize); + if (! INF_SUCCESS(InfStatus)) + { + DPRINT("Failed to create buffer (Status 0x%lx)\n", InfStatus); + return InfStatus; + } + + /* Open the inf file */ + InitializeObjectAttributes(&ObjectAttributes, + FileName, + 0, + NULL, + NULL); + + Status = NtOpenFile(&FileHandle, + GENERIC_WRITE | SYNCHRONIZE, + &ObjectAttributes, + &IoStatusBlock, + 0, + FILE_SYNCHRONOUS_IO_NONALERT | FILE_NON_DIRECTORY_FILE); + if (!INF_SUCCESS(Status)) + { + DPRINT1("NtOpenFile() failed (Status %lx)\n", Status); + FREE(Buffer); + return Status; + } + + DPRINT("NtOpenFile() successful\n"); + + if (NULL != HeaderComment && 0 != HeaderComment->Length) + { + /* This is just a comment header, don't abort on errors here */ + HeaderBufferSize = HeaderComment->Length + 7 * sizeof(WCHAR); + HeaderBuffer = MALLOC(HeaderBufferSize); + if (NULL != HeaderBuffer) + { + wcscpy(HeaderBuffer, L"; "); + for (Index = 0; Index < HeaderComment->Length / sizeof(WCHAR); Index++) + { + HeaderBuffer[2 + Index] = HeaderComment->Buffer[Index]; + } + wcscpy(HeaderBuffer + (2 + HeaderComment->Length / sizeof(WCHAR)), + L"\r\n\r\n"); + NtWriteFile(FileHandle, + NULL, + NULL, + NULL, + &IoStatusBlock, + HeaderBuffer, + HeaderBufferSize, + NULL, + NULL); + FREE(HeaderBuffer); + } + } + + /* Write main contents */ + Status = NtWriteFile(FileHandle, + NULL, + NULL, + NULL, + &IoStatusBlock, + Buffer, + BufferSize, + NULL, + NULL); + + NtClose(FileHandle); + FREE(Buffer); + + if (!INF_SUCCESS(Status)) + { + DPRINT1("NtWriteFile() failed (Status %lx)\n", Status); + FREE(Buffer); + return(Status); + } + + return STATUS_SUCCESS; +} + +BOOLEAN +InfFindOrAddSection(HINF InfHandle, + PCWSTR Section, + PINFCONTEXT *Context) +{ + return INF_SUCCESS(InfpFindOrAddSection((PINFCACHE) InfHandle, + Section, Context)); +} + +BOOLEAN +InfHostAddLine(PINFCONTEXT Context, PCWSTR Key) +{ + return INF_SUCCESS(InfpAddLineWithKey(Context, Key)); +} + +BOOLEAN +InfHostAddField(PINFCONTEXT Context, PCWSTR Data) +{ + return INF_SUCCESS(InfpAddField(Context, Data)); +} + +/* EOF */ From 6ebb4c8c3b2b36d0d1be2be4846a035c0e9aaad2 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sun, 25 Apr 2010 18:36:15 +0000 Subject: [PATCH 049/131] [HOSTS] - Add a simple hosts file - Not used yet svn path=/trunk/; revision=47017 --- reactos/boot/bootdata/packages/reactos.dff | 1 + reactos/media/drivers/etc/etc.rbuild | 2 ++ reactos/media/drivers/etc/hosts | 3 +++ 3 files changed, 6 insertions(+) create mode 100644 reactos/media/drivers/etc/hosts diff --git a/reactos/boot/bootdata/packages/reactos.dff b/reactos/boot/bootdata/packages/reactos.dff index a4d4de2a79b..d87de7d4bf7 100644 --- a/reactos/boot/bootdata/packages/reactos.dff +++ b/reactos/boot/bootdata/packages/reactos.dff @@ -634,6 +634,7 @@ media\nls\c_28603.nls 1 media\nls\c_28604.nls 1 media\nls\c_28605.nls 1 media\nls\c_28606.nls 1 +media\drivers\etc\hosts 5 media\drivers\etc\services 5 media\inf\audio.inf 6 media\inf\acpi.inf 6 diff --git a/reactos/media/drivers/etc/etc.rbuild b/reactos/media/drivers/etc/etc.rbuild index 5302cc6ccd0..1ed562ed2ba 100644 --- a/reactos/media/drivers/etc/etc.rbuild +++ b/reactos/media/drivers/etc/etc.rbuild @@ -1,6 +1,8 @@ + hosts + hosts services services diff --git a/reactos/media/drivers/etc/hosts b/reactos/media/drivers/etc/hosts new file mode 100644 index 00000000000..f8352ba6721 --- /dev/null +++ b/reactos/media/drivers/etc/hosts @@ -0,0 +1,3 @@ +# ReactOS hosts file + +127.0.0.1 localhost From f995cc4ea6ad3ce7efc8509e26501a39d43156be Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sun, 25 Apr 2010 19:20:59 +0000 Subject: [PATCH 050/131] [NEWINFLIB] - Use LANGID instead of LCID. - Move LANGID and language macros into the host typedefs header. - Remove dead code. svn path=/trunk/; revision=47018 --- reactos/include/host/typedefs.h | 6 ++++++ reactos/lib/newinflib/builddep.h | 6 ------ reactos/lib/newinflib/infget.c | 6 +++--- reactos/lib/newinflib/infhost.h | 4 ++-- reactos/lib/newinflib/infhostgen.c | 24 +++++------------------- reactos/lib/newinflib/infpriv.h | 2 +- reactos/lib/newinflib/infros.h | 4 ++-- reactos/lib/newinflib/infrosgen.c | 15 +++++---------- 8 files changed, 24 insertions(+), 43 deletions(-) diff --git a/reactos/include/host/typedefs.h b/reactos/include/host/typedefs.h index 42f30ed2294..07146c48220 100644 --- a/reactos/include/host/typedefs.h +++ b/reactos/include/host/typedefs.h @@ -65,6 +65,7 @@ typedef PVOID HANDLE, HKEY, *PHKEY; typedef INT NTSTATUS, POOL_TYPE; typedef LONG HRESULT; typedef ULONG_PTR SIZE_T, *PSIZE_T; +typedef WORD LANGID; #define MAXUSHORT USHRT_MAX @@ -232,6 +233,11 @@ typedef const UNICODE_STRING *PCUNICODE_STRING; #define RtlCopyMemory(Destination, Source, Length) memcpy(Destination, Source, Length) #define RtlMoveMemory(Destination, Source, Length) memmove(Destination, Source, Length) +#define MAKELANGID(p,s) ((((WORD)(s))<<10)|(WORD)(p)) +#define PRIMARYLANGID(l) ((WORD)(l)&0x3ff) +#define SUBLANGID(l) ((WORD)(l)>>10) +#define SUBLANG_NEUTRAL 0x00 + /* Prevent inclusion of some other headers */ #define __INTERNAL_DEBUG #define RTL_H diff --git a/reactos/lib/newinflib/builddep.h b/reactos/lib/newinflib/builddep.h index c768a2ca88b..6930a7d597d 100644 --- a/reactos/lib/newinflib/builddep.h +++ b/reactos/lib/newinflib/builddep.h @@ -30,7 +30,6 @@ typedef char TCHAR, *PTCHAR, *PTSTR; typedef const TCHAR *PCTSTR; -typedef WORD LCID; #define _T(x) x #define _tcsicmp strcasecmp @@ -60,11 +59,6 @@ typedef WORD LCID; #define IS_TEXT_UNICODE_NOT_UNICODE_MASK 3840 #define IS_TEXT_UNICODE_NOT_ASCII_MASK 61440 -#define SUBLANG_NEUTRAL 0 -#define PRIMARYLANGID(lgid) ((WORD)(lgid) & 0x3ff) -#define MAKELANGID(p, s) ((((WORD)(s)) << 10) | (WORD)(p)) - - #else /* ! defined(INFLIB_HOST) */ /* ReactOS definitions */ diff --git a/reactos/lib/newinflib/infget.c b/reactos/lib/newinflib/infget.c index 1cdbebf2ee5..4238f1ce0b5 100644 --- a/reactos/lib/newinflib/infget.c +++ b/reactos/lib/newinflib/infget.c @@ -46,11 +46,11 @@ InfpGetSubstitutionString(PINFCACHE Inf, DPRINT("Value name: %S\n", ValueName); - if (Inf->LocaleId != 0) + if (Inf->LanguageId != 0) { swprintf(StringLangId, L"Strings.%04hx", - Inf->LocaleId); + Inf->LanguageId); Status = InfpFindFirstLine(Inf, StringLangId, @@ -60,7 +60,7 @@ InfpGetSubstitutionString(PINFCACHE Inf, { swprintf(StringLangId, L"Strings.%04hx", - MAKELANGID(PRIMARYLANGID(Inf->LocaleId), SUBLANG_NEUTRAL)); + MAKELANGID(PRIMARYLANGID(Inf->LanguageId), SUBLANG_NEUTRAL)); Status = InfpFindFirstLine(Inf, StringLangId, diff --git a/reactos/lib/newinflib/infhost.h b/reactos/lib/newinflib/infhost.h index 6cdb37cbfa1..62403da83d8 100644 --- a/reactos/lib/newinflib/infhost.h +++ b/reactos/lib/newinflib/infhost.h @@ -23,11 +23,11 @@ extern BOOLEAN NTAPI RtlIsTextUnicode( PVOID buf, INT len, INT *pf ); extern int InfHostOpenBufferedFile(PHINF InfHandle, void *Buffer, ULONG BufferSize, - LCID LocaleId, + LANGID LanguageId, ULONG *ErrorLine); extern int InfHostOpenFile(PHINF InfHandle, const CHAR *FileName, - LCID LocaleId, + LANGID LanguageId, ULONG *ErrorLine); extern int InfHostWriteFile(HINF InfHandle, const CHAR *FileName, diff --git a/reactos/lib/newinflib/infhostgen.c b/reactos/lib/newinflib/infhostgen.c index e5ad1b96e9b..e6269ff6318 100644 --- a/reactos/lib/newinflib/infhostgen.c +++ b/reactos/lib/newinflib/infhostgen.c @@ -20,7 +20,7 @@ int InfHostOpenBufferedFile(PHINF InfHandle, void *Buffer, ULONG BufferSize, - LCID LocaleId, + LANGID LanguageId, ULONG *ErrorLine) { INFSTATUS Status; @@ -59,8 +59,9 @@ InfHostOpenBufferedFile(PHINF InfHandle, ZEROMEMORY(Cache, sizeof(INFCACHE)); - Cache->LocaleId = LocaleId; + Cache->LanguageId = LanguageId; + /* Parse the inf buffer */ if (!RtlIsTextUnicode(FileBuffer, (INT)FileBufferSize, NULL)) { // static const BYTE utf8_bom[3] = { 0xef, 0xbb, 0xbf }; @@ -77,9 +78,6 @@ InfHostOpenBufferedFile(PHINF InfHandle, new_buff = MALLOC(FileBufferSize * sizeof(WCHAR)); if (new_buff != NULL) { -// DWORD len = MultiByteToWideChar( codepage, 0, (char *)FileBuffer + offset, -// FileBufferSize - offset, new_buff, FileBufferSize); - ULONG len; Status = RtlMultiByteToUnicodeN(new_buff, FileBufferSize * sizeof(WCHAR), @@ -111,11 +109,6 @@ InfHostOpenBufferedFile(PHINF InfHandle, ErrorLine); } - /* Parse the inf buffer */ -// Status = InfpParseBuffer (Cache, -// FileBuffer, -// FileBuffer + BufferSize, -// ErrorLine); if (!INF_SUCCESS(Status)) { FREE(Cache); @@ -134,7 +127,7 @@ InfHostOpenBufferedFile(PHINF InfHandle, int InfHostOpenFile(PHINF InfHandle, const CHAR *FileName, - LCID LocaleId, + LANGID LanguageId, ULONG *ErrorLine) { FILE *File; @@ -219,7 +212,7 @@ InfHostOpenFile(PHINF InfHandle, ZEROMEMORY(Cache, sizeof(INFCACHE)); - Cache->LocaleId = LocaleId; + Cache->LanguageId = LanguageId; /* Parse the inf buffer */ if (!RtlIsTextUnicode(FileBuffer, (INT)FileBufferLength, NULL)) @@ -238,9 +231,6 @@ InfHostOpenFile(PHINF InfHandle, new_buff = MALLOC(FileBufferLength * sizeof(WCHAR)); if (new_buff != NULL) { -// DWORD len = MultiByteToWideChar( codepage, 0, (char *)FileBuffer + offset, -// FileLength - offset, new_buff, FileLength); - ULONG len; Status = RtlMultiByteToUnicodeN(new_buff, FileBufferLength * sizeof(WCHAR), @@ -273,10 +263,6 @@ InfHostOpenFile(PHINF InfHandle, ErrorLine); } -// Status = InfpParseBuffer (Cache, -// FileBuffer, -// FileBuffer + FileLength, -// ErrorLine); if (!INF_SUCCESS(Status)) { FREE(Cache); diff --git a/reactos/lib/newinflib/infpriv.h b/reactos/lib/newinflib/infpriv.h index 0d2cea94dc4..c7adededd5d 100644 --- a/reactos/lib/newinflib/infpriv.h +++ b/reactos/lib/newinflib/infpriv.h @@ -55,7 +55,7 @@ typedef struct _INFCACHESECTION typedef struct _INFCACHE { - LCID LocaleId; + LANGID LanguageId; PINFCACHESECTION FirstSection; PINFCACHESECTION LastSection; diff --git a/reactos/lib/newinflib/infros.h b/reactos/lib/newinflib/infros.h index c467af9f3fb..92dbc5133db 100644 --- a/reactos/lib/newinflib/infros.h +++ b/reactos/lib/newinflib/infros.h @@ -18,11 +18,11 @@ extern VOID InfSetHeap(PVOID Heap); extern NTSTATUS InfOpenBufferedFile(PHINF InfHandle, PVOID Buffer, ULONG BufferSize, - LCID LocaleId, + LANGID LanguageId, PULONG ErrorLine); extern NTSTATUS InfOpenFile(PHINF InfHandle, PUNICODE_STRING FileName, - LCID LocaleId, + LANGID LanguageId, PULONG ErrorLine); extern NTSTATUS InfWriteFile(HINF InfHandle, PUNICODE_STRING FileName, diff --git a/reactos/lib/newinflib/infrosgen.c b/reactos/lib/newinflib/infrosgen.c index 8ea53ae58d2..e994b28f030 100644 --- a/reactos/lib/newinflib/infrosgen.c +++ b/reactos/lib/newinflib/infrosgen.c @@ -51,7 +51,7 @@ NTSTATUS InfOpenBufferedFile(PHINF InfHandle, PVOID Buffer, ULONG BufferSize, - LCID LocaleId, + LANGID LanguageId, PULONG ErrorLine) { INFSTATUS Status; @@ -92,8 +92,9 @@ InfOpenBufferedFile(PHINF InfHandle, ZEROMEMORY(Cache, sizeof(INFCACHE)); - Cache->LocaleId = LocaleId; + Cache->LanguageId = LanguageId; + /* Parse the inf buffer */ if (!RtlIsTextUnicode(FileBuffer, FileBufferSize, NULL)) { // static const BYTE utf8_bom[3] = { 0xef, 0xbb, 0xbf }; @@ -110,9 +111,6 @@ InfOpenBufferedFile(PHINF InfHandle, new_buff = MALLOC(FileBufferSize * sizeof(WCHAR)); if (new_buff != NULL) { -// DWORD len = MultiByteToWideChar( codepage, 0, (char *)FileBuffer + offset, -// FileBufferSize - offset, new_buff, FileBufferSize); - ULONG len; Status = RtlMultiByteToUnicodeN(new_buff, FileBufferSize * sizeof(WCHAR), @@ -162,7 +160,7 @@ InfOpenBufferedFile(PHINF InfHandle, NTSTATUS InfOpenFile(PHINF InfHandle, PUNICODE_STRING FileName, - LCID LocaleId, + LANGID LanguageId, PULONG ErrorLine) { OBJECT_ATTRIBUTES ObjectAttributes; @@ -267,7 +265,7 @@ InfOpenFile(PHINF InfHandle, ZEROMEMORY(Cache, sizeof(INFCACHE)); - Cache->LocaleId = LocaleId; + Cache->LanguageId = LanguageId; /* Parse the inf buffer */ if (!RtlIsTextUnicode(FileBuffer, FileBufferLength, NULL)) @@ -286,9 +284,6 @@ InfOpenFile(PHINF InfHandle, new_buff = MALLOC(FileBufferLength * sizeof(WCHAR)); if (new_buff != NULL) { -// DWORD len = MultiByteToWideChar( codepage, 0, (char *)FileBuffer + offset, -// FileLength - offset, new_buff, FileLength); - ULONG len; Status = RtlMultiByteToUnicodeN(new_buff, FileBufferLength * sizeof(WCHAR), From 318eee824181a5f963822eb2659a8e617d92f7d3 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sun, 25 Apr 2010 19:54:57 +0000 Subject: [PATCH 051/131] [MKHIVE] - Use newinflib instead of inflib. - Add RegDeleteKeyW stub. - Convert registry generation code from ANSI APIs to UNICODE APIs. ATTENTION: This commit might break the build bot because it was not tested on a Linux system. svn path=/trunk/; revision=47019 --- reactos/tools/mkhive/mkhive.rbuild | 4 +- reactos/tools/mkhive/reginf.c | 106 ++++++++++++++--------------- reactos/tools/mkhive/registry.c | 35 +++++++--- 3 files changed, 82 insertions(+), 63 deletions(-) diff --git a/reactos/tools/mkhive/mkhive.rbuild b/reactos/tools/mkhive/mkhive.rbuild index c5d22dc1fbc..e4778b9d803 100644 --- a/reactos/tools/mkhive/mkhive.rbuild +++ b/reactos/tools/mkhive/mkhive.rbuild @@ -1,13 +1,13 @@ - . + . . . . -fshort-wchar - inflibhost + newinflibhost cmlibhost host_wcsfuncs binhive.c diff --git a/reactos/tools/mkhive/reginf.c b/reactos/tools/mkhive/reginf.c index dd8ac4596e0..e8a1a2e7da3 100644 --- a/reactos/tools/mkhive/reginf.c +++ b/reactos/tools/mkhive/reginf.c @@ -51,34 +51,34 @@ /* FUNCTIONS ****************************************************************/ static BOOL -GetRootKey (PCHAR Name) +GetRootKey (PWCHAR Name) { - if (!strcasecmp (Name, "HKCR")) + if (!wcsicmp (Name, L"HKCR")) { - strcpy (Name, "\\Registry\\Machine\\SOFTWARE\\Classes\\"); + wcscpy (Name, L"\\Registry\\Machine\\SOFTWARE\\Classes\\"); return TRUE; } - if (!strcasecmp (Name, "HKCU")) + if (!wcsicmp (Name, L"HKCU")) { - strcpy (Name, "\\Registry\\User\\.DEFAULT\\"); + wcscpy (Name, L"\\Registry\\User\\.DEFAULT\\"); return TRUE; } - if (!strcasecmp (Name, "HKLM")) + if (!wcsicmp (Name, L"HKLM")) { - strcpy (Name, "\\Registry\\Machine\\"); + wcscpy (Name, L"\\Registry\\Machine\\"); return TRUE; } - if (!strcasecmp (Name, "HKU")) + if (!wcsicmp (Name, L"HKU")) { - strcpy (Name, "\\Registry\\User\\"); + wcscpy (Name, L"\\Registry\\User\\"); return TRUE; } #if 0 - if (!strcasecmp (Name, "HKR")) + if (!wcsicmp (Name, L"HKR")) return FALSE; #endif @@ -94,19 +94,19 @@ GetRootKey (PCHAR Name) static VOID AppendMultiSzValue ( IN HKEY KeyHandle, - IN PCHAR ValueName, - IN PCHAR Strings, + IN PWCHAR ValueName, + IN PWCHAR Strings, IN SIZE_T StringSize) { SIZE_T Size; ULONG Type; size_t Total; - PCHAR Buffer; - PCHAR p; + PWCHAR Buffer; + PWCHAR p; size_t len; LONG Error; - Error = RegQueryValueExA ( + Error = RegQueryValueExW ( KeyHandle, ValueName, NULL, @@ -117,11 +117,11 @@ AppendMultiSzValue ( (Type != REG_MULTI_SZ)) return; - Buffer = malloc (Size + StringSize); + Buffer = malloc (Size + (StringSize * sizeof(WCHAR))); if (Buffer == NULL) return; - Error = RegQueryValueExA ( + Error = RegQueryValueExW ( KeyHandle, ValueName, NULL, @@ -135,25 +135,25 @@ AppendMultiSzValue ( Total = Size; while (*Strings != 0) { - len = strlen (Strings) + 1; + len = wcslen (Strings) + 1; - for (p = Buffer; *p != 0; p += strlen (p) + 1) - if (!strcasecmp (p, Strings)) + for (p = Buffer; *p != 0; p += wcslen (p) + 1) + if (!wcsicmp (p, Strings)) break; if (*p == 0) /* not found, need to append it */ { - memcpy (p, Strings, len); + memcpy (p, Strings, len * sizeof(WCHAR)); p[len] = 0; - Total += len; + Total += len * sizeof(WCHAR); } Strings += len; } if (Total != Size) { - DPRINT ("setting value %s to %s\n", ValueName, Buffer); - RegSetValueExA ( + DPRINT ("setting value %S to %S\n", ValueName, Buffer); + RegSetValueExW ( KeyHandle, ValueName, 0, @@ -175,11 +175,11 @@ done: static BOOL do_reg_operation( IN HKEY KeyHandle, - IN PCHAR ValueName, + IN PWCHAR ValueName, IN PINFCONTEXT Context, IN ULONG Flags) { - CHAR EmptyStr = (CHAR)0; + WCHAR EmptyStr = (WCHAR)0; ULONG Type; ULONG Size; LONG Error; @@ -188,11 +188,11 @@ do_reg_operation( { if (ValueName) { - RegDeleteValueA (KeyHandle, ValueName); + RegDeleteValueW (KeyHandle, ValueName); } else { - RegDeleteKeyA (KeyHandle, NULL); + RegDeleteKeyW (KeyHandle, NULL); } return TRUE; @@ -203,7 +203,7 @@ do_reg_operation( if (Flags & (FLG_ADDREG_NOCLOBBER | FLG_ADDREG_OVERWRITEONLY)) { - Error = RegQueryValueExA ( + Error = RegQueryValueExW ( KeyHandle, ValueName, NULL, @@ -253,7 +253,7 @@ do_reg_operation( if (!(Flags & FLG_ADDREG_BINVALUETYPE) || (Type == REG_DWORD && InfHostGetFieldCount (Context) == 5)) { - PCHAR Str = NULL; + WCHAR *Str = NULL; if (Type == REG_MULTI_SZ) { @@ -262,7 +262,7 @@ do_reg_operation( if (Size) { - Str = malloc (Size); + Str = malloc (Size * sizeof(WCHAR)); if (Str == NULL) return FALSE; @@ -292,7 +292,7 @@ do_reg_operation( if (Size) { - Str = malloc (Size); + Str = malloc (Size * sizeof(WCHAR)); if (Str == NULL) return FALSE; @@ -302,11 +302,11 @@ do_reg_operation( if (Type == REG_DWORD) { - ULONG dw = Str ? strtoul (Str, NULL, 0) : 0; + ULONG dw = Str ? wcstoul (Str, NULL, 0) : 0; - DPRINT("setting dword %s to %x\n", ValueName, dw); + DPRINT("setting dword %S to %x\n", ValueName, dw); - RegSetValueExA ( + RegSetValueExW ( KeyHandle, ValueName, 0, @@ -316,27 +316,27 @@ do_reg_operation( } else { - DPRINT("setting value %s to %s\n", ValueName, Str); + DPRINT("setting value %S to %S\n", ValueName, Str); if (Str) { - RegSetValueExA ( + RegSetValueExW ( KeyHandle, ValueName, 0, Type, (PVOID)Str, - (ULONG)Size); + (ULONG)Size * sizeof(WCHAR)); } else { - RegSetValueExA ( + RegSetValueExW ( KeyHandle, ValueName, 0, Type, (PVOID)&EmptyStr, - (ULONG)sizeof(CHAR)); + (ULONG)sizeof(WCHAR)); } } free (Str); @@ -358,7 +358,7 @@ do_reg_operation( InfHostGetBinaryField (Context, 5, Data, Size, NULL); } - RegSetValueExA ( + RegSetValueExW ( KeyHandle, ValueName, 0, @@ -378,10 +378,10 @@ do_reg_operation( * Called once for each AddReg and DelReg entry in a given section. */ static BOOL -registry_callback (HINF hInf, PCHAR Section, BOOL Delete) +registry_callback (HINF hInf, PWCHAR Section, BOOL Delete) { - CHAR Buffer[MAX_INF_STRING_LENGTH]; - PCHAR ValuePtr; + WCHAR Buffer[MAX_INF_STRING_LENGTH]; + PWCHAR ValuePtr; ULONG Flags; size_t Length; @@ -403,11 +403,11 @@ registry_callback (HINF hInf, PCHAR Section, BOOL Delete) continue; /* get key */ - Length = strlen (Buffer); + Length = wcslen (Buffer); if (InfHostGetStringField (Context, 2, Buffer + Length, MAX_INF_STRING_LENGTH - (ULONG)Length, NULL) != 0) *Buffer = 0; - DPRINT("KeyName: <%s>\n", Buffer); + DPRINT("KeyName: <%S>\n", Buffer); if (Delete) { @@ -424,17 +424,17 @@ registry_callback (HINF hInf, PCHAR Section, BOOL Delete) if (Delete || (Flags & FLG_ADDREG_OVERWRITEONLY)) { - if (RegOpenKeyA (NULL, Buffer, &KeyHandle) != ERROR_SUCCESS) + if (RegOpenKeyW (NULL, Buffer, &KeyHandle) != ERROR_SUCCESS) { - DPRINT("RegOpenKey(%s) failed\n", Buffer); + DPRINT("RegOpenKey(%S) failed\n", Buffer); continue; /* ignore if it doesn't exist */ } } else { - if (RegCreateKeyA (NULL, Buffer, &KeyHandle) != ERROR_SUCCESS) + if (RegCreateKeyW (NULL, Buffer, &KeyHandle) != ERROR_SUCCESS) { - DPRINT("RegCreateKey(%s) failed\n", Buffer); + DPRINT("RegCreateKey(%S) failed\n", Buffer); continue; } } @@ -469,18 +469,18 @@ ImportRegistryFile(PCHAR FileName) ULONG ErrorLine; /* Load inf file from install media. */ - if (InfHostOpenFile(&hInf, FileName, &ErrorLine) != 0) + if (InfHostOpenFile(&hInf, FileName, 0, &ErrorLine) != 0) { DPRINT1 ("InfHostOpenFile(%s) failed\n", FileName); return FALSE; } - if (!registry_callback (hInf, "DelReg", TRUE)) + if (!registry_callback (hInf, L"DelReg", TRUE)) { DPRINT1 ("registry_callback() for DelReg failed\n"); } - if (!registry_callback (hInf, "AddReg", FALSE)) + if (!registry_callback (hInf, L"AddReg", FALSE)) { DPRINT1 ("registry_callback() for AddReg failed\n"); } diff --git a/reactos/tools/mkhive/registry.c b/reactos/tools/mkhive/registry.c index 3bd2c9efe60..e182596e23b 100644 --- a/reactos/tools/mkhive/registry.c +++ b/reactos/tools/mkhive/registry.c @@ -25,9 +25,9 @@ /* * TODO: - * - Implement RegDeleteKey() + * - Implement RegDeleteKeyW() * - Implement RegEnumValue() - * - Implement RegQueryValueExA() + * - Implement RegQueryValueExW() */ #include @@ -246,15 +246,34 @@ RegCreateKeyA( } LONG WINAPI -RegDeleteKeyA(HKEY Key, - LPCSTR Name) +RegDeleteKeyW(IN HKEY hKey, + IN LPCWSTR lpSubKey) { - if (Name != NULL && strchr(Name, '\\') != NULL) - return(ERROR_INVALID_PARAMETER); + if (lpSubKey != NULL && wcschr(lpSubKey, L'\\') != NULL) + return(ERROR_INVALID_PARAMETER); - DPRINT1("FIXME!\n"); + DPRINT1("RegDeleteKeyW: FIXME!\n"); - return(ERROR_SUCCESS); + return(ERROR_SUCCESS); +} + +LONG WINAPI +RegDeleteKeyA(IN HKEY hKey, + IN LPCSTR lpSubKey) +{ + PWSTR lpSubKeyW; + LONG rc; + + if (lpSubKey != NULL && strchr(lpSubKey, '\\') != NULL) + return(ERROR_INVALID_PARAMETER); + + lpSubKeyW = MultiByteToWideChar(lpSubKey); + if (!lpSubKeyW) + return ERROR_OUTOFMEMORY; + + rc = RegDeleteKeyW(hKey, lpSubKeyW); + free(lpSubKeyW); + return rc; } LONG WINAPI From 98acf217f995a957ad319406780e5825fdcf20d9 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sun, 25 Apr 2010 20:01:59 +0000 Subject: [PATCH 052/131] [WS2_32] - Add support for reading the hosts file - Fix an off-by-one error which prevented reading the last value in the services file - Fixes bug 4410 and bug 4880 svn path=/trunk/; revision=47020 --- reactos/dll/win32/ws2_32/misc/ns.c | 203 ++++++++++++++++++++++++++++- 1 file changed, 201 insertions(+), 2 deletions(-) diff --git a/reactos/dll/win32/ws2_32/misc/ns.c b/reactos/dll/win32/ws2_32/misc/ns.c index bb89eadfb0d..fee4f032868 100644 --- a/reactos/dll/win32/ws2_32/misc/ns.c +++ b/reactos/dll/win32/ws2_32/misc/ns.c @@ -640,7 +640,199 @@ void free_servent(struct servent* s) HFREE(s); } +/* This function is far from perfect but it works enough */ +static +LPHOSTENT +FindEntryInHosts(IN CONST CHAR FAR* name) +{ + BOOL Found = FALSE; + HANDLE HostsFile; + CHAR HostsDBData[BUFSIZ] = { 0 }; + PCHAR SystemDirectory = HostsDBData; + PCHAR HostsLocation = "\\drivers\\etc\\hosts"; + PCHAR AddressStr, DnsName = NULL, AddrTerm, NameSt, NextLine, ThisLine, Comment; + UINT SystemDirSize = sizeof(HostsDBData) - 1, ValidData = 0; + DWORD ReadSize; + ULONG Address; + PWINSOCK_THREAD_BLOCK p = NtCurrentTeb()->WinSockData; + /* We assume that the parameters are valid */ + + if (!GetSystemDirectoryA(SystemDirectory, SystemDirSize)) + { + WSASetLastError(WSANO_RECOVERY); + WS_DbgPrint(MIN_TRACE, ("Could not get windows system directory.\n")); + return NULL; /* Can't get system directory */ + } + + strncat(SystemDirectory, + HostsLocation, + SystemDirSize ); + + HostsFile = CreateFileA(SystemDirectory, + GENERIC_READ, + FILE_SHARE_READ, + NULL, + OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, + NULL); + if (HostsFile == INVALID_HANDLE_VALUE) + { + WSASetLastError(WSANO_RECOVERY); + return NULL; + } + + while(!Found && + ReadFile(HostsFile, + HostsDBData + ValidData, + sizeof(HostsDBData) - ValidData, + &ReadSize, + NULL)) + { + ValidData += ReadSize; + ReadSize = 0; + NextLine = ThisLine = HostsDBData; + + /* Find the beginning of the next line */ + while(NextLine < HostsDBData + ValidData && + *NextLine != '\r' && *NextLine != '\n' ) + { + NextLine++; + } + + /* Zero and skip, so we can treat what we have as a string */ + if( NextLine > HostsDBData + ValidData ) + break; + + *NextLine = 0; NextLine++; + + Comment = strchr( ThisLine, '#' ); + if( Comment ) *Comment = 0; /* Terminate at comment start */ + + AddressStr = ThisLine; + /* Find the first space separating the IP address from the DNS name */ + AddrTerm = strchr(ThisLine, ' '); + if (AddrTerm) + { + /* Terminate the address string */ + *AddrTerm = 0; + + /* Find the last space before the DNS name */ + NameSt = strrchr(ThisLine, ' '); + + /* If there is only one space (the one we removed above), then just use the address terminator */ + if (!NameSt) + NameSt = AddrTerm; + + /* Move from the space to the first character of the DNS name */ + NameSt++; + + DnsName = NameSt; + + if (!strcmp(name, DnsName)) + { + Found = TRUE; + break; + } + } + + /* Get rid of everything we read so far */ + while( NextLine <= HostsDBData + ValidData && + isspace (*NextLine)) + { + NextLine++; + } + + if (HostsDBData + ValidData - NextLine <= 0) + break; + + WS_DbgPrint(MAX_TRACE,("About to move %d chars\n", + HostsDBData + ValidData - NextLine)); + + memmove(HostsDBData, + NextLine, + HostsDBData + ValidData - NextLine ); + ValidData -= NextLine - HostsDBData; + WS_DbgPrint(MAX_TRACE,("Valid bytes: %d\n", ValidData)); + } + + CloseHandle(HostsFile); + + if (!Found) + { + WS_DbgPrint(MAX_TRACE,("Not found\n")); + WSASetLastError(WSANO_DATA); + return NULL; + } + + if( !p->Hostent ) + { + p->Hostent = HeapAlloc(GlobalHeap, 0, sizeof(*p->Hostent)); + if( !p->Hostent ) + { + WSASetLastError( WSATRY_AGAIN ); + return NULL; + } + } + + p->Hostent->h_name = HeapAlloc(GlobalHeap, 0, strlen(DnsName)); + if( !p->Hostent->h_name ) + { + WSASetLastError( WSATRY_AGAIN ); + return NULL; + } + + RtlCopyMemory(p->Hostent->h_name, + DnsName, + strlen(DnsName)); + + p->Hostent->h_aliases = HeapAlloc(GlobalHeap, 0, sizeof(char *)); + if( !p->Hostent->h_aliases ) + { + WSASetLastError( WSATRY_AGAIN ); + return NULL; + } + + p->Hostent->h_aliases[0] = 0; + + if (strstr(AddressStr, ":")) + { + DbgPrint("AF_INET6 NOT SUPPORTED!\n"); + WSASetLastError(WSAEINVAL); + return NULL; + } + else + p->Hostent->h_addrtype = AF_INET; + + p->Hostent->h_addr_list = HeapAlloc(GlobalHeap, 0, sizeof(char *)); + if( !p->Hostent->h_addr_list ) + { + WSASetLastError( WSATRY_AGAIN ); + return NULL; + } + + Address = inet_addr(AddressStr); + if (Address == INADDR_NONE) + { + WSASetLastError(WSAEINVAL); + return NULL; + } + + p->Hostent->h_addr_list[0] = HeapAlloc(GlobalHeap, 0, sizeof(Address)); + if( !p->Hostent->h_addr_list[0] ) + { + WSASetLastError( WSATRY_AGAIN ); + return NULL; + } + + RtlCopyMemory(p->Hostent->h_addr_list[0], + &Address, + sizeof(Address)); + + p->Hostent->h_length = sizeof(Address); + + return p->Hostent; +} LPHOSTENT EXPORT @@ -661,6 +853,7 @@ gethostbyname(IN CONST CHAR FAR* name) /* include/WinDNS.h -- look up DNS_RECORD on MSDN */ PDNS_RECORD dp = 0; PWINSOCK_THREAD_BLOCK p; + LPHOSTENT Hostent; addr = GH_INVALID; @@ -726,6 +919,12 @@ gethostbyname(IN CONST CHAR FAR* name) case GH_RFC1123_DNS: /* DNS_TYPE_A: include/WinDNS.h */ /* DnsQuery -- lib/dnsapi/dnsapi/query.c */ + + /* Look for the DNS name in the hosts file */ + Hostent = FindEntryInHosts(name); + if (Hostent) + return Hostent; + dns_status = DnsQuery_A(name, DNS_TYPE_A, DNS_QUERY_STANDARD, @@ -993,7 +1192,7 @@ getservbyname(IN CONST CHAR FAR* name, } /* Zero and skip, so we can treat what we have as a string */ - if( NextLine >= ServiceDBData + ValidData ) + if( NextLine > ServiceDBData + ValidData ) break; *NextLine = 0; NextLine++; @@ -1174,7 +1373,7 @@ getservbyport(IN INT port, *NextLine != '\r' && *NextLine != '\n' ) NextLine++; /* Zero and skip, so we can treat what we have as a string */ - if( NextLine >= ServiceDBData + ValidData ) + if( NextLine > ServiceDBData + ValidData ) break; *NextLine = 0; NextLine++; From 3bb199b69278113a93fa4ea5589bb7cd601e8dfd Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Sun, 25 Apr 2010 20:26:37 +0000 Subject: [PATCH 053/131] [MKHIVE] wcsicmp -> _wcsicmp, should fix buildbot build svn path=/trunk/; revision=47021 --- reactos/tools/mkhive/reginf.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/reactos/tools/mkhive/reginf.c b/reactos/tools/mkhive/reginf.c index e8a1a2e7da3..cdf0c5b2c95 100644 --- a/reactos/tools/mkhive/reginf.c +++ b/reactos/tools/mkhive/reginf.c @@ -53,32 +53,32 @@ static BOOL GetRootKey (PWCHAR Name) { - if (!wcsicmp (Name, L"HKCR")) + if (!_wcsicmp (Name, L"HKCR")) { wcscpy (Name, L"\\Registry\\Machine\\SOFTWARE\\Classes\\"); return TRUE; } - if (!wcsicmp (Name, L"HKCU")) + if (!_wcsicmp (Name, L"HKCU")) { wcscpy (Name, L"\\Registry\\User\\.DEFAULT\\"); return TRUE; } - if (!wcsicmp (Name, L"HKLM")) + if (!_wcsicmp (Name, L"HKLM")) { wcscpy (Name, L"\\Registry\\Machine\\"); return TRUE; } - if (!wcsicmp (Name, L"HKU")) + if (!_wcsicmp (Name, L"HKU")) { wcscpy (Name, L"\\Registry\\User\\"); return TRUE; } #if 0 - if (!wcsicmp (Name, L"HKR")) + if (!_wcsicmp (Name, L"HKR")) return FALSE; #endif @@ -138,7 +138,7 @@ AppendMultiSzValue ( len = wcslen (Strings) + 1; for (p = Buffer; *p != 0; p += wcslen (p) + 1) - if (!wcsicmp (p, Strings)) + if (!_wcsicmp (p, Strings)) break; if (*p == 0) /* not found, need to append it */ From 79b5a24bd4a5159e266968e34ec814283e2d7c42 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sun, 25 Apr 2010 20:49:29 +0000 Subject: [PATCH 054/131] [MKHIVE] Fix a buggy format string (%s --> %S). Add _wcsicmp to rtl.c. svn path=/trunk/; revision=47022 --- reactos/tools/mkhive/reginf.c | 2 +- reactos/tools/mkhive/rtl.c | 29 +++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/reactos/tools/mkhive/reginf.c b/reactos/tools/mkhive/reginf.c index cdf0c5b2c95..9e03c08c668 100644 --- a/reactos/tools/mkhive/reginf.c +++ b/reactos/tools/mkhive/reginf.c @@ -354,7 +354,7 @@ do_reg_operation( if (Data == NULL) return FALSE; - DPRINT("setting binary data %s len %d\n", ValueName, Size); + DPRINT("setting binary data %S len %d\n", ValueName, Size); InfHostGetBinaryField (Context, 5, Data, Size, NULL); } diff --git a/reactos/tools/mkhive/rtl.c b/reactos/tools/mkhive/rtl.c index e9ed22b66e0..a68d7a0672c 100644 --- a/reactos/tools/mkhive/rtl.c +++ b/reactos/tools/mkhive/rtl.c @@ -207,3 +207,32 @@ unsigned char BitScanReverse(ULONG * const Index, unsigned long Mask) } return Mask ? 1 : 0; } + +#undef tolower +WCHAR towlower(WCHAR ch) +{ + if (ch < L'A') + { + return ch; + } + else if (ch <= L'Z') + { + return ch + (L'a' - L'A'); + } + + return ch; +} + +int _wcsicmp(PCWSTR cs, PCWSTR ct) +{ + while (towlower(*cs) == towlower(*ct)) + { + if (*cs == 0) + return 0; + + cs++; + ct++; + } + + return towlower(*cs) - towlower(*ct); +} From fd9406974e79efb24e13d775a8e040f069fbef9f Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sun, 25 Apr 2010 20:51:07 +0000 Subject: [PATCH 055/131] [AFD] - Add some sanity checks svn path=/trunk/; revision=47023 --- reactos/drivers/network/afd/afd/lock.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/reactos/drivers/network/afd/afd/lock.c b/reactos/drivers/network/afd/afd/lock.c index 7605f8d0774..dcc4f24089a 100644 --- a/reactos/drivers/network/afd/afd/lock.c +++ b/reactos/drivers/network/afd/afd/lock.c @@ -17,6 +17,10 @@ PVOID LockRequest( PIRP Irp, PIO_STACK_LOCATION IrpSp ) { BOOLEAN LockFailed = FALSE; + ASSERT(IrpSp->Parameters.DeviceIoControl.Type3InputBuffer); + ASSERT(IrpSp->Parameters.DeviceIoControl.InputBufferLength); + ASSERT(!Irp->MdlAddress); + Irp->MdlAddress = IoAllocateMdl( IrpSp->Parameters.DeviceIoControl.Type3InputBuffer, IrpSp->Parameters.DeviceIoControl.InputBufferLength, From 9bab4055b3d31a433ac5adee7b606f9caa90a79c Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sun, 25 Apr 2010 21:00:04 +0000 Subject: [PATCH 056/131] [OSKITTCP] - Add a sanity check - Dedicated to Caemyr svn path=/trunk/; revision=47024 --- reactos/lib/drivers/oskittcp/oskittcp/osenv.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/reactos/lib/drivers/oskittcp/oskittcp/osenv.c b/reactos/lib/drivers/oskittcp/oskittcp/osenv.c index d29fa5fa239..aa8d246c63f 100644 --- a/reactos/lib/drivers/oskittcp/oskittcp/osenv.c +++ b/reactos/lib/drivers/oskittcp/oskittcp/osenv.c @@ -41,5 +41,10 @@ void* oskit_bufio_create(int len) } void oskit_bufio_map(void *srcbuf, void**dstbuf, int off, int len) { +#if DBG + if (off != 0) + panic("oskit_bufio_map: offset is non-zero"); +#endif + *dstbuf = srcbuf; } From 89a4d76d9de4304bf27b54a1737790a317ce42d7 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Mon, 26 Apr 2010 00:41:09 +0000 Subject: [PATCH 057/131] [STRSAFE] Add strsafe.h from amd64 branch. svn path=/trunk/; revision=47026 --- reactos/include/psdk/strsafe.h | 626 +++++++++++++++++++++++++++++++++ 1 file changed, 626 insertions(+) create mode 100644 reactos/include/psdk/strsafe.h diff --git a/reactos/include/psdk/strsafe.h b/reactos/include/psdk/strsafe.h new file mode 100644 index 00000000000..7f09e1bd0fe --- /dev/null +++ b/reactos/include/psdk/strsafe.h @@ -0,0 +1,626 @@ +#ifndef __STRSAFE_H_ +#define __STRSAFE_H_ + +#include +#include + +#if defined(STRSAFE_NO_CCH_FUNCTIONS) && defined(STRSAFE_NO_CB_FUNCTIONS) +#error Both STRSAFE_NO_CCH_FUNCTIONS and STRSAFE_NO_CB_FUNCTIONS are defined +#endif + +#ifndef SUCCEEDED +#define SUCCEEDED(Status) ((HRESULT)(Status) >= 0) +#endif +#define STRSAFE_MAX_CCH 2147483647 +#define STRSAFE_E_INVALID_PARAMETER ((HRESULT)0x80070057L) +#define STRSAFE_E_INSUFFICIENT_BUFFER ((HRESULT)0x8007007AL) +#define STRSAFE_E_END_OF_FILE ((HRESULT)0x80070026L) + +#define STRSAFE_FILL_BEHIND_NULL 0x00000200 +#define STRSAFE_IGNORE_NULLS 0x00000200 +#define STRSAFE_FILL_ON_FAILURE 0x00000400 +#define STRSAFE_NULL_ON_FAILURE 0x00000800 +#define STRSAFE_NO_TRUNCATION 0x00001000 + +#ifndef S_OK +#define S_OK ((HRESULT)0x00000000L) +#endif + +#define STRSAFE_MIN(a,b) (((a) < (b))?(a):(b)) + +#ifndef _HRESULT_DEFINED +#define _HRESULT_DEFINED +typedef long HRESULT; +#endif + +typedef char * STRSAFE_LPSTR; +typedef const char * STRSAFE_LPCSTR; +typedef wchar_t * STRSAFE_LPWSTR; +typedef const wchar_t * STRSAFE_LPCWSTR; +typedef unsigned long STRSAFE_DWORD; + +#define STRSAFE_PASS2 + +/* Implement Cb functions for ansi and unicode */ +#ifndef STRSAFE_NO_CB_FUNCTIONS +#define STRSAFE_CB +#define STRSAFE_UNICODE 0 +# include +#undef STRSAFE_UNICODE +#define STRSAFE_UNICODE 1 +# include +#undef STRSAFE_UNICODE +#undef STRSAFE_CB +#endif // !STRSAFE_NO_CB_FUNCTIONS + +/* Implement Cch functions for ansi and unicode */ +#ifndef STRSAFE_NO_CCH_FUNCTIONS +#define STRSAFE_UNICODE 0 +# include +#undef STRSAFE_UNICODE +#define STRSAFE_UNICODE 1 +# include +#undef STRSAFE_UNICODE +#endif // !STRSAFE_NO_CCH_FUNCTIONS + +#undef STRSAFE_PASS2 + +/* Now define the functions depending on UNICODE */ +#if defined(UNICODE) +# define STRSAFE_UNICODE 1 +#else +# define STRSAFE_UNICODE 0 +#endif +#include +#undef STRSAFE_UNICODE + +#endif // !__STRSAFE_H_ + +/*****************************************************************************/ + +#if defined(STRSAFE_UNICODE) +#if (STRSAFE_UNICODE == 1) + +#define STRSAFE_LPTSTR STRSAFE_LPWSTR +#define STRSAFE_LPCTSTR STRSAFE_LPCWSTR +#define STRSAFE_TCHAR wchar_t + +#define StringCbCat StringCbCatW +#define StringCbCatEx StringCbCatExW +#define StringCbCatN StringCbCatNW +#define StringCbCatNEx StringCbCatNExW +#define StringCbCatWorker StringCxxCatWorkerW +#define StringCbCopy StringCbCopyW +#define StringCbCopyEx StringCbCopyExW +#define StringCbCopyN StringCbCopyNW +#define StringCbCopyNEx StringCbCopyNExW +#define StringCbGets StringCbGetsW +#define StringCbGetsEx StringCbGetsExW +#define StringCbLength StringCbLengthW +#define StringCbPrintf StringCbPrintfW +#define StringCbPrintfEx StringCbPrintfExW +#define StringCbVPrintf StringCbVPrintfW +#define StringCbVPrintfEx StringCbVPrintfExW +#define StringCchCat StringCchCatW +#define StringCchCatEx StringCchCatExW +#define StringCchCatN StringCchCatNW +#define StringCchCatNEx StringCchCatNExW +#define StringCchCatWorker StringCchCatWorkerW +#define StringCchCopy StringCchCopyW +#define StringCchCopyEx StringCchCopyExW +#define StringCchCopyN StringCchCopyNW +#define StringCchCopyNEx StringCchCopyNExW +#define StringCchGets StringCchGetsW +#define StringCchGetsEx StringCchGetsExW +#define StringCchLength StringCchLengthW +#define StringCchPrintf StringCchPrintfW +#define StringCchPrintfEx StringCchPrintfExW +#define StringCchVPrintf StringCchVPrintfW +#define StringCchVPrintfEx StringCchVPrintfExW +#define _vsnprintfAW _vsnwprintf + +#else // (STRSAFE_UNICODE != 1) + +#define STRSAFE_LPTSTR STRSAFE_LPSTR +#define STRSAFE_LPCTSTR STRSAFE_LPCSTR +#define STRSAFE_TCHAR char + +#define StringCbCat StringCbCatA +#define StringCbCatEx StringCbCatExA +#define StringCbCatN StringCbCatNA +#define StringCbCatNEx StringCbCatNExA +#define StringCbCatWorker StringCxxCatWorkerA +#define StringCbCopy StringCbCopyA +#define StringCbCopyEx StringCbCopyExA +#define StringCbCopyN StringCbCopyNA +#define StringCbCopyNEx StringCbCopyNExA +#define StringCbGets StringCbGetsA +#define StringCbGetsEx StringCbGetsExA +#define StringCbLength StringCbLengthA +#define StringCbPrintf StringCbPrintfA +#define StringCbPrintfEx StringCbPrintfExA +#define StringCbVPrintf StringCbVPrintfA +#define StringCbVPrintfEx StringCbVPrintfExA +#define StringCchCat StringCchCatA +#define StringCchCatEx StringCchCatExA +#define StringCchCatN StringCchCatNA +#define StringCchCatNEx StringCchCatNExA +#define StringCchCatWorker StringCchCatWorkerA +#define StringCchCopy StringCchCopyA +#define StringCchCopyEx StringCchCopyExA +#define StringCchCopyN StringCchCopyNA +#define StringCchCopyNEx StringCchCopyNExA +#define StringCchGets StringCchGetsA +#define StringCchGetsEx StringCchGetsExA +#define StringCchLength StringCchLengthA +#define StringCchPrintf StringCchPrintfA +#define StringCchPrintfEx StringCchPrintfExA +#define StringCchVPrintf StringCchVPrintfA +#define StringCchVPrintfEx StringCchVPrintfExA +#define _vsnprintfAW _vsnprintf + +#endif // (STRSAFE_UNICODE != 1) +#endif // defined(STRSAFE_UNICODE) + +/*****************************************************************************/ + +#if defined (STRSAFE_PASS2) + +#if defined(STRSAFE_CB) + +#define STRSAFE_CXXtoCB(x) (x) +#define STRSAFE_CBtoCXX(x) (x) +#define STRSAFE_CXXtoCCH(x) (x)/sizeof(STRSAFE_TCHAR) +#define STRSAFE_CCHtoCXX(x) (x)*sizeof(STRSAFE_TCHAR) +#define StringCxxCat StringCbCat +#define StringCxxCatEx StringCbCatEx +#define StringCxxCatN StringCbCatN +#define StringCxxCatNEx StringCbCatNEx +#define StringCxxCatWorker StringCbCatWorker +#define StringCxxCopy StringCbCopy +#define StringCxxCopyEx StringCbCopyEx +#define StringCxxCopyN StringCbCopyN +#define StringCxxCopyNEx StringCbCopyNEx +#define StringCxxGets StringCbGets +#define StringCxxGetsEx StringCbGetsEx +#define StringCxxLength StringCbLength +#define StringCxxPrintf StringCbPrintf +#define StringCxxPrintfEx StringCbPrintfEx +#define StringCxxVPrintf StringCbVPrintf +#define StringCxxVPrintfEx StringCbVPrintfEx + +#else // !STRSAFE_CB + +#define STRSAFE_CXXtoCB(x) (x)*sizeof(STRSAFE_TCHAR) +#define STRSAFE_CBtoCXX(x) (x)/sizeof(STRSAFE_TCHAR) +#define STRSAFE_CXXtoCCH(x) (x) +#define STRSAFE_CCHtoCXX(x) (x) +#define StringCxxCat StringCchCat +#define StringCxxCatEx StringCchCatEx +#define StringCxxCatN StringCchCatN +#define StringCxxCatNEx StringCchCatNEx +#define StringCxxCatWorker StringCchCatWorker +#define StringCxxCopy StringCchCopy +#define StringCxxCopyEx StringCchCopyEx +#define StringCxxCopyN StringCchCopyN +#define StringCxxCopyNEx StringCchCopyNEx +#define StringCxxGets StringCchGets +#define StringCxxGetsEx StringCchGetsEx +#define StringCxxLength StringCchLength +#define StringCxxPrintf StringCchPrintf +#define StringCxxPrintfEx StringCchPrintfEx +#define StringCxxVPrintf StringCchVPrintf +#define StringCxxVPrintfEx StringCchVPrintfEx + +#endif // !STRSAFE_CB + +#ifdef STRSAFE_LIB + +/* Normal function prototypes only */ +#define STRSAFEAPI HRESULT __stdcall + +STRSAFEAPI StringCxxCat(STRSAFE_LPTSTR pszDest, size_t cxDest, STRSAFE_LPCTSTR pszSrc); +STRSAFEAPI StringCxxCatEx(STRSAFE_LPTSTR pszDest, size_t cxDest, STRSAFE_LPCTSTR pszSrc, STRSAFE_LPTSTR *ppszDestEnd, size_t *pcbRemaining, STRSAFE_DWORD dwFlags); +STRSAFEAPI StringCxxCatN(STRSAFE_LPTSTR pszDest, size_t cxDest, STRSAFE_LPCTSTR pszSrc, size_t cbMaxAppend); +STRSAFEAPI StringCxxCatNEx(STRSAFE_LPTSTR pszDest, size_t cxDest, STRSAFE_LPCTSTR pszSrc, size_t cbMaxAppend, STRSAFE_LPTSTR *ppszDestEnd, size_t *pcbRemaining, STRSAFE_DWORD dwFlags); +STRSAFEAPI StringCxxCopy(STRSAFE_LPTSTR pszDest, size_t cxDest, STRSAFE_LPCTSTR pszSrc); +STRSAFEAPI StringCxxCopyEx(STRSAFE_LPTSTR pszDest, size_t cxDest, STRSAFE_LPCTSTR pszSrc, STRSAFE_LPTSTR *ppszDestEnd, size_t *pcbRemaining, STRSAFE_DWORD dwFlags); +STRSAFEAPI StringCxxCopyN(STRSAFE_LPTSTR pszDest, size_t cxDest, STRSAFE_LPCTSTR pszSrc, size_t cbSrc); +STRSAFEAPI StringCxxCopyNEx(STRSAFE_LPTSTR pszDest, size_t cxDest, STRSAFE_LPCTSTR pszSrc, size_t cbSrc, STRSAFE_LPTSTR *ppszDestEnd, size_t *pcbRemaining, STRSAFE_DWORD dwFlags); +STRSAFEAPI StringCxxGets(STRSAFE_LPTSTR pszDest, size_t cxDest); +STRSAFEAPI StringCxxGetsEx(STRSAFE_LPTSTR pszDest, size_t cxDest, STRSAFE_LPTSTR *ppszDestEnd, size_t *pcbRemaining, STRSAFE_DWORD dwFlags); +STRSAFEAPI StringCxxLength(STRSAFE_LPCTSTR psz, size_t cxMax, size_t *pcb); +STRSAFEAPI StringCxxPrintf(STRSAFE_LPTSTR pszDest, size_t cxDest, STRSAFE_LPCTSTR pszFormat, ...); +STRSAFEAPI StringCxxPrintfEx(STRSAFE_LPTSTR pszDest, size_t cxDest, STRSAFE_LPTSTR *ppszDestEnd, size_t *pcbRemaining, STRSAFE_DWORD dwFlags, STRSAFE_LPCTSTR pszFormat, ...); +STRSAFEAPI StringCxxVPrintf(STRSAFE_LPTSTR pszDest, size_t cxDest, STRSAFE_LPCTSTR pszFormat, va_list args); +STRSAFEAPI StringCxxVPrintfEx(STRSAFE_LPTSTR pszDest, size_t cxDest, STRSAFE_LPTSTR *ppszDestEnd, size_t *pcbRemaining, STRSAFE_DWORD dwFlags, LPCTSTR pszFormat, va_list args); + +#else // !STRSAFE_LIB + +/* Create inlined versions */ +#define STRSAFEAPI HRESULT static __inline__ + +#define STRSAFE_MAX_CXX STRSAFE_CCHtoCXX(STRSAFE_MAX_CCH) + +STRSAFEAPI +StringCxxCatWorker( + STRSAFE_LPTSTR pszDest, + size_t cxDest, + STRSAFE_LPCTSTR pszSrc, + size_t cxMaxAppend, + STRSAFE_LPTSTR *ppszDestEnd, + size_t *pcbRemaining, + STRSAFE_DWORD dwFlags, + int UseN) +{ + HRESULT result; + STRSAFE_LPTSTR psz = pszDest; + size_t cch = STRSAFE_CXXtoCCH(cxDest); + + if (!pszDest || !pszSrc || cxDest > STRSAFE_MAX_CXX || cxDest == 0) + { + return STRSAFE_E_INVALID_PARAMETER; + } + + for (--psz; *(++psz) != 0 && --cch > 0;); + if (cch == 0) + { + return STRSAFE_E_INSUFFICIENT_BUFFER; + } + + if (UseN) + { + cch = STRSAFE_MIN(cxDest, STRSAFE_CXXtoCCH(cxMaxAppend)); + } + + for (--pszSrc, --psz; (*(++psz) = *(++pszSrc)) != 0 && --cch > 0;); + if (cch == 0) + { + result = STRSAFE_E_INSUFFICIENT_BUFFER; + } + else + result = S_OK; + + if (ppszDestEnd) + { + *ppszDestEnd = psz; + } + + if (pcbRemaining) + { + *pcbRemaining = STRSAFE_CCHtoCXX(cch); + } + + if (dwFlags & STRSAFE_FILL_BEHIND_NULL) + { + for (--psz, ++cch; --cch; *(++psz) = dwFlags & 0xff); + } + + if (!SUCCEEDED(result)) + { + if (dwFlags & STRSAFE_FILL_ON_FAILURE) + { + cch = STRSAFE_CXXtoCCH(cxDest); + for (--pszDest, ++cch; --cch; *(++pszDest) = dwFlags & 0xff); + } + + if (dwFlags & STRSAFE_NULL_ON_FAILURE) + { + *pszDest = 0; + } + } + + return result; +} + +STRSAFEAPI +StringCxxCatEx( + STRSAFE_LPTSTR pszDest, + size_t cxDest, + STRSAFE_LPCTSTR pszSrc, + STRSAFE_LPTSTR *ppszDestEnd, + size_t *pcbRemaining, + STRSAFE_DWORD dwFlags) +{ + return StringCxxCatWorker(pszDest, cxDest, pszSrc, 0, ppszDestEnd, pcbRemaining, dwFlags, 0); +} + +STRSAFEAPI +StringCxxCat( + STRSAFE_LPTSTR pszDest, + size_t cxDest, + STRSAFE_LPCTSTR pszSrc) +{ + return StringCxxCatWorker(pszDest, cxDest, pszSrc, 0, NULL, NULL, 0, 0); +} + +STRSAFEAPI +StringCxxCatN( + STRSAFE_LPTSTR pszDest, + size_t cxDest, + STRSAFE_LPCTSTR pszSrc, + size_t cbMaxAppend) +{ + return StringCxxCatWorker(pszDest, cxDest, pszSrc, cbMaxAppend, NULL, NULL, 0, 1); +} + +STRSAFEAPI +StringCxxCatNEx( + STRSAFE_LPTSTR pszDest, + size_t cxDest, + STRSAFE_LPCTSTR pszSrc, + size_t cbMaxAppend, + STRSAFE_LPTSTR *ppszDestEnd, + size_t *pcbRemaining, + STRSAFE_DWORD dwFlags) +{ + return StringCxxCatWorker(pszDest, cxDest, pszSrc, cbMaxAppend, ppszDestEnd, pcbRemaining, dwFlags, 1); +} + +STRSAFEAPI +StringCxxCopy( + STRSAFE_LPTSTR pszDest, + size_t cbDest, + STRSAFE_LPCTSTR pszSrc) +{ + return 0; // FIXME +} + +STRSAFEAPI +StringCxxCopyEx( + STRSAFE_LPTSTR pszDest, + size_t cbDest, + STRSAFE_LPCTSTR pszSrc, + STRSAFE_LPTSTR *ppszDestEnd, + size_t *pcbRemaining, + STRSAFE_DWORD dwFlags) +{ + return 0; // FIXME +} + +STRSAFEAPI +StringCxxCopyN( + STRSAFE_LPTSTR pszDest, + size_t cbDest, + STRSAFE_LPCTSTR pszSrc, + size_t cbSrc) +{ + return 0; // FIXME +} + +STRSAFEAPI +StringCxxCopyNEx( + STRSAFE_LPTSTR pszDest, + size_t cbDest, + STRSAFE_LPCTSTR pszSrc, + size_t cbSrc, + STRSAFE_LPTSTR *ppszDestEnd, + size_t *pcbRemaining, + STRSAFE_DWORD dwFlags) +{ + return 0; // FIXME +} + +STRSAFEAPI +StringCxxGets( + STRSAFE_LPTSTR pszDest, + size_t cbDest) +{ + return 0; // FIXME +} + +STRSAFEAPI +StringCxxGetsEx( + STRSAFE_LPTSTR pszDest, + size_t cbDest, + STRSAFE_LPTSTR *ppszDestEnd, + size_t *pcbRemaining, + STRSAFE_DWORD dwFlags) +{ + return 0; // FIXME +} + +STRSAFEAPI +StringCxxLength( + STRSAFE_LPCTSTR psz, + size_t cxMax, + size_t *pcx) +{ + size_t cch = STRSAFE_CXXtoCCH(cxMax); + + /* Default return on error */ + if (pcx) + *pcx = 0; + + if (!psz || cxMax > STRSAFE_MAX_CXX || cxMax == 0) + { + return STRSAFE_E_INVALID_PARAMETER; + } + + for (--psz; *(++psz) != 0 && --cch > 0;); + + if (cch == 0) + { + return STRSAFE_E_INVALID_PARAMETER; + } + + if (pcx) + *pcx = cxMax - STRSAFE_CCHtoCXX(cch); + + return S_OK; +} + +STRSAFEAPI +StringCxxVPrintfEx( + STRSAFE_LPTSTR pszDest, + size_t cxDest, + STRSAFE_LPTSTR *ppszDestEnd, + size_t *pcxRemaining, + STRSAFE_DWORD dwFlags, + STRSAFE_LPCTSTR pszFormat, + va_list args) +{ + size_t cchDest = STRSAFE_CXXtoCCH(cxDest); + size_t cchMax = cchDest - 1; + int iResult; + HRESULT hr; + + if (dwFlags & STRSAFE_IGNORE_NULLS) + { + if (!pszDest) pszDest = (STRSAFE_LPTSTR)L""; + if (!pszFormat) pszFormat = (STRSAFE_LPTSTR)L""; + } + + if (!pszDest || !pszFormat || cxDest > STRSAFE_MAX_CXX || cxDest == 0) + { + return STRSAFE_E_INVALID_PARAMETER; + } + +#if (STRSAFE_USE_SECURE_CRT == 1) + iResult = _vsnprintf_sAW(pszDest, cchDest, cchMax, pszFormat, args); +#else + iResult = _vsnprintfAW(pszDest, cchMax, pszFormat, args); +#endif + + hr = (iResult == -1) ? STRSAFE_E_INSUFFICIENT_BUFFER : S_OK; + + if ((size_t)iResult >= cchMax) + { + pszDest[cchMax] = 0; + iResult = cchMax; + } + + if (ppszDestEnd) *ppszDestEnd = pszDest + iResult; + + if (pcxRemaining) *pcxRemaining = STRSAFE_CCHtoCXX(cchMax - iResult); + + if (SUCCEEDED(hr)) + { + if ((dwFlags & STRSAFE_FILL_BEHIND_NULL) && (iResult + 1 < cchMax)) + { + memset(pszDest + iResult + 1, + dwFlags & 0xff, + (cchMax - iResult - 1) * sizeof(STRSAFE_TCHAR)); + } + } + else + { + if (dwFlags & STRSAFE_FILL_ON_FAILURE) + { + memset(pszDest, dwFlags & 0xff, cchMax * sizeof(STRSAFE_TCHAR)); + } + else if (dwFlags & STRSAFE_NULL_ON_FAILURE) + { + *pszDest = 0; + } + } + + return hr; +} + +STRSAFEAPI +StringCxxVPrintf( + STRSAFE_LPTSTR pszDest, + size_t cxDest, + STRSAFE_LPCTSTR pszFormat, + va_list args) +{ + return StringCxxVPrintfEx(pszDest, cxDest, NULL, NULL, 0, pszFormat, args); +} + +STRSAFEAPI +StringCxxPrintf( + STRSAFE_LPTSTR pszDest, + size_t cxDest, + STRSAFE_LPCTSTR pszFormat, ...) +{ + HRESULT result; + va_list args; + va_start(args, pszFormat); + result = StringCxxVPrintf(pszDest, cxDest, pszFormat, args); + va_end(args); + return result; +} + +STRSAFEAPI +StringCxxPrintfEx( + STRSAFE_LPTSTR pszDest, + size_t cxDest, + STRSAFE_LPTSTR *ppszDestEnd, + size_t *pcbRemaining, + STRSAFE_DWORD dwFlags, + STRSAFE_LPCTSTR pszFormat, ...) +{ + HRESULT result; + va_list args; + va_start(args, pszFormat); + result = StringCxxVPrintfEx(pszDest, cxDest, ppszDestEnd, pcbRemaining, dwFlags, pszFormat, args); + va_end(args); + return result; +} + +#endif // !STRSAFE_LIB + +/* Functions are implemented or defined, clear #defines for next pass */ +#undef StringCxxCat +#undef StringCxxCatEx +#undef StringCxxCatN +#undef StringCxxCatNEx +#undef StringCxxCatWorker +#undef StringCxxCopy +#undef StringCxxCopyEx +#undef StringCxxCopyN +#undef StringCxxCopyNEx +#undef StringCxxGets +#undef StringCxxGetsEx +#undef StringCxxLength +#undef StringCxxPrintf +#undef StringCxxPrintfEx +#undef StringCxxVPrintf +#undef StringCxxVPrintfEx + +#undef StringCbCat +#undef StringCbCatEx +#undef StringCbCatN +#undef StringCbCatNEx +#undef StringCbCatWorker +#undef StringCbCopy +#undef StringCbCopyEx +#undef StringCbCopyN +#undef StringCbCopyNEx +#undef StringCbGets +#undef StringCbGetsEx +#undef StringCbLength +#undef StringCbPrintf +#undef StringCbPrintfEx +#undef StringCbVPrintf +#undef StringCbVPrintfEx +#undef StringCchCat +#undef StringCchCatEx +#undef StringCchCatN +#undef StringCchCatNEx +#undef StringCchCatWorker +#undef StringCchCopy +#undef StringCchCopyEx +#undef StringCchCopyN +#undef StringCchCopyNEx +#undef StringCchGets +#undef StringCchGetsEx +#undef StringCchLength +#undef StringCchPrintf +#undef StringCchPrintfEx +#undef StringCchVPrintf +#undef StringCchVPrintfEx +#undef _vsnprintfAW + +#undef STRSAFE_LPTSTR +#undef STRSAFE_LPCTSTR +#undef STRSAFE_TCHAR + +#undef STRSAFE_CXXtoCB +#undef STRSAFE_CBtoCXX +#undef STRSAFE_CXXtoCCH +#undef STRSAFE_CCHtoCXX + +#endif // defined (STRSAFE_PASS2) + From b5a39d6dd14ee5454e1c3100edb5807b1ce3de0a Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Mon, 26 Apr 2010 01:23:21 +0000 Subject: [PATCH 058/131] [WIN32CSR] - Rewrite harderror handling. The old code was a monster function, leaking memory, using ansi rather than unicode strings and not getting this right. It was also vulnerable to attacks, making csrss crash, when corrupt parameters were sent. svn path=/trunk/; revision=47027 --- .../subsystems/win32/csrss/win32csr/dllmain.c | 396 ------------- .../win32/csrss/win32csr/harderror.c | 552 ++++++++++++++++++ .../subsystems/win32/csrss/win32csr/w32csr.h | 7 + .../win32/csrss/win32csr/win32csr.rbuild | 2 + 4 files changed, 561 insertions(+), 396 deletions(-) create mode 100644 reactos/subsystems/win32/csrss/win32csr/harderror.c diff --git a/reactos/subsystems/win32/csrss/win32csr/dllmain.c b/reactos/subsystems/win32/csrss/win32csr/dllmain.c index 2b3c6b7a1a4..e1fc421ff7c 100644 --- a/reactos/subsystems/win32/csrss/win32csr/dllmain.c +++ b/reactos/subsystems/win32/csrss/win32csr/dllmain.c @@ -180,402 +180,6 @@ Win32CsrInitComplete(void) return TRUE; } -static BOOL WINAPI -Win32CsrHardError(IN PCSRSS_PROCESS_DATA ProcessData, - IN PHARDERROR_MSG HardErrorMessage) -{ - UINT responce = MB_OK; - NTSTATUS Status; - HANDLE hProcess; - OBJECT_ATTRIBUTES ObjectAttributes; - ULONG nParam = 0; - PRTL_MESSAGE_RESOURCE_ENTRY MessageResource; - ULONG_PTR ParameterList[MAXIMUM_HARDERROR_PARAMETERS]; - LPSTR CaptionText, MessageBody; - LPWSTR szxCaptionText, szxMessageBody; - DWORD SizeOfAllUnicodeStrings = 0; - PROCESS_BASIC_INFORMATION ClientBasicInfo; - UNICODE_STRING ClientFileNameU; - UNICODE_STRING TempStringU; - UNICODE_STRING ParameterStringU; - ANSI_STRING ParamStringA; - ULONG UnicodeStringParameterMask = HardErrorMessage->UnicodeStringParameterMask; - int MessageBoxResponse; - - HardErrorMessage->Response = ResponseNotHandled; - - DPRINT("NumberOfParameters = %d\n", HardErrorMessage->NumberOfParameters); - DPRINT("Status = %lx\n", HardErrorMessage->Status); - - // open client process - InitializeObjectAttributes(&ObjectAttributes, NULL, 0, NULL, NULL); - Status = NtOpenProcess(&hProcess, PROCESS_VM_READ | PROCESS_QUERY_INFORMATION, &ObjectAttributes, &HardErrorMessage->h.ClientId); - if( !NT_SUCCESS(Status) ) { - DPRINT1("NtOpenProcess failed with code: %lx\n", Status); - return FALSE; - } - - // let's get a name of the client process to display it in the caption of a message box - - ClientFileNameU.MaximumLength = 0; - ClientFileNameU.Length = 0; - ClientFileNameU.Buffer = NULL; - Status = NtQueryInformationProcess(hProcess, - ProcessBasicInformation, - &ClientBasicInfo, - sizeof(ClientBasicInfo), - NULL); - if( NT_SUCCESS(Status) ) { - PLIST_ENTRY ModuleListHead; - PLIST_ENTRY Entry; - PLDR_DATA_TABLE_ENTRY Module; - PPEB_LDR_DATA Ldr; - PPEB Peb = ClientBasicInfo.PebBaseAddress; - - if( Peb ) - { - Status = NtReadVirtualMemory(hProcess, &Peb->Ldr, &Ldr, sizeof(Ldr), NULL); - if( NT_SUCCESS(Status) ) { - ModuleListHead = &Ldr->InLoadOrderModuleList; - Status = NtReadVirtualMemory( - hProcess, - &ModuleListHead->Flink, - &Entry, - sizeof(Entry), - NULL - ); - - if( NT_SUCCESS(Status) ) - { - if (Entry != ModuleListHead) - { - LDR_DATA_TABLE_ENTRY ModuleData; - Module = CONTAINING_RECORD(Entry, LDR_DATA_TABLE_ENTRY, InLoadOrderLinks); - - Status = NtReadVirtualMemory(hProcess, Module, &ModuleData, sizeof(ModuleData), NULL); - if( NT_SUCCESS(Status) ) { - PVOID ClientDllBase; - - Status = NtReadVirtualMemory( - hProcess, - &Peb->ImageBaseAddress, - &ClientDllBase, - sizeof(ClientDllBase), - NULL - ); - if( NT_SUCCESS(Status) && (ClientDllBase == ModuleData.DllBase) ) { - - ClientFileNameU.MaximumLength = ModuleData.BaseDllName.MaximumLength; - ClientFileNameU.Buffer = RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, ClientFileNameU.MaximumLength); - Status = NtReadVirtualMemory( - hProcess, - ModuleData.BaseDllName.Buffer, - ClientFileNameU.Buffer, - ClientFileNameU.MaximumLength, - NULL - ); - if( NT_SUCCESS(Status) ) { - ClientFileNameU.Length = wcslen(ClientFileNameU.Buffer)*sizeof(wchar_t); - } - else { - RtlFreeHeap (RtlGetProcessHeap(), 0, ClientFileNameU.Buffer); - ClientFileNameU.Buffer = NULL; - } - - DPRINT("ClientFileNameU=\'%wZ\'\n", &ClientFileNameU); - } - } - } - } - } - } - } - - // read all unicode strings from client space - for(nParam = 0; nParam < HardErrorMessage->NumberOfParameters; nParam++, UnicodeStringParameterMask >>= 1) - { - if( UnicodeStringParameterMask & 0x01 ) { - Status = NtReadVirtualMemory(hProcess, - (PVOID)HardErrorMessage->Parameters[nParam], - (PVOID)&TempStringU, - sizeof(TempStringU), - NULL); - - if( NT_SUCCESS(Status) ) { - ParameterStringU.Buffer = (PWSTR)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, TempStringU.MaximumLength); - if( !ParameterStringU.Buffer ) { - DPRINT1("Cannot allocate memory %d\n", TempStringU.MaximumLength); - NtClose(hProcess); - if( ClientFileNameU.Buffer ) { - RtlFreeHeap (RtlGetProcessHeap(), 0, ClientFileNameU.Buffer); - } - return FALSE; - } - - Status = NtReadVirtualMemory(hProcess, - (PVOID)TempStringU.Buffer, - (PVOID)ParameterStringU.Buffer, - TempStringU.MaximumLength, - NULL); - if( !NT_SUCCESS(Status) ) { - DPRINT1("NtReadVirtualMemory failed with code: %lx\n", Status); - RtlFreeHeap (RtlGetProcessHeap(), 0, ParameterStringU.Buffer); - if( ClientFileNameU.Buffer ) { - RtlFreeHeap (RtlGetProcessHeap(), 0, ClientFileNameU.Buffer); - } - NtClose(hProcess); - return FALSE; - } - ParameterStringU.Length = TempStringU.Length; - ParameterStringU.MaximumLength = TempStringU.MaximumLength; - DPRINT("ParameterStringU=\'%wZ\'\n", &ParameterStringU); - RtlUnicodeStringToAnsiString(&ParamStringA, &ParameterStringU, TRUE); - ParameterList[nParam] = (ULONG_PTR)ParamStringA.Buffer; - SizeOfAllUnicodeStrings += ParamStringA.MaximumLength; - } - } - else { - // it's not a unicode string - ParameterList[nParam] = HardErrorMessage->Parameters[nParam]; - } - } - - NtClose(hProcess); - - // get text string of the error code - Status = RtlFindMessage( - (PVOID)GetModuleHandle(TEXT("ntdll")), - (ULONG_PTR)RT_MESSAGETABLE, - LANG_NEUTRAL, - HardErrorMessage->Status, - &MessageResource ); - if( !NT_SUCCESS(Status) ) { - // WE HAVE TO DISPLAY HERE: "Unknown hard error" - if( ClientFileNameU.Buffer ) { - szxCaptionText = (LPWSTR)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, ClientFileNameU.MaximumLength+64); - wsprintfW(szxCaptionText, L"%s - %hs", ClientFileNameU.Buffer, "Application Error"); - } else { - szxCaptionText = (LPWSTR)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, 64); - wsprintfW(szxCaptionText, L"System - Application Error"); - } - MessageBody = (LPSTR)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, 38); - wsprintfA(MessageBody, "Unknown hard error"); - } - else { - LPSTR NtStatusString; - UNICODE_STRING MessageU; - ANSI_STRING MessageA; - USHORT CaptionSize = 0; - - if( !MessageResource->Flags ) { - /* we've got an ansi string */ - DPRINT("MessageResource->Text=%s\n", (PSTR)MessageResource->Text); - RtlInitAnsiString(&MessageA, MessageResource->Text); - } - else { - /* we've got a unicode string */ - DPRINT("MessageResource->Text=%S\n", (PWSTR)MessageResource->Text); - RtlInitUnicodeString(&MessageU, (PWSTR)MessageResource->Text); - RtlUnicodeStringToAnsiString(&MessageA, &MessageU, TRUE); - } - - // check whether a caption exists - if( *MessageA.Buffer == '{' ) { - // get size of the caption - for( CaptionSize = 0; (CaptionSize < MessageA.Length) && ('}' != MessageA.Buffer[CaptionSize]); CaptionSize++); - - CaptionText = (LPSTR)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, CaptionSize); - RtlCopyMemory(CaptionText, MessageA.Buffer+1, CaptionSize-1); - CaptionSize += 2; // "}\r\n" - 3 - - szxCaptionText = (LPWSTR)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(wchar_t)*CaptionSize+ClientFileNameU.MaximumLength+128); - if( ClientFileNameU.Buffer ) { - wsprintfW(szxCaptionText, L"%s - %hs", ClientFileNameU.Buffer, CaptionText); - } else { - wsprintfW(szxCaptionText, L"System - %hs", CaptionText); - } - RtlFreeHeap (RtlGetProcessHeap(), 0, CaptionText); - } - else { - if( ClientFileNameU.Buffer ) { - szxCaptionText = (LPWSTR)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, ClientFileNameU.MaximumLength); - wsprintfW(szxCaptionText, L"%s", ClientFileNameU.Buffer); - } else { - szxCaptionText = (LPWSTR)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, 14); // 14 - "System\0\0" - wsprintfW(szxCaptionText, L"System"); - } - } - DPRINT("ParameterList[0]=0x%lx\n", ParameterList[0]); - if( STATUS_UNHANDLED_EXCEPTION == HardErrorMessage->Status ) - { - PRTL_MESSAGE_RESOURCE_ENTRY MsgResException; - MessageBody = NULL; - Status = RtlFindMessage( - (PVOID)GetModuleHandle(TEXT("ntdll")), - (ULONG_PTR)RT_MESSAGETABLE, - LANG_NEUTRAL, - ParameterList[0], - &MsgResException); - - if( NT_SUCCESS(Status) ) - { - UNICODE_STRING ExcMessageU; - ANSI_STRING ExcMessageA; - if( !MsgResException->Flags ) { - /* we've got an ansi string */ - DPRINT("MsgResException->Text=%s\n", (PSTR)MsgResException->Text); - RtlInitAnsiString(&ExcMessageA, MsgResException->Text); - } - else { - /* we've got a unicode string */ - DPRINT("MsgResException->Text=%S\n", (PWSTR)MsgResException->Text); - RtlInitUnicodeString(&ExcMessageU, (PWSTR)MsgResException->Text); - RtlUnicodeStringToAnsiString(&ExcMessageA, &ExcMessageU, TRUE); - } - - MessageBody = (LPSTR)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, MsgResException->Length+SizeOfAllUnicodeStrings+1024); // 1024 is a magic number I think it should be enough - if( STATUS_ACCESS_VIOLATION == ParameterList[0] ) { - LPSTR pOperationType; - if( ParameterList[2] ) pOperationType = "written"; - else pOperationType = "read"; - wsprintfA(MessageBody, ExcMessageA.Buffer, ParameterList[1], ParameterList[3], pOperationType); - } - else if( STATUS_IN_PAGE_ERROR == ParameterList[0] ) { - wsprintfA(MessageBody, ExcMessageA.Buffer, ParameterList[1], ParameterList[3], ParameterList[2]); - } - } - if( !MessageBody ) { - NtStatusString = (LPSTR)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, MessageResource->Length-CaptionSize); - RtlCopyMemory(NtStatusString, MessageA.Buffer+CaptionSize, (MessageResource->Length-CaptionSize)-1); - - MessageBody = (LPSTR)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, MessageResource->Length+SizeOfAllUnicodeStrings+1024); // 1024 is a magic number I think it should be enough - - wsprintfA(MessageBody, NtStatusString, - L"Unknown software exception", - ParameterList[0], - ParameterList[1]); - - RtlFreeHeap (RtlGetProcessHeap(), 0, NtStatusString); - } - } - else - { - NtStatusString = (LPSTR)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, MessageResource->Length-CaptionSize); - RtlCopyMemory(NtStatusString, MessageA.Buffer+CaptionSize, (MessageResource->Length-CaptionSize)-1); - - MessageBody = (LPSTR)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, MessageResource->Length+SizeOfAllUnicodeStrings+1024); // 1024 is a magic number I think it should be enough - - wsprintfA(MessageBody, NtStatusString, - ParameterList[0], - ParameterList[1], - ParameterList[2], - ParameterList[3]); - - RtlFreeHeap (RtlGetProcessHeap(), 0, NtStatusString); - } - if( MessageResource->Flags ) { - /* we've got a unicode string */ - RtlFreeAnsiString(&MessageA); - } - } - if( ClientFileNameU.Buffer ) { - RtlFreeHeap (RtlGetProcessHeap(), 0, ClientFileNameU.Buffer); - } - - szxMessageBody = (LPWSTR)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(wchar_t)*(strlen(MessageBody)+1)); - wsprintfW(szxMessageBody, L"%hs", MessageBody); - RtlFreeHeap (RtlGetProcessHeap(), 0, MessageBody); - - switch ( HardErrorMessage->ValidResponseOptions ) - { - case OptionAbortRetryIgnore: - responce = MB_ABORTRETRYIGNORE; - break; - - case OptionOk: - responce = MB_OK; - break; - - case OptionOkCancel: - responce = MB_OKCANCEL; - break; - - case OptionRetryCancel: - responce = MB_RETRYCANCEL; - break; - - case OptionYesNo: - responce = MB_YESNO; - break; - - case OptionYesNoCancel: - responce = MB_YESNOCANCEL; - break; - - case OptionShutdownSystem: - // XZ?? - break; - - default: - DPRINT1("Wrong option: ValidResponseOptions = %d\n", HardErrorMessage->ValidResponseOptions); - ASSERT(FALSE); - break; - } - - // FIXME: We should not use MessageBox !!!! - DPRINT1("%S\n", szxMessageBody); - MessageBoxResponse = MessageBoxW(0, szxMessageBody, szxCaptionText, responce|MB_ICONERROR|MB_SYSTEMMODAL|MB_SETFOREGROUND); - - RtlFreeHeap (RtlGetProcessHeap(), 0, szxMessageBody); - RtlFreeHeap (RtlGetProcessHeap(), 0, szxCaptionText); - - switch( MessageBoxResponse ) - { - case IDOK: - HardErrorMessage->Response = ResponseOk; - break; - - case IDCANCEL: - HardErrorMessage->Response = ResponseCancel; - break; - - case IDYES: - HardErrorMessage->Response = ResponseYes; - break; - - case IDNO: - HardErrorMessage->Response = ResponseNo; - break; - - case IDABORT: - HardErrorMessage->Response = ResponseAbort; - break; - - case IDIGNORE: - HardErrorMessage->Response = ResponseIgnore; - break; - - case IDRETRY: - HardErrorMessage->Response = ResponseRetry; - break; - - case 10://IDTRYAGAIN: - HardErrorMessage->Response = ResponseTryAgain; - break; - - case 11://IDCONTINUE: - HardErrorMessage->Response = ResponseContinue; - break; - - default: - ASSERT(FALSE); - break; - } - - return TRUE; -} - - BOOL WINAPI Win32CsrInitialization(PCSRSS_API_DEFINITION *ApiDefinitions, PCSRSS_OBJECT_DEFINITION *ObjectDefinitions, diff --git a/reactos/subsystems/win32/csrss/win32csr/harderror.c b/reactos/subsystems/win32/csrss/win32csr/harderror.c new file mode 100644 index 00000000000..a1b5a5dc5d3 --- /dev/null +++ b/reactos/subsystems/win32/csrss/win32csr/harderror.c @@ -0,0 +1,552 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS system libraries + * FILE: subsys/csrss/win32csr/dllmain.c + * PURPOSE: Initialization + * PROGRAMMERS: Dmitry Philippov (shedon@mail.ru) + * Timo Kreuzer (timo.kreuzer@reactos.org) + */ + +/* INCLUDES ******************************************************************/ + +#define NDEBUG +#include "w32csr.h" +#include +#include + +#define IDTRYAGAIN 10 +#define IDCONTINUE 11 + +/* FUNCTIONS *****************************************************************/ + +static +NTSTATUS +CsrpGetClientFileName( + OUT PUNICODE_STRING ClientFileNameU, + HANDLE hProcess) +{ + PLIST_ENTRY ModuleListHead; + PLIST_ENTRY Entry; + PLDR_DATA_TABLE_ENTRY Module; + PPEB_LDR_DATA Ldr; + PROCESS_BASIC_INFORMATION ClientBasicInfo; + LDR_DATA_TABLE_ENTRY ModuleData; + PVOID ClientDllBase; + NTSTATUS Status; + PPEB Peb; + + /* Initialize string */ + ClientFileNameU->MaximumLength = 0; + ClientFileNameU->Length = 0; + ClientFileNameU->Buffer = NULL; + + /* Query process information */ + Status = NtQueryInformationProcess(hProcess, + ProcessBasicInformation, + &ClientBasicInfo, + sizeof(ClientBasicInfo), + NULL); + if (!NT_SUCCESS(Status)) return Status; + + Peb = ClientBasicInfo.PebBaseAddress; + if (!Peb) return STATUS_UNSUCCESSFUL; + + Status = NtReadVirtualMemory(hProcess, &Peb->Ldr, &Ldr, sizeof(Ldr), NULL); + if (!NT_SUCCESS(Status)) return Status; + + ModuleListHead = &Ldr->InLoadOrderModuleList; + Status = NtReadVirtualMemory(hProcess, + &ModuleListHead->Flink, + &Entry, + sizeof(Entry), + NULL); + if (!NT_SUCCESS(Status)) return Status; + + if (Entry == ModuleListHead) return STATUS_UNSUCCESSFUL; + + Module = CONTAINING_RECORD(Entry, LDR_DATA_TABLE_ENTRY, InLoadOrderLinks); + + Status = NtReadVirtualMemory(hProcess, + Module, + &ModuleData, + sizeof(ModuleData), + NULL); + if (!NT_SUCCESS(Status)) return Status; + + Status = NtReadVirtualMemory(hProcess, + &Peb->ImageBaseAddress, + &ClientDllBase, + sizeof(ClientDllBase), + NULL); + if (!NT_SUCCESS(Status)) return Status; + + if (ClientDllBase != ModuleData.DllBase) return STATUS_UNSUCCESSFUL; + + ClientFileNameU->MaximumLength = ModuleData.BaseDllName.MaximumLength; + ClientFileNameU->Buffer = RtlAllocateHeap(RtlGetProcessHeap(), + HEAP_ZERO_MEMORY, + ClientFileNameU->MaximumLength); + + Status = NtReadVirtualMemory(hProcess, + ModuleData.BaseDllName.Buffer, + ClientFileNameU->Buffer, + ClientFileNameU->MaximumLength, + NULL); + if (!NT_SUCCESS(Status)) + { + RtlFreeHeap(RtlGetProcessHeap(), 0, ClientFileNameU->Buffer); + ClientFileNameU->Buffer = NULL; + ClientFileNameU->MaximumLength = 0; + return Status; + } + + ClientFileNameU->Length = wcslen(ClientFileNameU->Buffer)*sizeof(wchar_t); + DPRINT("ClientFileNameU=\'%wZ\'\n", &ClientFileNameU); + + return STATUS_SUCCESS; +} + + +static +NTSTATUS +CsrpCaptureStringParameters( + OUT PULONG_PTR Parameters, + OUT PULONG SizeOfAllUnicodeStrings, + IN PHARDERROR_MSG HardErrorMessage, + HANDLE hProcess) +{ + ULONG nParam, UnicodeStringParameterMask, Size = 0; + NTSTATUS Status; + UNICODE_STRING TempStringU; + PWSTR ParamString; + + UnicodeStringParameterMask = HardErrorMessage->UnicodeStringParameterMask; + + /* Read all strings from client space */ + for (nParam = 0; + nParam < HardErrorMessage->NumberOfParameters; + nParam++, UnicodeStringParameterMask >>= 1) + { + Parameters[nParam] = 0; + + /* Check if the current parameter is a unicode string */ + if (UnicodeStringParameterMask & 0x01) + { + /* Read the UNICODE_STRING from the process memory */ + Status = NtReadVirtualMemory(hProcess, + (PVOID)HardErrorMessage->Parameters[nParam], + &TempStringU, + sizeof(TempStringU), + NULL); + + if (!NT_SUCCESS(Status)) return Status; + + /* Allocate a buffer for the string */ + ParamString = RtlAllocateHeap(RtlGetProcessHeap(), + HEAP_ZERO_MEMORY, + TempStringU.Length + sizeof(WCHAR)); + + if (!ParamString) + { + DPRINT1("Cannot allocate memory %d\n", TempStringU.Length); + return STATUS_NO_MEMORY; + } + + /* Read the string buffer from the process memory */ + Status = NtReadVirtualMemory(hProcess, + TempStringU.Buffer, + ParamString, + TempStringU.Length, + NULL); + if (!NT_SUCCESS(Status)) + { + DPRINT1("NtReadVirtualMemory failed with code: %lx\n", Status); + RtlFreeHeap(RtlGetProcessHeap(), 0, ParamString); + return Status; + } + + /* Zero terminate the string */ + ParamString[TempStringU.Length / sizeof(WCHAR)] = 0; + DPRINT("ParamString=\'%S\'\n", ParamString); + + Parameters[nParam] = (ULONG_PTR)ParamString; + Size += TempStringU.Length; + } + else + { + /* It's not a unicode string */ + Parameters[nParam] = HardErrorMessage->Parameters[nParam]; + } + } + + *SizeOfAllUnicodeStrings = Size; + return STATUS_SUCCESS; +} + +static +VOID +CsrpFreeStringParameters( + IN OUT PULONG_PTR Parameters, + IN PHARDERROR_MSG HardErrorMessage) +{ + ULONG nParam, UnicodeStringParameterMask; + + UnicodeStringParameterMask = HardErrorMessage->UnicodeStringParameterMask; + + /* Loop all parameters */ + for (nParam = 0; + nParam < HardErrorMessage->NumberOfParameters; + nParam++, UnicodeStringParameterMask >>= 1) + { + /* Check if the current parameter is a string */ + if (UnicodeStringParameterMask & 0x01) + { + /* Free the string buffer */ + RtlFreeHeap(RtlGetProcessHeap(), 0, (PVOID)Parameters[nParam]); + } + } +} + + +static +NTSTATUS +CsrpFormatMessages( + OUT PUNICODE_STRING TextStringU, + OUT PUNICODE_STRING CaptionStringU, + IN PULONG_PTR Parameters, + IN ULONG SizeOfStrings, + IN PHARDERROR_MSG Message, + IN HANDLE hProcess) +{ + NTSTATUS Status; + UNICODE_STRING FileNameU, TempStringU, FormatU; + ANSI_STRING FormatA; + PRTL_MESSAGE_RESOURCE_ENTRY MessageResource; + PWSTR FormatString; + ULONG Size; + + /* Get the file name of the client process */ + CsrpGetClientFileName(&FileNameU, hProcess); + + /* Check if we have a file name */ + if (!FileNameU.Buffer) + { + /* No, use system */ + RtlInitUnicodeString(&FileNameU, L"System"); + } + + /* Get text string of the error code */ + Status = RtlFindMessage(GetModuleHandleW(L"ntdll"), + (ULONG_PTR)RT_MESSAGETABLE, + LANG_NEUTRAL, + Message->Status, + &MessageResource); + + if (NT_SUCCESS(Status)) + { + if (MessageResource->Flags) + { + RtlInitUnicodeString(&FormatU, (PWSTR)MessageResource->Text); + FormatA.Buffer = NULL; + } + else + { + RtlInitAnsiString(&FormatA, MessageResource->Text); + RtlAnsiStringToUnicodeString(&FormatU, &FormatA, TRUE); + } + } + else + { + /* Fall back to hardcoded value */ + RtlInitUnicodeString(&FormatU, L"Unknown Hard Error"); + FormatA.Buffer = NULL; + } + + FormatString = FormatU.Buffer; + + /* Check whether a caption exists */ + if (FormatString[0] == L'{') + { + /* Set caption start */ + TempStringU.Buffer = ++FormatString; + + /* Get size of the caption */ + for (Size = 0; *FormatString != 0 && *FormatString != L'}'; Size++) + FormatString++; + + /* Skip '}', '\r', '\n' */ + FormatString += 3; + + TempStringU.Length = Size * sizeof(WCHAR); + TempStringU.MaximumLength = TempStringU.Length; + } + else + { + /* FIXME: Set string based on severity */ + RtlInitUnicodeString(&TempStringU, L"Application Error"); + } + + /* Calculate buffer length for the caption */ + CaptionStringU->MaximumLength = FileNameU.Length + TempStringU.Length + + 4 * sizeof(WCHAR); + + /* Allocate a buffer for the caption */ + CaptionStringU->Buffer = RtlAllocateHeap(RtlGetProcessHeap(), + HEAP_ZERO_MEMORY, + CaptionStringU->MaximumLength); + + /* Append the file name, seperator and the caption text */ + CaptionStringU->Length = 0; + RtlAppendUnicodeStringToString(CaptionStringU, &FileNameU); + RtlAppendUnicodeToString(CaptionStringU, L" - "); + RtlAppendUnicodeStringToString(CaptionStringU, &TempStringU); + + /* Zero terminate the buffer */ + CaptionStringU->Buffer[CaptionStringU->Length] = 0; + + /* Free the file name buffer */ + RtlFreeUnicodeString(&FileNameU); + + /* Check if this is an exception message */ + if (Message->Status == STATUS_UNHANDLED_EXCEPTION) + { + /* Handle special cases */ + if (Parameters[0] == STATUS_ACCESS_VIOLATION) + { + Parameters[0] = Parameters[1]; + Parameters[1] = Parameters[3]; + if (Parameters[2]) Parameters[2] = (ULONG_PTR)L"written"; + else Parameters[2] = (ULONG_PTR)L"read"; + MessageResource = NULL; + } + else if (Parameters[0] == STATUS_IN_PAGE_ERROR) + { + Parameters[0] = Parameters[1]; + Parameters[1] = Parameters[3]; + MessageResource = NULL; + } + else + { + /* Fall back to hardcoded value */ + Parameters[2] = Parameters[1]; + Parameters[1] = Parameters[0]; + Parameters[0] = (ULONG_PTR)L"unknown software exception"; + } + + if (!MessageResource) + { + /* Get text string of the exception code */ + Status = RtlFindMessage(GetModuleHandleW(L"ntdll"), + (ULONG_PTR)RT_MESSAGETABLE, + LANG_NEUTRAL, + Parameters[0], + &MessageResource); + + if (NT_SUCCESS(Status)) + { + if (FormatA.Buffer) RtlFreeUnicodeString(&FormatU); + + if (MessageResource->Flags) + { + RtlInitUnicodeString(&FormatU, (PWSTR)MessageResource->Text); + FormatA.Buffer = NULL; + } + else + { + RtlInitAnsiString(&FormatA, MessageResource->Text); + RtlAnsiStringToUnicodeString(&FormatU, &FormatA, TRUE); + } + } + else + { + /* Fall back to hardcoded value */ + Parameters[2] = Parameters[1]; + Parameters[1] = Parameters[0]; + Parameters[0] = (ULONG_PTR)L"unknown software exception"; + } + } + } + + /* Calculate length of text buffer */ + TextStringU->MaximumLength = wcslen(FormatString) * sizeof(WCHAR) + + SizeOfStrings + 42 * sizeof(WCHAR); + + /* Allocate a buffer for the text */ + TextStringU->Buffer = RtlAllocateHeap(RtlGetProcessHeap(), + HEAP_ZERO_MEMORY, + TextStringU->MaximumLength); + + /* Wrap in SEH to protect from invalid string parameters */ + _SEH2_TRY + { + /* Print the string into the buffer */ + StringCbPrintfW(TextStringU->Buffer, + TextStringU->MaximumLength, + FormatString, + Parameters[0], + Parameters[1], + Parameters[2], + Parameters[3], + Parameters[4]); + Status = STATUS_SUCCESS; + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + /* Set error and free buffers */ + Status = _SEH2_GetExceptionCode(); + RtlFreeHeap(RtlGetProcessHeap(), 0, TextStringU->Buffer); + RtlFreeHeap(RtlGetProcessHeap(), 0, CaptionStringU->Buffer); + } + _SEH2_END + + if (NT_SUCCESS(Status)) + { + TextStringU->Length = wcslen(TextStringU->Buffer) * sizeof(WCHAR); + } + + if (FormatA.Buffer) RtlFreeUnicodeString(&FormatU); + + return Status; +} + +static +ULONG +CsrpMessageBox( + PWSTR Text, + PWSTR Caption, + ULONG ValidResponseOptions, + ULONG Severity) +{ + ULONG Type, MessageBoxResponse; + + /* Set the message box type */ + switch (ValidResponseOptions) + { + case OptionAbortRetryIgnore: + Type = MB_ABORTRETRYIGNORE; + break; + case OptionOk: + Type = MB_OK; + break; + case OptionOkCancel: + Type = MB_OKCANCEL; + break; + case OptionRetryCancel: + Type = MB_RETRYCANCEL; + break; + case OptionYesNo: + Type = MB_YESNO; + break; + case OptionYesNoCancel: + Type = MB_YESNOCANCEL; + break; + case OptionShutdownSystem: + Type = MB_RETRYCANCEL; // FIXME??? + break; + /* Anything else is invalid */ + default: + return ResponseNotHandled; + } + + /* Set severity */ + if (Severity == STATUS_SEVERITY_INFORMATIONAL) Type |= MB_ICONINFORMATION; + else if (Severity == STATUS_SEVERITY_WARNING) Type |= MB_ICONWARNING; + else if (Severity == STATUS_SEVERITY_ERROR) Type |= MB_ICONERROR; + + Type |= MB_SYSTEMMODAL | MB_SETFOREGROUND; + + DPRINT("Text = '%S', Caption = '%S', Severity = %d, Type = 0x%lx\n", + Text, Caption, Severity, Type); + + /* Display a message box */ + MessageBoxResponse = MessageBoxW(0, Text, Caption, Type); + + /* Return response value */ + switch (MessageBoxResponse) + { + case IDOK: return ResponseOk; + case IDCANCEL: return ResponseCancel; + case IDYES: return ResponseYes; + case IDNO: return ResponseNo; + case IDABORT: return ResponseAbort; + case IDIGNORE: return ResponseIgnore; + case IDRETRY: return ResponseRetry; + case IDTRYAGAIN: return ResponseTryAgain; + case IDCONTINUE: return ResponseContinue; + } + + return ResponseNotHandled; +} + +BOOL +WINAPI +Win32CsrHardError( + IN PCSRSS_PROCESS_DATA ProcessData, + IN PHARDERROR_MSG Message) +{ + ULONG_PTR Parameters[MAXIMUM_HARDERROR_PARAMETERS]; + OBJECT_ATTRIBUTES ObjectAttributes; + UNICODE_STRING TextU, CaptionU; + NTSTATUS Status; + HANDLE hProcess; + ULONG Size; + + /* Default to not handled */ + Message->Response = ResponseNotHandled; + + /* Make sure we don't have too many parameters */ + if (Message->NumberOfParameters > MAXIMUM_HARDERROR_PARAMETERS) + Message->NumberOfParameters = MAXIMUM_HARDERROR_PARAMETERS; + + /* Initialize object attributes */ + InitializeObjectAttributes(&ObjectAttributes, NULL, 0, NULL, NULL); + + /* Open client process */ + Status = NtOpenProcess(&hProcess, + PROCESS_VM_READ | PROCESS_QUERY_INFORMATION, + &ObjectAttributes, + &Message->h.ClientId); + + if (!NT_SUCCESS(Status)) + { + DPRINT1("NtOpenProcess failed with code: %lx\n", Status); + return FALSE; + } + + /* Capture all string parameters from the process memory */ + Status = CsrpCaptureStringParameters(Parameters, &Size, Message, hProcess); + if (!NT_SUCCESS(Status)) + { + NtClose(hProcess); + return FALSE; + } + + /* Format the caption and message box text */ + Status = CsrpFormatMessages(&TextU, + &CaptionU, + Parameters, + Size, + Message, + hProcess); + + /* Cleanup */ + CsrpFreeStringParameters(Parameters, Message); + NtClose(hProcess); + + if (!NT_SUCCESS(Status)) + { + return FALSE; + } + + /* Display the message box */ + Message->Response = CsrpMessageBox(TextU.Buffer, + CaptionU.Buffer, + Message->ValidResponseOptions, + (ULONG)Message->Status >> 30); + + RtlFreeUnicodeString(&TextU); + RtlFreeUnicodeString(&CaptionU); + + return TRUE; +} + diff --git a/reactos/subsystems/win32/csrss/win32csr/w32csr.h b/reactos/subsystems/win32/csrss/win32csr/w32csr.h index f6f0f4e649c..5ecc378a7c7 100644 --- a/reactos/subsystems/win32/csrss/win32csr/w32csr.h +++ b/reactos/subsystems/win32/csrss/win32csr/w32csr.h @@ -35,4 +35,11 @@ /* shared header with console.dll */ #include "console.h" + +BOOL +WINAPI +Win32CsrHardError( + IN PCSRSS_PROCESS_DATA ProcessData, + IN PHARDERROR_MSG Message); + /* EOF */ diff --git a/reactos/subsystems/win32/csrss/win32csr/win32csr.rbuild b/reactos/subsystems/win32/csrss/win32csr/win32csr.rbuild index 7a14f63f806..eec81fcba60 100644 --- a/reactos/subsystems/win32/csrss/win32csr/win32csr.rbuild +++ b/reactos/subsystems/win32/csrss/win32csr/win32csr.rbuild @@ -14,6 +14,7 @@ advapi32 win32ksys psapi + pseh w32csr.h alias.c conio.c @@ -21,6 +22,7 @@ dllmain.c exitros.c guiconsole.c + harderror.c tuiconsole.c appswitch.c win32csr.rc From 770cc844b035d859ca1a6e85b3fb649c7439183a Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Mon, 26 Apr 2010 04:18:11 +0000 Subject: [PATCH 059/131] [NTOSKRNL] - Revert r46682 - The NULL terminator is not supposed to be included in the length - Fixes corruption when printing the symbolic link svn path=/trunk/; revision=47028 --- reactos/ntoskrnl/io/iomgr/deviface.c | 1 - 1 file changed, 1 deletion(-) diff --git a/reactos/ntoskrnl/io/iomgr/deviface.c b/reactos/ntoskrnl/io/iomgr/deviface.c index 114e308c4a8..59eddeb898c 100644 --- a/reactos/ntoskrnl/io/iomgr/deviface.c +++ b/reactos/ntoskrnl/io/iomgr/deviface.c @@ -1055,7 +1055,6 @@ IoRegisterDeviceInterface(IN PDEVICE_OBJECT PhysicalDeviceObject, RtlAppendUnicodeStringToString(SymbolicLinkName, ReferenceString); } SymbolicLinkName->Buffer[SymbolicLinkName->Length/sizeof(WCHAR)] = L'\0'; - SymbolicLinkName->Length += sizeof(WCHAR); /* Write symbolic link name in registry */ SymbolicLinkName->Buffer[1] = '\\'; From 540e5b6f31a5d212bbb9396de997d260931c88b5 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Mon, 26 Apr 2010 04:54:25 +0000 Subject: [PATCH 060/131] [NTOSKRNL] - Create a helper function named OpenRegistryHandlesFromSymbolicLink which opens handles to various paths associated with a symbolic link - Store the Linked value in IoSetDeviceInterfaceState - Implement checking if an interface is enabled by reading the Linked value - Interfaces reported from IoGetDeviceInterfaces are only active ones now (unless the caller explicitly says that they want disabled ones too) svn path=/trunk/; revision=47029 --- reactos/ntoskrnl/io/iomgr/deviface.c | 292 +++++++++++++++++++++++++-- 1 file changed, 280 insertions(+), 12 deletions(-) diff --git a/reactos/ntoskrnl/io/iomgr/deviface.c b/reactos/ntoskrnl/io/iomgr/deviface.c index 59eddeb898c..8a8db7a843f 100644 --- a/reactos/ntoskrnl/io/iomgr/deviface.c +++ b/reactos/ntoskrnl/io/iomgr/deviface.c @@ -20,6 +20,180 @@ static PWCHAR BaseKeyString = L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\DeviceClasses\\"; +static +NTSTATUS +OpenRegistryHandlesFromSymbolicLink(IN PUNICODE_STRING SymbolicLinkName, + IN ACCESS_MASK DesiredAccess, + IN OPTIONAL PHANDLE GuidKey, + IN OPTIONAL PHANDLE DeviceKey, + IN OPTIONAL PHANDLE InstanceKey) +{ + OBJECT_ATTRIBUTES ObjectAttributes; + WCHAR PathBuffer[MAX_PATH]; + UNICODE_STRING BaseKeyU; + UNICODE_STRING GuidString, SubKeyName, ReferenceString; + PWCHAR StartPosition, EndPosition; + HANDLE ClassesKey; + PHANDLE GuidKeyRealP, DeviceKeyRealP, InstanceKeyRealP; + HANDLE GuidKeyReal, DeviceKeyReal, InstanceKeyReal; + NTSTATUS Status; + + SubKeyName.Buffer = NULL; + + if (GuidKey != NULL) + GuidKeyRealP = GuidKey; + else + GuidKeyRealP = &GuidKeyReal; + + if (DeviceKey != NULL) + DeviceKeyRealP = DeviceKey; + else + DeviceKeyRealP = &DeviceKeyReal; + + if (InstanceKey != NULL) + InstanceKeyRealP = InstanceKey; + else + InstanceKeyRealP = &InstanceKeyReal; + + *GuidKeyRealP = INVALID_HANDLE_VALUE; + *DeviceKeyRealP = INVALID_HANDLE_VALUE; + *InstanceKeyRealP = INVALID_HANDLE_VALUE; + + BaseKeyU.Buffer = PathBuffer; + BaseKeyU.Length = 0; + BaseKeyU.MaximumLength = MAX_PATH * sizeof(WCHAR); + + RtlAppendUnicodeToString(&BaseKeyU, BaseKeyString); + + /* Open the DeviceClasses key */ + InitializeObjectAttributes(&ObjectAttributes, + &BaseKeyU, + OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, + NULL, + NULL); + Status = ZwOpenKey(&ClassesKey, + DesiredAccess | KEY_ENUMERATE_SUB_KEYS, + &ObjectAttributes); + if (!NT_SUCCESS(Status)) + { + DPRINT1("Failed to open %wZ\n", &BaseKeyU); + goto cleanup; + } + + StartPosition = wcschr(SymbolicLinkName->Buffer, L'{'); + EndPosition = wcschr(SymbolicLinkName->Buffer, L'}'); + if (!StartPosition || !EndPosition || StartPosition > EndPosition) + { + DPRINT1("Bad symbolic link: %wZ\n", SymbolicLinkName); + return STATUS_INVALID_PARAMETER_1; + } + GuidString.Buffer = StartPosition; + GuidString.MaximumLength = GuidString.Length = (USHORT)((ULONG_PTR)(EndPosition + 1) - (ULONG_PTR)StartPosition); + + InitializeObjectAttributes(&ObjectAttributes, + &GuidString, + OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, + ClassesKey, + NULL); + Status = ZwOpenKey(GuidKeyRealP, + DesiredAccess | KEY_ENUMERATE_SUB_KEYS, + &ObjectAttributes); + ZwClose(ClassesKey); + if (!NT_SUCCESS(Status)) + { + DPRINT1("Failed to open %wZ%wZ (%x)\n", &BaseKeyU, &GuidString, Status); + goto cleanup; + } + + SubKeyName.Buffer = ExAllocatePool(PagedPool, SymbolicLinkName->Length); + if (!SubKeyName.Buffer) + { + Status = STATUS_INSUFFICIENT_RESOURCES; + goto cleanup; + } + SubKeyName.MaximumLength = SymbolicLinkName->Length; + SubKeyName.Length = 0; + + RtlAppendUnicodeStringToString(&SubKeyName, + SymbolicLinkName); + + SubKeyName.Buffer[0] = L'#'; + SubKeyName.Buffer[1] = L'#'; + SubKeyName.Buffer[2] = L'?'; + SubKeyName.Buffer[3] = L'#'; + + ReferenceString.Buffer = wcsrchr(SubKeyName.Buffer, '\\'); + if (ReferenceString.Buffer != NULL) + { + ReferenceString.Buffer[0] = L'#'; + + SubKeyName.Length = ReferenceString.Buffer - SubKeyName.Buffer; + ReferenceString.Length = SymbolicLinkName->Length - SubKeyName.Length; + } + else + { + RtlInitUnicodeString(&ReferenceString, L"#"); + } + + InitializeObjectAttributes(&ObjectAttributes, + &SubKeyName, + OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, + *GuidKeyRealP, + NULL); + Status = ZwOpenKey(DeviceKeyRealP, + DesiredAccess | KEY_ENUMERATE_SUB_KEYS, + &ObjectAttributes); + if (!NT_SUCCESS(Status)) + { + DPRINT1("Failed to open %wZ%wZ\\%wZ\n", &BaseKeyU, &GuidString, &SubKeyName); + goto cleanup; + } + + InitializeObjectAttributes(&ObjectAttributes, + &ReferenceString, + OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, + *DeviceKeyRealP, + NULL); + Status = ZwOpenKey(InstanceKeyRealP, + DesiredAccess, + &ObjectAttributes); + if (!NT_SUCCESS(Status)) + { + DPRINT1("Failed to open %wZ%wZ\\%wZ%\\%wZ (%x)\n", &BaseKeyU, &GuidString, &SubKeyName, &ReferenceString, Status); + goto cleanup; + } + + Status = STATUS_SUCCESS; + +cleanup: + if (SubKeyName.Buffer != NULL) + ExFreePool(SubKeyName.Buffer); + + if (NT_SUCCESS(Status)) + { + if (!GuidKey) + ZwClose(*GuidKeyRealP); + + if (!DeviceKey) + ZwClose(*DeviceKeyRealP); + + if (!InstanceKey) + ZwClose(*InstanceKeyRealP); + } + else + { + if (*GuidKeyRealP != INVALID_HANDLE_VALUE) + ZwClose(*GuidKeyRealP); + + if (*DeviceKeyRealP != INVALID_HANDLE_VALUE) + ZwClose(*DeviceKeyRealP); + + if (*InstanceKeyRealP != INVALID_HANDLE_VALUE) + ZwClose(*InstanceKeyRealP); + } + + return Status; +} /*++ * @name IoOpenDeviceInterfaceRegistryKey * @unimplemented @@ -395,10 +569,11 @@ IoGetDeviceInterfaces(IN CONST GUID *InterfaceClassGuid, PKEY_BASIC_INFORMATION DeviceBi = NULL; PKEY_BASIC_INFORMATION ReferenceBi = NULL; PKEY_VALUE_PARTIAL_INFORMATION bip = NULL; + PKEY_VALUE_PARTIAL_INFORMATION PartialInfo; UNICODE_STRING KeyName; OBJECT_ATTRIBUTES ObjectAttributes; BOOLEAN FoundRightPDO = FALSE; - ULONG i = 0, j, Size; + ULONG i = 0, j, Size, NeededLength, ActualLength, LinkedValue; UNICODE_STRING ReturnBuffer = { 0, 0, NULL }; NTSTATUS Status; @@ -552,7 +727,6 @@ IoGetDeviceInterfaces(IN CONST GUID *InterfaceClassGuid, /* We have to check if the interface is enabled, by * reading the Linked value in the Control subkey */ -#if 0 InitializeObjectAttributes( &ObjectAttributes, &Control, @@ -572,17 +746,63 @@ IoGetDeviceInterfaces(IN CONST GUID *InterfaceClassGuid, } else if (!NT_SUCCESS(Status)) { - DPRINT("ZwOpenKey() failed with status 0x%08lx\n", Status); + DPRINT1("ZwOpenKey() failed with status 0x%08lx\n", Status); + goto cleanup; + } + + RtlInitUnicodeString(&KeyName, L"Linked"); + Status = ZwQueryValueKey(ControlKey, + &KeyName, + KeyValuePartialInformation, + NULL, + 0, + &NeededLength); + if (Status == STATUS_BUFFER_TOO_SMALL) + { + ActualLength = NeededLength; + PartialInfo = ExAllocatePool(NonPagedPool, ActualLength); + if (!PartialInfo) + { + Status = STATUS_INSUFFICIENT_RESOURCES; + goto cleanup; + } + + Status = ZwQueryValueKey(ControlKey, + &KeyName, + KeyValuePartialInformation, + PartialInfo, + ActualLength, + &NeededLength); + if (!NT_SUCCESS(Status)) + { + DPRINT1("ZwQueryValueKey #2 failed (%x)\n", Status); + ExFreePool(PartialInfo); + goto cleanup; + } + + if (PartialInfo->Type != REG_DWORD || PartialInfo->DataLength != sizeof(ULONG)) + { + DPRINT1("Bad registry read\n"); + ExFreePool(PartialInfo); + goto cleanup; + } + + RtlCopyMemory(&LinkedValue, + PartialInfo->Data, + PartialInfo->DataLength); + + ExFreePool(PartialInfo); + if (LinkedValue == 0) + { + /* This interface isn't active */ + goto NextReferenceString; + } + } + else + { + DPRINT1("ZwQueryValueKey #1 failed (%x)\n", Status); goto cleanup; } -#endif - /* FIXME: Read the Linked value - * If it doesn't exist => ERROR - * If it is not a REG_DWORD or Size != sizeof(ULONG) => ERROR - * If its value is 0, go to NextReferenceString - * At the moment, do as if it is active... - */ - DPRINT1("Checking if device is enabled is not implemented yet!\n"); } /* Read the SymbolicLink string and add it into SymbolicLinkList */ @@ -1118,7 +1338,10 @@ IoSetDeviceInterfaceState(IN PUNICODE_STRING SymbolicLinkName, PWCHAR EndPosition; NTSTATUS Status; LPCGUID EventGuid; - + HANDLE InstanceHandle, ControlHandle; + UNICODE_STRING KeyName; + OBJECT_ATTRIBUTES ObjectAttributes; + ULONG LinkedValue; if (SymbolicLinkName == NULL) return STATUS_INVALID_PARAMETER_1; @@ -1140,6 +1363,51 @@ IoSetDeviceInterfaceState(IN PUNICODE_STRING SymbolicLinkName, SymLink.Buffer = SymbolicLinkName->Buffer; SymLink.MaximumLength = SymLink.Length = (USHORT)((ULONG_PTR)(EndPosition + 1) - (ULONG_PTR)SymLink.Buffer); DPRINT("IoSetDeviceInterfaceState('%wZ', %d)\n", SymbolicLinkName, Enable); + + Status = OpenRegistryHandlesFromSymbolicLink(SymbolicLinkName, + KEY_CREATE_SUB_KEY, + NULL, + NULL, + &InstanceHandle); + if (!NT_SUCCESS(Status)) + return Status; + + RtlInitUnicodeString(&KeyName, L"Control"); + InitializeObjectAttributes(&ObjectAttributes, + &KeyName, + OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, + InstanceHandle, + NULL); + Status = ZwCreateKey(&ControlHandle, + KEY_SET_VALUE, + &ObjectAttributes, + 0, + NULL, + REG_OPTION_VOLATILE, + NULL); + ZwClose(InstanceHandle); + if (!NT_SUCCESS(Status)) + { + DPRINT1("Failed to create the Control subkey\n"); + return Status; + } + + LinkedValue = (Enable ? 1 : 0); + + RtlInitUnicodeString(&KeyName, L"Linked"); + Status = ZwSetValueKey(ControlHandle, + &KeyName, + 0, + REG_DWORD, + &LinkedValue, + sizeof(ULONG)); + ZwClose(ControlHandle); + if (!NT_SUCCESS(Status)) + { + DPRINT1("Failed to write the Linked value\n"); + return Status; + } + /* Get pointer to the PDO */ Status = IoGetDeviceObjectPointer( &SymLink, From 224b244395ef928d4dbd4807d3b1d12c824461f4 Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Mon, 26 Apr 2010 09:37:08 +0000 Subject: [PATCH 061/131] - Fix file type description svn path=/trunk/; revision=47030 --- reactos/boot/bootdata/hivecls_arm.inf | 2 +- reactos/boot/bootdata/hivecls_i386.inf | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/boot/bootdata/hivecls_arm.inf b/reactos/boot/bootdata/hivecls_arm.inf index a39f33f76f5..4651412d315 100644 --- a/reactos/boot/bootdata/hivecls_arm.inf +++ b/reactos/boot/bootdata/hivecls_arm.inf @@ -41,7 +41,7 @@ HKCR,"rtffile\shell\open\command","",0x00020000,"%SystemRoot%\system32\wordpad.e HKCR,".386","",0x00000000,"vxdfile" HKCR,".vxd","",0x00000000,"vxdfile" HKCR,"vxdfile","",0x00000000,"Virtual Device Driver" -HKCR,"vxdfile","FriendlyTypeName",0x00020000,"@%SystemRoot%\system32\shell32.dll,-156" +HKCR,"vxdfile","FriendlyTypeName",0x00020000,"@%SystemRoot%\system32\shell32.dll,-157" ; Animated Cursors HKCR,".ani","",0x00000000,"anifile" diff --git a/reactos/boot/bootdata/hivecls_i386.inf b/reactos/boot/bootdata/hivecls_i386.inf index 350fe18e010..147f80d81de 100644 --- a/reactos/boot/bootdata/hivecls_i386.inf +++ b/reactos/boot/bootdata/hivecls_i386.inf @@ -41,7 +41,7 @@ HKCR,"rtffile\shell\open\command","",0x00020000,"%SystemRoot%\system32\wordpad.e HKCR,".386","",0x00000000,"vxdfile" HKCR,".vxd","",0x00000000,"vxdfile" HKCR,"vxdfile","",0x00000000,"Virtual Device Driver" -HKCR,"vxdfile","FriendlyTypeName",0x00020000,"@%SystemRoot%\system32\shell32.dll,-156" +HKCR,"vxdfile","FriendlyTypeName",0x00020000,"@%SystemRoot%\system32\shell32.dll,-157" ; Animated Cursors HKCR,".ani","",0x00000000,"anifile" From dd0a9f5d5f1fb149b5a798df122ba1fd6f1359d6 Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Mon, 26 Apr 2010 10:38:15 +0000 Subject: [PATCH 062/131] [SHELL32] - Rewrite enumerating folder options file type dialog svn path=/trunk/; revision=47031 --- reactos/dll/win32/shell32/folder_options.c | 267 ++++++++++++++++++--- reactos/dll/win32/shell32/shresdef.h | 2 + 2 files changed, 233 insertions(+), 36 deletions(-) diff --git a/reactos/dll/win32/shell32/folder_options.c b/reactos/dll/win32/shell32/folder_options.c index c862c79855b..0e8ccbfe93d 100644 --- a/reactos/dll/win32/shell32/folder_options.c +++ b/reactos/dll/win32/shell32/folder_options.c @@ -41,6 +41,13 @@ typedef struct WCHAR szFolderPath[MAX_PATH]; }FOLDER_PROPERTIES_CONTEXT, *PFOLDER_PROPERTIES_CONTEXT; +typedef struct +{ + WCHAR FileExtension[30]; + WCHAR FileDescription[100]; + WCHAR ClassKey[MAX_PATH]; +}FOLDER_FILE_TYPE_ENTRY, *PFOLDER_FILE_TYPE_ENTRY; + typedef struct { LPCWSTR szKeyName; @@ -155,20 +162,49 @@ InitializeFileTypesListCtrlColumns(HWND hDlgCtrl) RECT clientRect; LVCOLUMNW col; WCHAR szName[50]; + DWORD dwStyle; + int columnSize = 140; + if (!LoadStringW(shell32_hInstance, IDS_COLUMN_EXTENSION, szName, sizeof(szName) / sizeof(WCHAR))) - szName[0] = 0; + { + /* default to english */ + wcscpy(szName, L"Extensions"); + } + + /* make sure its null terminated */ szName[(sizeof(szName)/sizeof(WCHAR))-1] = 0; GetClientRect(hDlgCtrl, &clientRect); ZeroMemory(&col, sizeof(LV_COLUMN)); - col.mask = LVCF_SUBITEM | LVCF_WIDTH | LVCF_FMT; - col.iSubItem = 0; - col.pszText = szName; - col.fmt = LVCFMT_LEFT; - col.cx = (clientRect.right - clientRect.left) - GetSystemMetrics(SM_CXVSCROLL); + columnSize = 140; //FIXME + col.iSubItem = 0; + col.mask = LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM | LVCF_FMT; + col.fmt = LVCFMT_FIXED_WIDTH; + col.cx = columnSize | LVCFMT_LEFT; + col.cchTextMax = wcslen(szName); + col.pszText = szName; (void)SendMessageW(hDlgCtrl, LVM_INSERTCOLUMNW, 0, (LPARAM)&col); + + if (!LoadStringW(shell32_hInstance, IDS_FILE_TYPES, szName, sizeof(szName) / sizeof(WCHAR))) + { + /* default to english */ + wcscpy(szName, L"FileTypes"); + } + + col.iSubItem = 1; + col.cx = clientRect.right - clientRect.left - columnSize; + col.cchTextMax = wcslen(szName); + col.pszText = szName; + (void)SendMessageW(hDlgCtrl, LVM_INSERTCOLUMNW, 1, (LPARAM)&col); + + /* set full select style */ + dwStyle = (DWORD) SendMessage(hDlgCtrl, LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0); + dwStyle = dwStyle | LVS_EX_FULLROWSELECT; + SendMessage(hDlgCtrl, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, dwStyle); + } + INT FindItem(HWND hDlgCtrl, WCHAR * ItemName) { @@ -181,45 +217,105 @@ FindItem(HWND hDlgCtrl, WCHAR * ItemName) } VOID -InsertFileType(HWND hDlgCtrl, WCHAR * szName, DWORD Size, INT iItem) +InsertFileType(HWND hDlgCtrl, WCHAR * szName, PINT iItem, WCHAR * szFile) { - WCHAR szPath[100]; + PFOLDER_FILE_TYPE_ENTRY Entry; HKEY hKey; LVITEMW lvItem; DWORD dwSize; - if (FindItem(hDlgCtrl, szName) != -1) + if (szName[0] != L'.') + { + /* FIXME handle URL protocol handlers */ + return; + } + + /* allocate file type entry */ + Entry = (PFOLDER_FILE_TYPE_ENTRY)HeapAlloc(GetProcessHeap(), 0, sizeof(FOLDER_FILE_TYPE_ENTRY)); + + if (!Entry) return; - wcscpy(szPath, szName); - /* get the name */ - if (RegOpenKeyExW(HKEY_CLASSES_ROOT, szPath, 0, KEY_READ, &hKey) == ERROR_SUCCESS) + /* open key */ + if (RegOpenKeyExW(HKEY_CLASSES_ROOT, szName, 0, KEY_READ, &hKey) != ERROR_SUCCESS) + return; + + /* FIXME check for duplicates */ + + /* query for the default key */ + dwSize = sizeof(Entry->ClassKey); + if (RegQueryValueExW(hKey, NULL, NULL, NULL, (LPBYTE)Entry->ClassKey, &dwSize) != ERROR_SUCCESS) { - if (RegLoadMUIStringW(hKey, L"FriendlyTypeName", szName, Size, NULL, 0, NULL) != ERROR_SUCCESS) - { - dwSize = Size; - if (RegQueryValueExW(hKey, NULL, NULL, NULL, (LPBYTE)szName, &dwSize) != ERROR_SUCCESS) - { - wcscpy(szName, szPath); - } - } - RegCloseKey(hKey); - szName[(Size/sizeof(WCHAR))-1] = 0; + /* no link available */ + Entry->ClassKey[0] = 0; + } + + if (Entry->ClassKey[0]) + { + HKEY hTemp; + /* try open linked key */ + if (RegOpenKeyExW(HKEY_CLASSES_ROOT, Entry->ClassKey, 0, KEY_READ, &hTemp) == ERROR_SUCCESS) + { + /* use linked key */ + RegCloseKey(hKey); + hKey = hTemp; + } + } + + /* read friendly type name */ + if (RegLoadMUIStringW(hKey, L"FriendlyTypeName", Entry->FileDescription, sizeof(Entry->FileDescription), NULL, 0, NULL) != ERROR_SUCCESS) + { + /* read file description */ + dwSize = sizeof(Entry->FileDescription); + Entry->FileDescription[0] = 0; + + /* read default key */ + RegQueryValueExW(hKey, NULL, NULL, NULL, (LPBYTE)Entry->FileDescription, &dwSize); + } + + /* close key */ + RegCloseKey(hKey); + + /* convert extension to upper case */ + wcscpy(Entry->FileExtension, szName); + _wcsupr(Entry->FileExtension); + + if (!Entry->FileDescription[0]) + { + /* construct default 'FileExtensionFile' */ + wcscpy(Entry->FileDescription, &Entry->FileExtension[1]); + wcscat(Entry->FileDescription, L" "); + wcscat(Entry->FileDescription, szFile); } - wcscat(szPath, L"\\shell"); ZeroMemory(&lvItem, sizeof(LVITEMW)); - lvItem.mask = LVIF_TEXT | LVIF_PARAM | LVIF_STATE; - lvItem.state = LVIS_SELECTED; - lvItem.pszText = szName; - lvItem.iItem = iItem; + lvItem.mask = LVIF_TEXT | LVIF_PARAM; + lvItem.iSubItem = 0; + lvItem.pszText = &Entry->FileExtension[1]; + lvItem.iItem = *iItem; + lvItem.lParam = (LPARAM)Entry; + (void)SendMessageW(hDlgCtrl, LVM_INSERTITEMW, 0, (LPARAM)&lvItem); - if (RegOpenKeyExW(HKEY_CLASSES_ROOT, szPath, 0, KEY_READ, &hKey) == ERROR_SUCCESS) - { - lvItem.lParam = 0; - (void)SendMessageW(hDlgCtrl, LVM_INSERTITEMW, 0, (LPARAM)&lvItem); - RegCloseKey(hKey); - } + ZeroMemory(&lvItem, sizeof(LVITEMW)); + lvItem.mask = LVIF_TEXT; + lvItem.pszText = Entry->FileDescription; + lvItem.iItem = *iItem; + lvItem.iSubItem = 1; + + (void)SendMessageW(hDlgCtrl, LVM_SETITEMW, 0, (LPARAM)&lvItem); + (*iItem)++; +} + +int +CALLBACK +ListViewCompareProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) +{ + PFOLDER_FILE_TYPE_ENTRY Entry1, Entry2; + + Entry1 = (PFOLDER_FILE_TYPE_ENTRY)lParam1; + Entry2 = (PFOLDER_FILE_TYPE_ENTRY)lParam2; + + return wcsicmp(Entry1->FileExtension, Entry2->FileExtension); } BOOL @@ -228,22 +324,70 @@ InitializeFileTypesListCtrl(HWND hwndDlg) HWND hDlgCtrl; DWORD dwIndex = 0; WCHAR szName[50]; + WCHAR szFile[100]; DWORD dwName; + LVITEMW lvItem; INT iItem = 0; hDlgCtrl = GetDlgItem(hwndDlg, 14000); InitializeFileTypesListCtrlColumns(hDlgCtrl); + szFile[0] = 0; + if (!LoadStringW(shell32_hInstance, IDS_SHV_COLUMN1, szFile, sizeof(szFile) / sizeof(WCHAR))) + { + /* default to english */ + wcscpy(szFile, L"File"); + } + szFile[(sizeof(szFile)/sizeof(WCHAR))-1] = 0; + dwName = sizeof(szName) / sizeof(WCHAR); while(RegEnumKeyExW(HKEY_CLASSES_ROOT, dwIndex++, szName, &dwName, NULL, NULL, NULL, NULL) == ERROR_SUCCESS) { - InsertFileType(hDlgCtrl, szName, sizeof(szName), iItem++); + InsertFileType(hDlgCtrl, szName, &iItem, szFile); dwName = sizeof(szName) / sizeof(WCHAR); } + + /* sort list */ + ListView_SortItems(hDlgCtrl, ListViewCompareProc, NULL); + + /* select first item */ + ZeroMemory(&lvItem, sizeof(LVITEMW)); + lvItem.mask = LVIF_STATE; + lvItem.stateMask = (UINT)-1; + lvItem.state = LVIS_FOCUSED|LVIS_SELECTED; + lvItem.iItem = 0; + (void)SendMessageW(hDlgCtrl, LVM_SETITEMW, 0, (LPARAM)&lvItem); + return TRUE; } +PFOLDER_FILE_TYPE_ENTRY +FindSelectedItem( + HWND hDlgCtrl) +{ + UINT Count, Index; + LVITEMW lvItem; + + Count = ListView_GetItemCount(hDlgCtrl); + + for (Index = 0; Index < Count; Index++) + { + ZeroMemory(&lvItem, sizeof(LVITEM)); + lvItem.mask = LVIF_PARAM | LVIF_STATE; + lvItem.iItem = Index; + lvItem.stateMask = (UINT)-1; + + if (ListView_GetItem(hDlgCtrl, &lvItem)) + { + if (lvItem.state & LVIS_SELECTED) + return (PFOLDER_FILE_TYPE_ENTRY)lvItem.lParam; + } + } + + return NULL; +} + INT_PTR CALLBACK @@ -251,14 +395,65 @@ FolderOptionsFileTypesDlg( HWND hwndDlg, UINT uMsg, WPARAM wParam, - LPARAM lParam -) + LPARAM lParam) { + LPNMLISTVIEW lppl; + LVITEMW lvItem; + WCHAR Buffer[200], FormatBuffer[100]; + PFOLDER_FILE_TYPE_ENTRY pItem; + OPENASINFO Info; + switch(uMsg) { case WM_INITDIALOG: InitializeFileTypesListCtrl(hwndDlg); return TRUE; + case WM_COMMAND: + switch(LOWORD(wParam)) + { + case 14006: + pItem = FindSelectedItem(GetDlgItem(hwndDlg, 14000)); + if (pItem) + { + Info.oaifInFlags = OAIF_ALLOW_REGISTRATION | OAIF_REGISTER_EXT; + Info.pcszClass = pItem->FileExtension; + SHOpenWithDialog(hwndDlg, &Info); + } + break; + } + + break; + case WM_NOTIFY: + lppl = (LPNMLISTVIEW) lParam; + + if (lppl->hdr.code == LVN_ITEMCHANGING) + { + ZeroMemory(&lvItem, sizeof(LVITEM)); + lvItem.mask = LVIF_PARAM; + lvItem.iItem = lppl->iItem; + if (!SendMessageW(lppl->hdr.hwndFrom, LVM_GETITEMW, 0, (LPARAM)&lvItem)) + return TRUE; + + pItem = (PFOLDER_FILE_TYPE_ENTRY)lvItem.lParam; + if (!pItem) + return TRUE; + + if (!(lppl->uOldState & LVIS_FOCUSED) && (lppl->uNewState & LVIS_FOCUSED)) + { + /* new focused item */ + if (!LoadStringW(shell32_hInstance, IDS_FILE_DETAILS, FormatBuffer, sizeof(FormatBuffer) / sizeof(WCHAR))) + { + /* use default english format string */ + wcscpy(FormatBuffer, L"Details for '%s' extension"); + } + + /* format buffer */ + swprintf(Buffer, FormatBuffer, &pItem->FileExtension[1]); + /* update dialog */ + SendDlgItemMessageW(hwndDlg, 14003, WM_SETTEXT, 0, (LPARAM)Buffer); + } + } + break; } return FALSE; diff --git a/reactos/dll/win32/shell32/shresdef.h b/reactos/dll/win32/shell32/shresdef.h index 981e17ff9ce..93b50975a07 100644 --- a/reactos/dll/win32/shell32/shresdef.h +++ b/reactos/dll/win32/shell32/shresdef.h @@ -139,6 +139,8 @@ #define IDS_SYS_FILE 171 #define IDS_EMPTY_BITBUCKET 172 #define IDS_SHLEXEC_NOASSOC 173 +#define IDS_FILE_TYPES 174 +#define IDS_FILE_DETAILS 175 #define IDS_OPEN_VERB 300 #define IDS_RUNAS_VERB 301 From 5367720c4643affab0dc0ef92553e7e8e7402dd2 Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Mon, 26 Apr 2010 12:26:31 +0000 Subject: [PATCH 063/131] [SHELL32] - Let explorer open control panel class folder when there is no default action See issue #4916 for more details. svn path=/trunk/; revision=47032 --- reactos/dll/win32/shell32/shfldr_cpanel.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/dll/win32/shell32/shfldr_cpanel.c b/reactos/dll/win32/shell32/shfldr_cpanel.c index bf8b632f8eb..a7b92512462 100644 --- a/reactos/dll/win32/shell32/shfldr_cpanel.c +++ b/reactos/dll/win32/shell32/shfldr_cpanel.c @@ -1017,8 +1017,8 @@ ExecuteAppletFromCLSID(LPOLESTR pOleStr) dwSize = sizeof(szCmd); if (RegGetValueW(HKEY_CLASSES_ROOT, szBuffer, NULL, RRF_RT_REG_SZ, &dwType, (PVOID)szCmd, &dwSize) != ERROR_SUCCESS) { - ERR("RegGetValueW failed with %u\n", GetLastError()); - return E_FAIL; + wcscpy(szCmd, L"%SystemRoot%\\Explorer.exe ::"); + wcscat(szCmd, pOleStr); } #if 0 From 3c0e9dffbce683938eb9a871bfb295d2da993ffa Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Mon, 26 Apr 2010 12:56:32 +0000 Subject: [PATCH 064/131] [SHELL32] - Assume it is an empty cdrom drive when there is no root mounted See issue #2977 for more details. svn path=/trunk/; revision=47033 --- reactos/dll/win32/shell32/folders.c | 1 + 1 file changed, 1 insertion(+) diff --git a/reactos/dll/win32/shell32/folders.c b/reactos/dll/win32/shell32/folders.c index 9b71506a5f0..d1a6c672b51 100644 --- a/reactos/dll/win32/shell32/folders.c +++ b/reactos/dll/win32/shell32/folders.c @@ -257,6 +257,7 @@ IExtractIconW* IExtractIconW_Constructor(LPCITEMIDLIST pidl) case DRIVE_CDROM: icon_idx = IDI_SHELL_CDROM; break; case DRIVE_REMOTE: icon_idx = IDI_SHELL_NETDRIVE; break; case DRIVE_RAMDISK: icon_idx = IDI_SHELL_RAMDISK; break; + case DRIVE_NO_ROOT_DIR: icon_idx = IDI_SHELL_CDROM; break; } } From 5fb94ed717ef8664cbd47401758c2dfaf7c0c813 Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Mon, 26 Apr 2010 13:58:09 +0000 Subject: [PATCH 065/131] [USERINIT] - Fix Startup Folder - ShellExecuteEx needs lots of work See issue #4568 for more details. svn path=/trunk/; revision=47035 --- reactos/base/system/userinit/userinit.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/reactos/base/system/userinit/userinit.c b/reactos/base/system/userinit/userinit.c index 9eb96029318..81027d4b964 100644 --- a/reactos/base/system/userinit/userinit.c +++ b/reactos/base/system/userinit/userinit.c @@ -212,7 +212,6 @@ StartAutoApplications( WARN("FindFirstFile(%s) failed with error %lu\n", debugstr_w(szPath), GetLastError()); return; } - szPath[len] = L'\0'; do { @@ -220,9 +219,10 @@ StartAutoApplications( { memset(&ExecInfo, 0x0, sizeof(SHELLEXECUTEINFOW)); ExecInfo.cbSize = sizeof(ExecInfo); + wcscpy(&szPath[len+1], findData.cFileName); ExecInfo.lpVerb = L"open"; - ExecInfo.lpFile = findData.cFileName; - ExecInfo.lpDirectory = szPath; + ExecInfo.lpFile = szPath; + ExecInfo.lpDirectory = NULL; TRACE("Executing %s in directory %s\n", debugstr_w(findData.cFileName), debugstr_w(szPath)); ShellExecuteExW(&ExecInfo); From 17557bfabd053b17b3a92f5b7c55084adb82613f Mon Sep 17 00:00:00 2001 From: Giannis Adamopoulos Date: Mon, 26 Apr 2010 13:58:46 +0000 Subject: [PATCH 066/131] [win32k] -rename w32k.h to win32k.h and win32k.h to win32kp.h svn path=/trunk/; revision=47036 --- reactos/subsystems/win32/win32k/dib/dib.c | 2 +- reactos/subsystems/win32/win32k/dib/dib16bpp.c | 2 +- reactos/subsystems/win32/win32k/dib/dib1bpp.c | 2 +- reactos/subsystems/win32/win32k/dib/dib24bpp.c | 2 +- reactos/subsystems/win32/win32k/dib/dib24bppc.c | 2 +- reactos/subsystems/win32/win32k/dib/dib32bpp.c | 2 +- reactos/subsystems/win32/win32k/dib/dib32bppc.c | 2 +- reactos/subsystems/win32/win32k/dib/dib4bpp.c | 2 +- reactos/subsystems/win32/win32k/dib/dib8bpp.c | 2 +- reactos/subsystems/win32/win32k/dib/floodfill.c | 2 +- reactos/subsystems/win32/win32k/dib/stretchblt.c | 2 +- reactos/subsystems/win32/win32k/eng/alphablend.c | 2 +- reactos/subsystems/win32/win32k/eng/bitblt.c | 2 +- reactos/subsystems/win32/win32k/eng/clip.c | 2 +- reactos/subsystems/win32/win32k/eng/copybits.c | 2 +- reactos/subsystems/win32/win32k/eng/debug.c | 2 +- reactos/subsystems/win32/win32k/eng/device.c | 2 +- reactos/subsystems/win32/win32k/eng/driverobj.c | 2 +- reactos/subsystems/win32/win32k/eng/engbrush.c | 2 +- reactos/subsystems/win32/win32k/eng/engevent.c | 2 +- reactos/subsystems/win32/win32k/eng/engmisc.c | 2 +- reactos/subsystems/win32/win32k/eng/engwindow.c | 2 +- reactos/subsystems/win32/win32k/eng/error.c | 2 +- reactos/subsystems/win32/win32k/eng/float.c | 2 +- reactos/subsystems/win32/win32k/eng/gradient.c | 2 +- reactos/subsystems/win32/win32k/eng/lineto.c | 2 +- reactos/subsystems/win32/win32k/eng/mapping.c | 2 +- reactos/subsystems/win32/win32k/eng/mem.c | 2 +- reactos/subsystems/win32/win32k/eng/mouse.c | 2 +- reactos/subsystems/win32/win32k/eng/paint.c | 2 +- reactos/subsystems/win32/win32k/eng/perfcnt.c | 2 +- reactos/subsystems/win32/win32k/eng/semaphor.c | 2 +- reactos/subsystems/win32/win32k/eng/sort.c | 2 +- reactos/subsystems/win32/win32k/eng/stretchblt.c | 2 +- reactos/subsystems/win32/win32k/eng/string.c | 2 +- reactos/subsystems/win32/win32k/eng/surface.c | 2 +- reactos/subsystems/win32/win32k/eng/transblt.c | 2 +- reactos/subsystems/win32/win32k/eng/xlate.c | 2 +- reactos/subsystems/win32/win32k/include/{win32k.h => win32kp.h} | 0 reactos/subsystems/win32/win32k/ldr/loader.c | 2 +- reactos/subsystems/win32/win32k/main/dllmain.c | 2 +- reactos/subsystems/win32/win32k/misc/copy.c | 2 +- reactos/subsystems/win32/win32k/misc/driver.c | 2 +- reactos/subsystems/win32/win32k/misc/err.c | 2 +- reactos/subsystems/win32/win32k/misc/file.c | 2 +- reactos/subsystems/win32/win32k/misc/math.c | 2 +- reactos/subsystems/win32/win32k/misc/registry.c | 2 +- reactos/subsystems/win32/win32k/misc/rtlstr.c | 2 +- reactos/subsystems/win32/win32k/misc/usrheap.c | 2 +- reactos/subsystems/win32/win32k/ntddraw/d3d.c | 2 +- reactos/subsystems/win32/win32k/ntddraw/dd.c | 2 +- reactos/subsystems/win32/win32k/ntddraw/ddraw.c | 2 +- reactos/subsystems/win32/win32k/ntddraw/ddsurf.c | 2 +- reactos/subsystems/win32/win32k/ntddraw/dvp.c | 2 +- reactos/subsystems/win32/win32k/ntddraw/dxeng.c | 2 +- reactos/subsystems/win32/win32k/ntddraw/eng.c | 2 +- reactos/subsystems/win32/win32k/ntddraw/mocomp.c | 2 +- reactos/subsystems/win32/win32k/ntuser/accelerator.c | 2 +- reactos/subsystems/win32/win32k/ntuser/callback.c | 2 +- reactos/subsystems/win32/win32k/ntuser/callproc.c | 2 +- reactos/subsystems/win32/win32k/ntuser/caret.c | 2 +- reactos/subsystems/win32/win32k/ntuser/class.c | 2 +- reactos/subsystems/win32/win32k/ntuser/clipboard.c | 2 +- reactos/subsystems/win32/win32k/ntuser/csr.c | 2 +- reactos/subsystems/win32/win32k/ntuser/cursoricon.c | 2 +- reactos/subsystems/win32/win32k/ntuser/defwnd.c | 2 +- reactos/subsystems/win32/win32k/ntuser/desktop.c | 2 +- reactos/subsystems/win32/win32k/ntuser/display.c | 2 +- reactos/subsystems/win32/win32k/ntuser/event.c | 2 +- reactos/subsystems/win32/win32k/ntuser/focus.c | 2 +- reactos/subsystems/win32/win32k/ntuser/guicheck.c | 2 +- reactos/subsystems/win32/win32k/ntuser/hook.c | 2 +- reactos/subsystems/win32/win32k/ntuser/hotkey.c | 2 +- reactos/subsystems/win32/win32k/ntuser/input.c | 2 +- reactos/subsystems/win32/win32k/ntuser/kbdlayout.c | 2 +- reactos/subsystems/win32/win32k/ntuser/keyboard.c | 2 +- reactos/subsystems/win32/win32k/ntuser/menu.c | 2 +- reactos/subsystems/win32/win32k/ntuser/message.c | 2 +- reactos/subsystems/win32/win32k/ntuser/metric.c | 2 +- reactos/subsystems/win32/win32k/ntuser/misc.c | 2 +- reactos/subsystems/win32/win32k/ntuser/monitor.c | 2 +- reactos/subsystems/win32/win32k/ntuser/msgqueue.c | 2 +- reactos/subsystems/win32/win32k/ntuser/ntstubs.c | 2 +- reactos/subsystems/win32/win32k/ntuser/ntuser.c | 2 +- reactos/subsystems/win32/win32k/ntuser/object.c | 2 +- reactos/subsystems/win32/win32k/ntuser/painting.c | 2 +- reactos/subsystems/win32/win32k/ntuser/prop.c | 2 +- reactos/subsystems/win32/win32k/ntuser/scrollbar.c | 2 +- reactos/subsystems/win32/win32k/ntuser/session.c | 2 +- reactos/subsystems/win32/win32k/ntuser/simplecall.c | 2 +- reactos/subsystems/win32/win32k/ntuser/sysparams.c | 2 +- reactos/subsystems/win32/win32k/ntuser/timer.c | 2 +- reactos/subsystems/win32/win32k/ntuser/useratom.c | 2 +- reactos/subsystems/win32/win32k/ntuser/vis.c | 2 +- reactos/subsystems/win32/win32k/ntuser/windc.c | 2 +- reactos/subsystems/win32/win32k/ntuser/window.c | 2 +- reactos/subsystems/win32/win32k/ntuser/winpos.c | 2 +- reactos/subsystems/win32/win32k/ntuser/winsta.c | 2 +- reactos/subsystems/win32/win32k/objects/arc.c | 2 +- reactos/subsystems/win32/win32k/objects/bezier.c | 2 +- reactos/subsystems/win32/win32k/objects/bitblt.c | 2 +- reactos/subsystems/win32/win32k/objects/bitmaps.c | 2 +- reactos/subsystems/win32/win32k/objects/brush.c | 2 +- reactos/subsystems/win32/win32k/objects/cliprgn.c | 2 +- reactos/subsystems/win32/win32k/objects/coord.c | 2 +- reactos/subsystems/win32/win32k/objects/dcattr.c | 2 +- reactos/subsystems/win32/win32k/objects/dclife.c | 2 +- reactos/subsystems/win32/win32k/objects/dcobjs.c | 2 +- reactos/subsystems/win32/win32k/objects/dcstate.c | 2 +- reactos/subsystems/win32/win32k/objects/dcutil.c | 2 +- reactos/subsystems/win32/win32k/objects/device.c | 2 +- reactos/subsystems/win32/win32k/objects/dibobj.c | 2 +- reactos/subsystems/win32/win32k/objects/drawing.c | 2 +- reactos/subsystems/win32/win32k/objects/fillshap.c | 2 +- reactos/subsystems/win32/win32k/objects/font.c | 2 +- reactos/subsystems/win32/win32k/objects/freetype.c | 2 +- reactos/subsystems/win32/win32k/objects/gdibatch.c | 2 +- reactos/subsystems/win32/win32k/objects/gdiobj.c | 2 +- reactos/subsystems/win32/win32k/objects/icm.c | 2 +- reactos/subsystems/win32/win32k/objects/line.c | 2 +- reactos/subsystems/win32/win32k/objects/metafile.c | 2 +- reactos/subsystems/win32/win32k/objects/palette.c | 2 +- reactos/subsystems/win32/win32k/objects/path.c | 2 +- reactos/subsystems/win32/win32k/objects/pen.c | 2 +- reactos/subsystems/win32/win32k/objects/polyfill.c | 2 +- reactos/subsystems/win32/win32k/objects/print.c | 2 +- reactos/subsystems/win32/win32k/objects/rect.c | 2 +- reactos/subsystems/win32/win32k/objects/region.c | 2 +- reactos/subsystems/win32/win32k/objects/stockobj.c | 2 +- reactos/subsystems/win32/win32k/objects/text.c | 2 +- reactos/subsystems/win32/win32k/objects/wingl.c | 2 +- reactos/subsystems/win32/win32k/objects/xformobj.c | 2 +- reactos/subsystems/win32/win32k/pch.h | 2 +- reactos/subsystems/win32/win32k/stubs/stubs.c | 2 +- reactos/subsystems/win32/win32k/stubs/umpdstubs.c | 2 +- reactos/subsystems/win32/win32k/{w32k.h => win32k.h} | 0 reactos/tools/gendib/gendib.c | 2 +- 137 files changed, 135 insertions(+), 135 deletions(-) rename reactos/subsystems/win32/win32k/include/{win32k.h => win32kp.h} (100%) rename reactos/subsystems/win32/win32k/{w32k.h => win32k.h} (100%) diff --git a/reactos/subsystems/win32/win32k/dib/dib.c b/reactos/subsystems/win32/win32k/dib/dib.c index c0e8bbf26bf..30591d3d27d 100644 --- a/reactos/subsystems/win32/win32k/dib/dib.c +++ b/reactos/subsystems/win32/win32k/dib/dib.c @@ -7,7 +7,7 @@ */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/dib/dib16bpp.c b/reactos/subsystems/win32/win32k/dib/dib16bpp.c index cbc0129903b..de569716586 100644 --- a/reactos/subsystems/win32/win32k/dib/dib16bpp.c +++ b/reactos/subsystems/win32/win32k/dib/dib16bpp.c @@ -8,7 +8,7 @@ * Gregor Anich */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/dib/dib1bpp.c b/reactos/subsystems/win32/win32k/dib/dib1bpp.c index 35ee87047b6..ebea73d3326 100644 --- a/reactos/subsystems/win32/win32k/dib/dib1bpp.c +++ b/reactos/subsystems/win32/win32k/dib/dib1bpp.c @@ -6,7 +6,7 @@ * PROGRAMMERS: Jason Filby */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/dib/dib24bpp.c b/reactos/subsystems/win32/win32k/dib/dib24bpp.c index 2106d9b4e1d..3810024a6f8 100644 --- a/reactos/subsystems/win32/win32k/dib/dib24bpp.c +++ b/reactos/subsystems/win32/win32k/dib/dib24bpp.c @@ -8,7 +8,7 @@ * Gregor Anich */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/dib/dib24bppc.c b/reactos/subsystems/win32/win32k/dib/dib24bppc.c index 79a71c9b4aa..ca09cee518b 100644 --- a/reactos/subsystems/win32/win32k/dib/dib24bppc.c +++ b/reactos/subsystems/win32/win32k/dib/dib24bppc.c @@ -7,7 +7,7 @@ * Magnus Olsen */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/dib/dib32bpp.c b/reactos/subsystems/win32/win32k/dib/dib32bpp.c index edf3f63aa35..6c4704b1c96 100644 --- a/reactos/subsystems/win32/win32k/dib/dib32bpp.c +++ b/reactos/subsystems/win32/win32k/dib/dib32bpp.c @@ -8,7 +8,7 @@ * Gregor Anich */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/dib/dib32bppc.c b/reactos/subsystems/win32/win32k/dib/dib32bppc.c index da86647367f..859e9507e0e 100644 --- a/reactos/subsystems/win32/win32k/dib/dib32bppc.c +++ b/reactos/subsystems/win32/win32k/dib/dib32bppc.c @@ -7,7 +7,7 @@ * Magnus Olsen */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/dib/dib4bpp.c b/reactos/subsystems/win32/win32k/dib/dib4bpp.c index 4ae4f8b8f47..1626b8e8397 100644 --- a/reactos/subsystems/win32/win32k/dib/dib4bpp.c +++ b/reactos/subsystems/win32/win32k/dib/dib4bpp.c @@ -7,7 +7,7 @@ */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/dib/dib8bpp.c b/reactos/subsystems/win32/win32k/dib/dib8bpp.c index cfbdb0a2db8..95b09cbb73c 100644 --- a/reactos/subsystems/win32/win32k/dib/dib8bpp.c +++ b/reactos/subsystems/win32/win32k/dib/dib8bpp.c @@ -8,7 +8,7 @@ * Gregor Anich */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/dib/floodfill.c b/reactos/subsystems/win32/win32k/dib/floodfill.c index 21bd2c306ab..c31c262d9fc 100644 --- a/reactos/subsystems/win32/win32k/dib/floodfill.c +++ b/reactos/subsystems/win32/win32k/dib/floodfill.c @@ -6,7 +6,7 @@ * PROGRAMMER: Gregor Schneider, */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/dib/stretchblt.c b/reactos/subsystems/win32/win32k/dib/stretchblt.c index 579014ace91..b6d479d8703 100644 --- a/reactos/subsystems/win32/win32k/dib/stretchblt.c +++ b/reactos/subsystems/win32/win32k/dib/stretchblt.c @@ -8,7 +8,7 @@ * Gregor Schneider */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/eng/alphablend.c b/reactos/subsystems/win32/win32k/eng/alphablend.c index 30ba88fd386..34b2930cd68 100644 --- a/reactos/subsystems/win32/win32k/eng/alphablend.c +++ b/reactos/subsystems/win32/win32k/eng/alphablend.c @@ -6,7 +6,7 @@ * PROGRAMER: Jason Filby */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/eng/bitblt.c b/reactos/subsystems/win32/win32k/eng/bitblt.c index 3c65aaa6862..afac0e8a7d3 100644 --- a/reactos/subsystems/win32/win32k/eng/bitblt.c +++ b/reactos/subsystems/win32/win32k/eng/bitblt.c @@ -9,7 +9,7 @@ * 2/10/1999: Created */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/eng/clip.c b/reactos/subsystems/win32/win32k/eng/clip.c index d9bfe0e0960..0235d0f27b7 100644 --- a/reactos/subsystems/win32/win32k/eng/clip.c +++ b/reactos/subsystems/win32/win32k/eng/clip.c @@ -27,7 +27,7 @@ * 21/8/1999: Created */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/eng/copybits.c b/reactos/subsystems/win32/win32k/eng/copybits.c index 1cabfb955f2..73a477dd13d 100644 --- a/reactos/subsystems/win32/win32k/eng/copybits.c +++ b/reactos/subsystems/win32/win32k/eng/copybits.c @@ -26,7 +26,7 @@ * 8/18/1999: Created */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/eng/debug.c b/reactos/subsystems/win32/win32k/eng/debug.c index 91b39820db1..9e2e7226a0e 100644 --- a/reactos/subsystems/win32/win32k/eng/debug.c +++ b/reactos/subsystems/win32/win32k/eng/debug.c @@ -27,7 +27,7 @@ * 11/7/1999: Created */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/eng/device.c b/reactos/subsystems/win32/win32k/eng/device.c index 301497afcc7..0e51ea05eef 100644 --- a/reactos/subsystems/win32/win32k/eng/device.c +++ b/reactos/subsystems/win32/win32k/eng/device.c @@ -7,7 +7,7 @@ * Timo Kreuzer */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/eng/driverobj.c b/reactos/subsystems/win32/win32k/eng/driverobj.c index 900812eeabd..cb6ff389450 100644 --- a/reactos/subsystems/win32/win32k/eng/driverobj.c +++ b/reactos/subsystems/win32/win32k/eng/driverobj.c @@ -8,7 +8,7 @@ /** Includes ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/eng/engbrush.c b/reactos/subsystems/win32/win32k/eng/engbrush.c index 1337e298024..3c3d1d7b151 100644 --- a/reactos/subsystems/win32/win32k/eng/engbrush.c +++ b/reactos/subsystems/win32/win32k/eng/engbrush.c @@ -7,7 +7,7 @@ * Timo Kreuzer */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/eng/engevent.c b/reactos/subsystems/win32/win32k/eng/engevent.c index e978786bdb3..d38c32ae2d1 100644 --- a/reactos/subsystems/win32/win32k/eng/engevent.c +++ b/reactos/subsystems/win32/win32k/eng/engevent.c @@ -8,7 +8,7 @@ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/eng/engmisc.c b/reactos/subsystems/win32/win32k/eng/engmisc.c index bb65ef6e733..af544c95d55 100644 --- a/reactos/subsystems/win32/win32k/eng/engmisc.c +++ b/reactos/subsystems/win32/win32k/eng/engmisc.c @@ -18,7 +18,7 @@ */ /* $Id$ */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/eng/engwindow.c b/reactos/subsystems/win32/win32k/eng/engwindow.c index aed25f0e8b8..5628610e58e 100644 --- a/reactos/subsystems/win32/win32k/eng/engwindow.c +++ b/reactos/subsystems/win32/win32k/eng/engwindow.c @@ -29,7 +29,7 @@ /* TODO: Check how the WNDOBJ implementation should behave with a driver on windows. */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/eng/error.c b/reactos/subsystems/win32/win32k/eng/error.c index d81b3822d84..d78da06d545 100644 --- a/reactos/subsystems/win32/win32k/eng/error.c +++ b/reactos/subsystems/win32/win32k/eng/error.c @@ -1,4 +1,4 @@ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/eng/float.c b/reactos/subsystems/win32/win32k/eng/float.c index ebee480c728..2ca5fe9b796 100644 --- a/reactos/subsystems/win32/win32k/eng/float.c +++ b/reactos/subsystems/win32/win32k/eng/float.c @@ -28,7 +28,7 @@ /* INCLUDES *****************************************************************/ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/eng/gradient.c b/reactos/subsystems/win32/win32k/eng/gradient.c index 7559b17ddba..c3ef6535c04 100644 --- a/reactos/subsystems/win32/win32k/eng/gradient.c +++ b/reactos/subsystems/win32/win32k/eng/gradient.c @@ -27,7 +27,7 @@ * 3/7/1999: Created */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/eng/lineto.c b/reactos/subsystems/win32/win32k/eng/lineto.c index 049c0a9e79c..a67b47af5b1 100644 --- a/reactos/subsystems/win32/win32k/eng/lineto.c +++ b/reactos/subsystems/win32/win32k/eng/lineto.c @@ -19,7 +19,7 @@ * $Id$ */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/eng/mapping.c b/reactos/subsystems/win32/win32k/eng/mapping.c index 39de58264d1..7e445d7c631 100644 --- a/reactos/subsystems/win32/win32k/eng/mapping.c +++ b/reactos/subsystems/win32/win32k/eng/mapping.c @@ -6,7 +6,7 @@ * PROGRAMER: */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/eng/mem.c b/reactos/subsystems/win32/win32k/eng/mem.c index 3beb023572c..a49e4fe5cab 100644 --- a/reactos/subsystems/win32/win32k/eng/mem.c +++ b/reactos/subsystems/win32/win32k/eng/mem.c @@ -27,7 +27,7 @@ * 3/7/1999: Created */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/eng/mouse.c b/reactos/subsystems/win32/win32k/eng/mouse.c index d96e8dd4ed2..f5f6b2f30ca 100644 --- a/reactos/subsystems/win32/win32k/eng/mouse.c +++ b/reactos/subsystems/win32/win32k/eng/mouse.c @@ -9,7 +9,7 @@ */ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/eng/paint.c b/reactos/subsystems/win32/win32k/eng/paint.c index 81d1e67b40c..29cd723d4b0 100644 --- a/reactos/subsystems/win32/win32k/eng/paint.c +++ b/reactos/subsystems/win32/win32k/eng/paint.c @@ -27,7 +27,7 @@ * 3/7/1999: Created */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/eng/perfcnt.c b/reactos/subsystems/win32/win32k/eng/perfcnt.c index e69ff02a921..381abc40c20 100644 --- a/reactos/subsystems/win32/win32k/eng/perfcnt.c +++ b/reactos/subsystems/win32/win32k/eng/perfcnt.c @@ -25,7 +25,7 @@ * PROGRAMER: Ge van Geldorp */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/eng/semaphor.c b/reactos/subsystems/win32/win32k/eng/semaphor.c index 5ef403d8670..d09d4c9022b 100644 --- a/reactos/subsystems/win32/win32k/eng/semaphor.c +++ b/reactos/subsystems/win32/win32k/eng/semaphor.c @@ -1,4 +1,4 @@ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/eng/sort.c b/reactos/subsystems/win32/win32k/eng/sort.c index df6a1dab97a..0b9354bc599 100644 --- a/reactos/subsystems/win32/win32k/eng/sort.c +++ b/reactos/subsystems/win32/win32k/eng/sort.c @@ -18,7 +18,7 @@ */ /* $Id$ */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/eng/stretchblt.c b/reactos/subsystems/win32/win32k/eng/stretchblt.c index ee5711c6d15..932d93d5cb4 100644 --- a/reactos/subsystems/win32/win32k/eng/stretchblt.c +++ b/reactos/subsystems/win32/win32k/eng/stretchblt.c @@ -6,7 +6,7 @@ * PROGRAMER: Jason Filby */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/eng/string.c b/reactos/subsystems/win32/win32k/eng/string.c index 6ab902a1bb9..14cbc5be3bf 100644 --- a/reactos/subsystems/win32/win32k/eng/string.c +++ b/reactos/subsystems/win32/win32k/eng/string.c @@ -1,5 +1,5 @@ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/eng/surface.c b/reactos/subsystems/win32/win32k/eng/surface.c index 5a85d1ac1b6..c081ed51571 100644 --- a/reactos/subsystems/win32/win32k/eng/surface.c +++ b/reactos/subsystems/win32/win32k/eng/surface.c @@ -12,7 +12,7 @@ * refer to \test\microwin\src\engine\devdraw.c for info on correct pixel plotting for various formats */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/eng/transblt.c b/reactos/subsystems/win32/win32k/eng/transblt.c index 4ef59544680..bca22440edd 100644 --- a/reactos/subsystems/win32/win32k/eng/transblt.c +++ b/reactos/subsystems/win32/win32k/eng/transblt.c @@ -27,7 +27,7 @@ * 4/6/2004: Created */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/eng/xlate.c b/reactos/subsystems/win32/win32k/eng/xlate.c index fcdd0b89b4b..27d06846fe8 100644 --- a/reactos/subsystems/win32/win32k/eng/xlate.c +++ b/reactos/subsystems/win32/win32k/eng/xlate.c @@ -6,7 +6,7 @@ * PROGRAMER: Timo Kreuzer (timo.kreuzer@reactos.org) */ -#include +#include #include diff --git a/reactos/subsystems/win32/win32k/include/win32k.h b/reactos/subsystems/win32/win32k/include/win32kp.h similarity index 100% rename from reactos/subsystems/win32/win32k/include/win32k.h rename to reactos/subsystems/win32/win32k/include/win32kp.h diff --git a/reactos/subsystems/win32/win32k/ldr/loader.c b/reactos/subsystems/win32/win32k/ldr/loader.c index 9803c8d4009..50a87560e6a 100644 --- a/reactos/subsystems/win32/win32k/ldr/loader.c +++ b/reactos/subsystems/win32/win32k/ldr/loader.c @@ -20,7 +20,7 @@ * */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/main/dllmain.c b/reactos/subsystems/win32/win32k/main/dllmain.c index 8d106e725a3..040d3cc76ed 100644 --- a/reactos/subsystems/win32/win32k/main/dllmain.c +++ b/reactos/subsystems/win32/win32k/main/dllmain.c @@ -20,7 +20,7 @@ * Entry Point for win32k.sys */ -#include +#include #include #define NDEBUG diff --git a/reactos/subsystems/win32/win32k/misc/copy.c b/reactos/subsystems/win32/win32k/misc/copy.c index 5668ade27b5..a40a5be6ffb 100644 --- a/reactos/subsystems/win32/win32k/misc/copy.c +++ b/reactos/subsystems/win32/win32k/misc/copy.c @@ -1,4 +1,4 @@ -#include "w32k.h" +#include "win32k.h" NTSTATUS _MmCopyFromCaller( PVOID Target, PVOID Source, UINT Bytes ) { NTSTATUS Status = STATUS_SUCCESS; diff --git a/reactos/subsystems/win32/win32k/misc/driver.c b/reactos/subsystems/win32/win32k/misc/driver.c index e713f323e7b..1219f94effa 100644 --- a/reactos/subsystems/win32/win32k/misc/driver.c +++ b/reactos/subsystems/win32/win32k/misc/driver.c @@ -23,7 +23,7 @@ * */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/misc/err.c b/reactos/subsystems/win32/win32k/misc/err.c index c1c66eaac94..b7fcb2cde31 100644 --- a/reactos/subsystems/win32/win32k/misc/err.c +++ b/reactos/subsystems/win32/win32k/misc/err.c @@ -27,7 +27,7 @@ * 06-06-2001 CSH Created */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/misc/file.c b/reactos/subsystems/win32/win32k/misc/file.c index 263ed12e0b7..1e2281aa517 100644 --- a/reactos/subsystems/win32/win32k/misc/file.c +++ b/reactos/subsystems/win32/win32k/misc/file.c @@ -6,7 +6,7 @@ * PROGRAMER: Timo Kreuzer (timo.kreuzer@reactos.org) */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/misc/math.c b/reactos/subsystems/win32/win32k/misc/math.c index 6b4fc0c9013..11ffc1ed847 100644 --- a/reactos/subsystems/win32/win32k/misc/math.c +++ b/reactos/subsystems/win32/win32k/misc/math.c @@ -19,7 +19,7 @@ Boston, MA 02110-1301, USA. */ -#include +#include /* * FIXME! Is there a better algorithm. like FT_MulDiv diff --git a/reactos/subsystems/win32/win32k/misc/registry.c b/reactos/subsystems/win32/win32k/misc/registry.c index f03de06e5f6..fcaefabb62f 100644 --- a/reactos/subsystems/win32/win32k/misc/registry.c +++ b/reactos/subsystems/win32/win32k/misc/registry.c @@ -6,7 +6,7 @@ * PROGRAMER: Timo Kreuzer (timo.kreuzer@reactos.org) */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/misc/rtlstr.c b/reactos/subsystems/win32/win32k/misc/rtlstr.c index 7e1da4b7672..06f8d3eff80 100644 --- a/reactos/subsystems/win32/win32k/misc/rtlstr.c +++ b/reactos/subsystems/win32/win32k/misc/rtlstr.c @@ -9,7 +9,7 @@ /* INCLUDES ******************************************************************/ -#include +#include /* FUNCTIONS *****************************************************************/ VOID diff --git a/reactos/subsystems/win32/win32k/misc/usrheap.c b/reactos/subsystems/win32/win32k/misc/usrheap.c index e8b1908fcfc..c371121c657 100644 --- a/reactos/subsystems/win32/win32k/misc/usrheap.c +++ b/reactos/subsystems/win32/win32k/misc/usrheap.c @@ -17,7 +17,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/ntddraw/d3d.c b/reactos/subsystems/win32/win32k/ntddraw/d3d.c index 8371ff1a882..f30f08cdae9 100644 --- a/reactos/subsystems/win32/win32k/ntddraw/d3d.c +++ b/reactos/subsystems/win32/win32k/ntddraw/d3d.c @@ -13,7 +13,7 @@ * NtGdiDdUnlock and NtGdiDdUnlockD3D ultimately call the same function in dxg.sys */ -#include +#include #include diff --git a/reactos/subsystems/win32/win32k/ntddraw/dd.c b/reactos/subsystems/win32/win32k/ntddraw/dd.c index 9cccbce1ef0..a1207ed33a2 100644 --- a/reactos/subsystems/win32/win32k/ntddraw/dd.c +++ b/reactos/subsystems/win32/win32k/ntddraw/dd.c @@ -8,7 +8,7 @@ * 19/1-2006 Magnus Olsen */ -#include +#include #include /************************************************************************/ diff --git a/reactos/subsystems/win32/win32k/ntddraw/ddraw.c b/reactos/subsystems/win32/win32k/ntddraw/ddraw.c index 3abbd18eed4..19b6931b01b 100644 --- a/reactos/subsystems/win32/win32k/ntddraw/ddraw.c +++ b/reactos/subsystems/win32/win32k/ntddraw/ddraw.c @@ -8,7 +8,7 @@ * 19/1-2006 Magnus Olsen */ -#include +#include #include PGD_DXDDSTARTUPDXGRAPHICS gpfnStartupDxGraphics = NULL; diff --git a/reactos/subsystems/win32/win32k/ntddraw/ddsurf.c b/reactos/subsystems/win32/win32k/ntddraw/ddsurf.c index 388be271343..ae46f887e11 100644 --- a/reactos/subsystems/win32/win32k/ntddraw/ddsurf.c +++ b/reactos/subsystems/win32/win32k/ntddraw/ddsurf.c @@ -8,7 +8,7 @@ * 19/7-2006 Magnus Olsen */ -#include +#include #include /************************************************************************/ diff --git a/reactos/subsystems/win32/win32k/ntddraw/dvp.c b/reactos/subsystems/win32/win32k/ntddraw/dvp.c index de5fe6ad926..a03be0fa30c 100644 --- a/reactos/subsystems/win32/win32k/ntddraw/dvp.c +++ b/reactos/subsystems/win32/win32k/ntddraw/dvp.c @@ -9,7 +9,7 @@ */ -#include +#include #include /************************************************************************/ diff --git a/reactos/subsystems/win32/win32k/ntddraw/dxeng.c b/reactos/subsystems/win32/win32k/ntddraw/dxeng.c index 586c496bdff..58413a584ff 100644 --- a/reactos/subsystems/win32/win32k/ntddraw/dxeng.c +++ b/reactos/subsystems/win32/win32k/ntddraw/dxeng.c @@ -6,7 +6,7 @@ * PROGRAMMERS: Magnus Olsen (magnus@greatlord.com) */ -#include +#include #include HSEMAPHORE ghsemShareDevLock = NULL; diff --git a/reactos/subsystems/win32/win32k/ntddraw/eng.c b/reactos/subsystems/win32/win32k/ntddraw/eng.c index 675b5965710..f55525a6b51 100644 --- a/reactos/subsystems/win32/win32k/ntddraw/eng.c +++ b/reactos/subsystems/win32/win32k/ntddraw/eng.c @@ -11,7 +11,7 @@ */ -#include +#include #include /************************************************************************/ diff --git a/reactos/subsystems/win32/win32k/ntddraw/mocomp.c b/reactos/subsystems/win32/win32k/ntddraw/mocomp.c index 08c3f9488c4..bc80584faa9 100644 --- a/reactos/subsystems/win32/win32k/ntddraw/mocomp.c +++ b/reactos/subsystems/win32/win32k/ntddraw/mocomp.c @@ -9,7 +9,7 @@ */ -#include +#include #include /************************************************************************/ diff --git a/reactos/subsystems/win32/win32k/ntuser/accelerator.c b/reactos/subsystems/win32/win32k/ntuser/accelerator.c index 544ecedcfc7..b59f1d1b7de 100644 --- a/reactos/subsystems/win32/win32k/ntuser/accelerator.c +++ b/reactos/subsystems/win32/win32k/ntuser/accelerator.c @@ -49,7 +49,7 @@ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/ntuser/callback.c b/reactos/subsystems/win32/win32k/ntuser/callback.c index 9a8de743c54..eb4db061d10 100644 --- a/reactos/subsystems/win32/win32k/ntuser/callback.c +++ b/reactos/subsystems/win32/win32k/ntuser/callback.c @@ -14,7 +14,7 @@ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/ntuser/callproc.c b/reactos/subsystems/win32/win32k/ntuser/callproc.c index 866bac1afbf..dc8496dd431 100644 --- a/reactos/subsystems/win32/win32k/ntuser/callproc.c +++ b/reactos/subsystems/win32/win32k/ntuser/callproc.c @@ -9,7 +9,7 @@ */ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/ntuser/caret.c b/reactos/subsystems/win32/win32k/ntuser/caret.c index ee5e33ba565..c75dc05c074 100644 --- a/reactos/subsystems/win32/win32k/ntuser/caret.c +++ b/reactos/subsystems/win32/win32k/ntuser/caret.c @@ -11,7 +11,7 @@ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/ntuser/class.c b/reactos/subsystems/win32/win32k/ntuser/class.c index f1755fecd54..b24b26f4199 100644 --- a/reactos/subsystems/win32/win32k/ntuser/class.c +++ b/reactos/subsystems/win32/win32k/ntuser/class.c @@ -9,7 +9,7 @@ */ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/ntuser/clipboard.c b/reactos/subsystems/win32/win32k/ntuser/clipboard.c index 55032c44e61..a44bbab169a 100644 --- a/reactos/subsystems/win32/win32k/ntuser/clipboard.c +++ b/reactos/subsystems/win32/win32k/ntuser/clipboard.c @@ -7,7 +7,7 @@ * Pablo Borobia */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/ntuser/csr.c b/reactos/subsystems/win32/win32k/ntuser/csr.c index a1e425e629b..9487af53689 100644 --- a/reactos/subsystems/win32/win32k/ntuser/csr.c +++ b/reactos/subsystems/win32/win32k/ntuser/csr.c @@ -7,7 +7,7 @@ * PROGRAMER: Ge van Geldorp (ge@gse.nl) */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/ntuser/cursoricon.c b/reactos/subsystems/win32/win32k/ntuser/cursoricon.c index 6c9532caae9..3fe0211ea53 100644 --- a/reactos/subsystems/win32/win32k/ntuser/cursoricon.c +++ b/reactos/subsystems/win32/win32k/ntuser/cursoricon.c @@ -36,7 +36,7 @@ * CURICON_PROCESS structs starting at CurIcon->ProcessList. */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/ntuser/defwnd.c b/reactos/subsystems/win32/win32k/ntuser/defwnd.c index 2a59f10f94b..f5e2bd1fc1d 100644 --- a/reactos/subsystems/win32/win32k/ntuser/defwnd.c +++ b/reactos/subsystems/win32/win32k/ntuser/defwnd.c @@ -7,7 +7,7 @@ * */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/ntuser/desktop.c b/reactos/subsystems/win32/win32k/ntuser/desktop.c index 0f635d0cb7c..c5d76b215a5 100644 --- a/reactos/subsystems/win32/win32k/ntuser/desktop.c +++ b/reactos/subsystems/win32/win32k/ntuser/desktop.c @@ -10,7 +10,7 @@ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/ntuser/display.c b/reactos/subsystems/win32/win32k/ntuser/display.c index c652e30e45a..561171dedeb 100644 --- a/reactos/subsystems/win32/win32k/ntuser/display.c +++ b/reactos/subsystems/win32/win32k/ntuser/display.c @@ -9,7 +9,7 @@ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/ntuser/event.c b/reactos/subsystems/win32/win32k/ntuser/event.c index 2dc8eae7376..d170983d088 100644 --- a/reactos/subsystems/win32/win32k/ntuser/event.c +++ b/reactos/subsystems/win32/win32k/ntuser/event.c @@ -6,7 +6,7 @@ * PROGRAMER: James Tabor (james.tabor@rectos.org) */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/ntuser/focus.c b/reactos/subsystems/win32/win32k/ntuser/focus.c index 0f39b96674d..90702b41c00 100644 --- a/reactos/subsystems/win32/win32k/ntuser/focus.c +++ b/reactos/subsystems/win32/win32k/ntuser/focus.c @@ -18,7 +18,7 @@ * */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/ntuser/guicheck.c b/reactos/subsystems/win32/win32k/ntuser/guicheck.c index f0ee364f9d8..e3766d8c4b2 100644 --- a/reactos/subsystems/win32/win32k/ntuser/guicheck.c +++ b/reactos/subsystems/win32/win32k/ntuser/guicheck.c @@ -33,7 +33,7 @@ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/ntuser/hook.c b/reactos/subsystems/win32/win32k/ntuser/hook.c index bca944e4ce7..93633370c43 100644 --- a/reactos/subsystems/win32/win32k/ntuser/hook.c +++ b/reactos/subsystems/win32/win32k/ntuser/hook.c @@ -10,7 +10,7 @@ * Copyright (C) 2002 Alexandre Julliard */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/ntuser/hotkey.c b/reactos/subsystems/win32/win32k/ntuser/hotkey.c index c2585f3db7e..4ec1f1b5658 100644 --- a/reactos/subsystems/win32/win32k/ntuser/hotkey.c +++ b/reactos/subsystems/win32/win32k/ntuser/hotkey.c @@ -40,7 +40,7 @@ windows/threads on destops not belonging to WinSta0 to set hotkeys (recieve noti /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/ntuser/input.c b/reactos/subsystems/win32/win32k/ntuser/input.c index 6b02f2d270e..78f8384460e 100644 --- a/reactos/subsystems/win32/win32k/ntuser/input.c +++ b/reactos/subsystems/win32/win32k/ntuser/input.c @@ -10,7 +10,7 @@ /* INCLUDES ******************************************************************/ -#include +#include #include #define NDEBUG diff --git a/reactos/subsystems/win32/win32k/ntuser/kbdlayout.c b/reactos/subsystems/win32/win32k/ntuser/kbdlayout.c index ec07d34a82a..8ee11dc3983 100644 --- a/reactos/subsystems/win32/win32k/ntuser/kbdlayout.c +++ b/reactos/subsystems/win32/win32k/ntuser/kbdlayout.c @@ -12,7 +12,7 @@ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/ntuser/keyboard.c b/reactos/subsystems/win32/win32k/ntuser/keyboard.c index 813137856fc..242147c6659 100644 --- a/reactos/subsystems/win32/win32k/ntuser/keyboard.c +++ b/reactos/subsystems/win32/win32k/ntuser/keyboard.c @@ -28,7 +28,7 @@ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/ntuser/menu.c b/reactos/subsystems/win32/win32k/ntuser/menu.c index 9bdbe026cf8..3b1cd6a740b 100644 --- a/reactos/subsystems/win32/win32k/ntuser/menu.c +++ b/reactos/subsystems/win32/win32k/ntuser/menu.c @@ -9,7 +9,7 @@ */ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/ntuser/message.c b/reactos/subsystems/win32/win32k/ntuser/message.c index 1b244b0e038..01977a089da 100644 --- a/reactos/subsystems/win32/win32k/ntuser/message.c +++ b/reactos/subsystems/win32/win32k/ntuser/message.c @@ -10,7 +10,7 @@ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/ntuser/metric.c b/reactos/subsystems/win32/win32k/ntuser/metric.c index 4519ff811ef..be2b1a10367 100644 --- a/reactos/subsystems/win32/win32k/ntuser/metric.c +++ b/reactos/subsystems/win32/win32k/ntuser/metric.c @@ -9,7 +9,7 @@ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/ntuser/misc.c b/reactos/subsystems/win32/win32k/ntuser/misc.c index 27faa8fc9e3..48ef50b7ae6 100644 --- a/reactos/subsystems/win32/win32k/ntuser/misc.c +++ b/reactos/subsystems/win32/win32k/ntuser/misc.c @@ -8,7 +8,7 @@ * 2003/05/22 Created */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/ntuser/monitor.c b/reactos/subsystems/win32/win32k/ntuser/monitor.c index 072bad97df4..541b3bfeb41 100644 --- a/reactos/subsystems/win32/win32k/ntuser/monitor.c +++ b/reactos/subsystems/win32/win32k/ntuser/monitor.c @@ -27,7 +27,7 @@ /* INCLUDES ******************************************************************/ -#include +#include /* FIXME: find include file for these */ #define MONITORINFOF_PRIMARY 1 diff --git a/reactos/subsystems/win32/win32k/ntuser/msgqueue.c b/reactos/subsystems/win32/win32k/ntuser/msgqueue.c index 2b1fedae85a..4fc8b0e24d8 100644 --- a/reactos/subsystems/win32/win32k/ntuser/msgqueue.c +++ b/reactos/subsystems/win32/win32k/ntuser/msgqueue.c @@ -28,7 +28,7 @@ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/ntuser/ntstubs.c b/reactos/subsystems/win32/win32k/ntuser/ntstubs.c index f9104fe5faa..2430a4df7ac 100644 --- a/reactos/subsystems/win32/win32k/ntuser/ntstubs.c +++ b/reactos/subsystems/win32/win32k/ntuser/ntstubs.c @@ -7,7 +7,7 @@ * REVISION HISTORY: * 04-06-2001 CSH Created */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/ntuser/ntuser.c b/reactos/subsystems/win32/win32k/ntuser/ntuser.c index e51db8eb9a4..569acfdc54c 100644 --- a/reactos/subsystems/win32/win32k/ntuser/ntuser.c +++ b/reactos/subsystems/win32/win32k/ntuser/ntuser.c @@ -9,7 +9,7 @@ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/ntuser/object.c b/reactos/subsystems/win32/win32k/ntuser/object.c index cd5f59101ed..2ccc4356f75 100644 --- a/reactos/subsystems/win32/win32k/ntuser/object.c +++ b/reactos/subsystems/win32/win32k/ntuser/object.c @@ -22,7 +22,7 @@ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/ntuser/painting.c b/reactos/subsystems/win32/win32k/ntuser/painting.c index 66977db106f..ce612a5076a 100644 --- a/reactos/subsystems/win32/win32k/ntuser/painting.c +++ b/reactos/subsystems/win32/win32k/ntuser/painting.c @@ -11,7 +11,7 @@ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/ntuser/prop.c b/reactos/subsystems/win32/win32k/ntuser/prop.c index cf41600c224..c596c0e02a5 100644 --- a/reactos/subsystems/win32/win32k/ntuser/prop.c +++ b/reactos/subsystems/win32/win32k/ntuser/prop.c @@ -27,7 +27,7 @@ */ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/ntuser/scrollbar.c b/reactos/subsystems/win32/win32k/ntuser/scrollbar.c index 065c7ccaeb0..8efd8721d76 100644 --- a/reactos/subsystems/win32/win32k/ntuser/scrollbar.c +++ b/reactos/subsystems/win32/win32k/ntuser/scrollbar.c @@ -10,7 +10,7 @@ */ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/ntuser/session.c b/reactos/subsystems/win32/win32k/ntuser/session.c index 1a8cddc0e49..88e453164cb 100644 --- a/reactos/subsystems/win32/win32k/ntuser/session.c +++ b/reactos/subsystems/win32/win32k/ntuser/session.c @@ -24,7 +24,7 @@ * PROGRAMER: Gunnar */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/ntuser/simplecall.c b/reactos/subsystems/win32/win32k/ntuser/simplecall.c index f0dcc3a755b..77d8fb9d237 100644 --- a/reactos/subsystems/win32/win32k/ntuser/simplecall.c +++ b/reactos/subsystems/win32/win32k/ntuser/simplecall.c @@ -8,7 +8,7 @@ * 2008/03/20 Split from misc.c */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/ntuser/sysparams.c b/reactos/subsystems/win32/win32k/ntuser/sysparams.c index 4768cb0d9a5..c39d06a4894 100644 --- a/reactos/subsystems/win32/win32k/ntuser/sysparams.c +++ b/reactos/subsystems/win32/win32k/ntuser/sysparams.c @@ -11,7 +11,7 @@ // - does setting invalid fonts work? // - save appropriate text metrics -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/ntuser/timer.c b/reactos/subsystems/win32/win32k/ntuser/timer.c index c706805a9c8..863987f689e 100644 --- a/reactos/subsystems/win32/win32k/ntuser/timer.c +++ b/reactos/subsystems/win32/win32k/ntuser/timer.c @@ -11,7 +11,7 @@ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/ntuser/useratom.c b/reactos/subsystems/win32/win32k/ntuser/useratom.c index 61b41648600..ca72f6143d5 100644 --- a/reactos/subsystems/win32/win32k/ntuser/useratom.c +++ b/reactos/subsystems/win32/win32k/ntuser/useratom.c @@ -24,7 +24,7 @@ * PROGRAMER: Filip Navara */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/ntuser/vis.c b/reactos/subsystems/win32/win32k/ntuser/vis.c index f82ed555b72..d82e384cbf2 100644 --- a/reactos/subsystems/win32/win32k/ntuser/vis.c +++ b/reactos/subsystems/win32/win32k/ntuser/vis.c @@ -24,7 +24,7 @@ * PROGRAMMER: Ge van Geldorp (ge@gse.nl) */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/ntuser/windc.c b/reactos/subsystems/win32/win32k/ntuser/windc.c index bde42e1396c..7dd06599a0e 100644 --- a/reactos/subsystems/win32/win32k/ntuser/windc.c +++ b/reactos/subsystems/win32/win32k/ntuser/windc.c @@ -9,7 +9,7 @@ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/ntuser/window.c b/reactos/subsystems/win32/win32k/ntuser/window.c index 4445fff8fed..f95965027bd 100644 --- a/reactos/subsystems/win32/win32k/ntuser/window.c +++ b/reactos/subsystems/win32/win32k/ntuser/window.c @@ -10,7 +10,7 @@ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/ntuser/winpos.c b/reactos/subsystems/win32/win32k/ntuser/winpos.c index 13c58617279..ab45d978c41 100644 --- a/reactos/subsystems/win32/win32k/ntuser/winpos.c +++ b/reactos/subsystems/win32/win32k/ntuser/winpos.c @@ -27,7 +27,7 @@ */ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/ntuser/winsta.c b/reactos/subsystems/win32/win32k/ntuser/winsta.c index a379a2f2655..2d26c8d39b7 100644 --- a/reactos/subsystems/win32/win32k/ntuser/winsta.c +++ b/reactos/subsystems/win32/win32k/ntuser/winsta.c @@ -33,7 +33,7 @@ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/objects/arc.c b/reactos/subsystems/win32/win32k/objects/arc.c index e1bbc89ea65..58393036608 100644 --- a/reactos/subsystems/win32/win32k/objects/arc.c +++ b/reactos/subsystems/win32/win32k/objects/arc.c @@ -1,4 +1,4 @@ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/objects/bezier.c b/reactos/subsystems/win32/win32k/objects/bezier.c index 0071015ebe2..3e20c292590 100644 --- a/reactos/subsystems/win32/win32k/objects/bezier.c +++ b/reactos/subsystems/win32/win32k/objects/bezier.c @@ -18,7 +18,7 @@ */ /* $Id$ */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/objects/bitblt.c b/reactos/subsystems/win32/win32k/objects/bitblt.c index a02d652ce1e..6261ab46697 100644 --- a/reactos/subsystems/win32/win32k/objects/bitblt.c +++ b/reactos/subsystems/win32/win32k/objects/bitblt.c @@ -18,7 +18,7 @@ */ /* $Id: bitmaps.c 28300 2007-08-12 15:20:09Z tkreuzer $ */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/objects/bitmaps.c b/reactos/subsystems/win32/win32k/objects/bitmaps.c index 658b53dbb17..f471a67e502 100644 --- a/reactos/subsystems/win32/win32k/objects/bitmaps.c +++ b/reactos/subsystems/win32/win32k/objects/bitmaps.c @@ -17,7 +17,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/objects/brush.c b/reactos/subsystems/win32/win32k/objects/brush.c index f45f6fbcdd4..c8682f6a849 100644 --- a/reactos/subsystems/win32/win32k/objects/brush.c +++ b/reactos/subsystems/win32/win32k/objects/brush.c @@ -6,7 +6,7 @@ * PROGRAMER: */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/objects/cliprgn.c b/reactos/subsystems/win32/win32k/objects/cliprgn.c index acfc99b9a3f..c5297c38ba2 100644 --- a/reactos/subsystems/win32/win32k/objects/cliprgn.c +++ b/reactos/subsystems/win32/win32k/objects/cliprgn.c @@ -17,7 +17,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/objects/coord.c b/reactos/subsystems/win32/win32k/objects/coord.c index 0ae25bcc10d..7310dcb1adc 100644 --- a/reactos/subsystems/win32/win32k/objects/coord.c +++ b/reactos/subsystems/win32/win32k/objects/coord.c @@ -27,7 +27,7 @@ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/objects/dcattr.c b/reactos/subsystems/win32/win32k/objects/dcattr.c index 562d75473d6..9b445b1490c 100644 --- a/reactos/subsystems/win32/win32k/objects/dcattr.c +++ b/reactos/subsystems/win32/win32k/objects/dcattr.c @@ -6,7 +6,7 @@ * PROGRAMER: Timo Kreuzer (timo.kreuzer@rectos.org) */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/objects/dclife.c b/reactos/subsystems/win32/win32k/objects/dclife.c index 1fe51886b2a..3791a6aaeb8 100644 --- a/reactos/subsystems/win32/win32k/objects/dclife.c +++ b/reactos/subsystems/win32/win32k/objects/dclife.c @@ -6,7 +6,7 @@ * PROGRAMER: Timo Kreuzer (timo.kreuzer@rectos.org) */ -#include +#include #include #define NDEBUG diff --git a/reactos/subsystems/win32/win32k/objects/dcobjs.c b/reactos/subsystems/win32/win32k/objects/dcobjs.c index e18eb61bbc3..0bafaadd159 100644 --- a/reactos/subsystems/win32/win32k/objects/dcobjs.c +++ b/reactos/subsystems/win32/win32k/objects/dcobjs.c @@ -6,7 +6,7 @@ * PROGRAMER: Timo Kreuzer (timo.kreuzer@rectos.org) */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/objects/dcstate.c b/reactos/subsystems/win32/win32k/objects/dcstate.c index 9e491a4f0b1..1b97ae7aca9 100644 --- a/reactos/subsystems/win32/win32k/objects/dcstate.c +++ b/reactos/subsystems/win32/win32k/objects/dcstate.c @@ -6,7 +6,7 @@ * PROGRAMER: Timo Kreuzer (timo.kreuzer@rectos.org) */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/objects/dcutil.c b/reactos/subsystems/win32/win32k/objects/dcutil.c index a8c28ecb348..f856ea19bda 100644 --- a/reactos/subsystems/win32/win32k/objects/dcutil.c +++ b/reactos/subsystems/win32/win32k/objects/dcutil.c @@ -1,5 +1,5 @@ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/objects/device.c b/reactos/subsystems/win32/win32k/objects/device.c index b1158471282..b8d322f09ac 100644 --- a/reactos/subsystems/win32/win32k/objects/device.c +++ b/reactos/subsystems/win32/win32k/objects/device.c @@ -6,7 +6,7 @@ * PROGRAMER: Timo Kreuzer (timo.kreuzer@rectos.org) */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/objects/dibobj.c b/reactos/subsystems/win32/win32k/objects/dibobj.c index cc2a16efb2f..2ec35e6ee4a 100644 --- a/reactos/subsystems/win32/win32k/objects/dibobj.c +++ b/reactos/subsystems/win32/win32k/objects/dibobj.c @@ -17,7 +17,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/objects/drawing.c b/reactos/subsystems/win32/win32k/objects/drawing.c index 073ee1a97f7..0cc9a23200d 100755 --- a/reactos/subsystems/win32/win32k/objects/drawing.c +++ b/reactos/subsystems/win32/win32k/objects/drawing.c @@ -49,7 +49,7 @@ SUCH DAMAGE. Modified for ReactOS */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/objects/fillshap.c b/reactos/subsystems/win32/win32k/objects/fillshap.c index 7da05400637..aa133f87f52 100644 --- a/reactos/subsystems/win32/win32k/objects/fillshap.c +++ b/reactos/subsystems/win32/win32k/objects/fillshap.c @@ -17,7 +17,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/objects/font.c b/reactos/subsystems/win32/win32k/objects/font.c index 6127d835f42..a0837e1d24a 100644 --- a/reactos/subsystems/win32/win32k/objects/font.c +++ b/reactos/subsystems/win32/win32k/objects/font.c @@ -8,7 +8,7 @@ /** Includes ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/objects/freetype.c b/reactos/subsystems/win32/win32k/objects/freetype.c index fea0c101ee9..478863d6c13 100644 --- a/reactos/subsystems/win32/win32k/objects/freetype.c +++ b/reactos/subsystems/win32/win32k/objects/freetype.c @@ -35,7 +35,7 @@ /** Includes ******************************************************************/ -#include +#include #include #include FT_FREETYPE_H diff --git a/reactos/subsystems/win32/win32k/objects/gdibatch.c b/reactos/subsystems/win32/win32k/objects/gdibatch.c index ac174e971fb..11d3628b67d 100644 --- a/reactos/subsystems/win32/win32k/objects/gdibatch.c +++ b/reactos/subsystems/win32/win32k/objects/gdibatch.c @@ -1,5 +1,5 @@ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/objects/gdiobj.c b/reactos/subsystems/win32/win32k/objects/gdiobj.c index 5af1413e69a..0f73d9b57cf 100644 --- a/reactos/subsystems/win32/win32k/objects/gdiobj.c +++ b/reactos/subsystems/win32/win32k/objects/gdiobj.c @@ -10,7 +10,7 @@ //#define GDI_DEBUG -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/objects/icm.c b/reactos/subsystems/win32/win32k/objects/icm.c index 7a32146c0cb..dd99ea3d89d 100644 --- a/reactos/subsystems/win32/win32k/objects/icm.c +++ b/reactos/subsystems/win32/win32k/objects/icm.c @@ -17,7 +17,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/objects/line.c b/reactos/subsystems/win32/win32k/objects/line.c index bbf60f426c4..173b3f91b25 100644 --- a/reactos/subsystems/win32/win32k/objects/line.c +++ b/reactos/subsystems/win32/win32k/objects/line.c @@ -17,7 +17,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/objects/metafile.c b/reactos/subsystems/win32/win32k/objects/metafile.c index 573dde4b9dd..dbc62840154 100644 --- a/reactos/subsystems/win32/win32k/objects/metafile.c +++ b/reactos/subsystems/win32/win32k/objects/metafile.c @@ -8,7 +8,7 @@ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/objects/palette.c b/reactos/subsystems/win32/win32k/objects/palette.c index 61a50ec7ea7..8fcbbe4077c 100644 --- a/reactos/subsystems/win32/win32k/objects/palette.c +++ b/reactos/subsystems/win32/win32k/objects/palette.c @@ -7,7 +7,7 @@ * Timo Kreuzer */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/objects/path.c b/reactos/subsystems/win32/win32k/objects/path.c index 1dfca39b381..7d6c796bdce 100644 --- a/reactos/subsystems/win32/win32k/objects/path.c +++ b/reactos/subsystems/win32/win32k/objects/path.c @@ -32,7 +32,7 @@ * PROGRAMMER: */ -#include +#include #include "math.h" #define NDEBUG diff --git a/reactos/subsystems/win32/win32k/objects/pen.c b/reactos/subsystems/win32/win32k/objects/pen.c index 6f604658107..8d02e9bdb0a 100644 --- a/reactos/subsystems/win32/win32k/objects/pen.c +++ b/reactos/subsystems/win32/win32k/objects/pen.c @@ -20,7 +20,7 @@ * $Id$ */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/objects/polyfill.c b/reactos/subsystems/win32/win32k/objects/polyfill.c index f5fdc53ed3f..1f6196a53af 100644 --- a/reactos/subsystems/win32/win32k/objects/polyfill.c +++ b/reactos/subsystems/win32/win32k/objects/polyfill.c @@ -27,7 +27,7 @@ * 21/2/2003: Created */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/objects/print.c b/reactos/subsystems/win32/win32k/objects/print.c index bc56a2f3845..bf21047292f 100644 --- a/reactos/subsystems/win32/win32k/objects/print.c +++ b/reactos/subsystems/win32/win32k/objects/print.c @@ -18,7 +18,7 @@ */ /* $Id$ */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/objects/rect.c b/reactos/subsystems/win32/win32k/objects/rect.c index d98e79ca2dd..ea58e63f0a9 100644 --- a/reactos/subsystems/win32/win32k/objects/rect.c +++ b/reactos/subsystems/win32/win32k/objects/rect.c @@ -18,7 +18,7 @@ */ /* $Id$ */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/objects/region.c b/reactos/subsystems/win32/win32k/objects/region.c index 3922016c338..165f86a1625 100644 --- a/reactos/subsystems/win32/win32k/objects/region.c +++ b/reactos/subsystems/win32/win32k/objects/region.c @@ -113,7 +113,7 @@ SOFTWARE. * the y-x-banding that's so nice to have... */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/objects/stockobj.c b/reactos/subsystems/win32/win32k/objects/stockobj.c index 40708b6ea1b..5499a6fd956 100644 --- a/reactos/subsystems/win32/win32k/objects/stockobj.c +++ b/reactos/subsystems/win32/win32k/objects/stockobj.c @@ -22,7 +22,7 @@ * */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/objects/text.c b/reactos/subsystems/win32/win32k/objects/text.c index 14376a131ae..07cf12dcf21 100644 --- a/reactos/subsystems/win32/win32k/objects/text.c +++ b/reactos/subsystems/win32/win32k/objects/text.c @@ -8,7 +8,7 @@ /** Includes ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/objects/wingl.c b/reactos/subsystems/win32/win32k/objects/wingl.c index 150a762a151..72add55b52b 100644 --- a/reactos/subsystems/win32/win32k/objects/wingl.c +++ b/reactos/subsystems/win32/win32k/objects/wingl.c @@ -18,7 +18,7 @@ */ /* $Id$ */ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/objects/xformobj.c b/reactos/subsystems/win32/win32k/objects/xformobj.c index 74453d58168..9ba7311ef06 100644 --- a/reactos/subsystems/win32/win32k/objects/xformobj.c +++ b/reactos/subsystems/win32/win32k/objects/xformobj.c @@ -8,7 +8,7 @@ /** Includes ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/win32k/pch.h b/reactos/subsystems/win32/win32k/pch.h index 4bbbeb9c148..90075c80058 100644 --- a/reactos/subsystems/win32/win32k/pch.h +++ b/reactos/subsystems/win32/win32k/pch.h @@ -60,7 +60,7 @@ typedef struct _SECURITY_ATTRIBUTES SECURITY_ATTRIBUTES, *LPSECURITY_ATTRIBUTES; #include /* Internal Win32K Header */ -#include "include/win32k.h" +#include "include/win32kp.h" /* Undocumented stuff */ typedef DRIVEROBJ *PDRIVEROBJ; diff --git a/reactos/subsystems/win32/win32k/stubs/stubs.c b/reactos/subsystems/win32/win32k/stubs/stubs.c index a1e610bbd6c..82a8555354a 100644 --- a/reactos/subsystems/win32/win32k/stubs/stubs.c +++ b/reactos/subsystems/win32/win32k/stubs/stubs.c @@ -2,7 +2,7 @@ * Stubs for unimplemented WIN32K.SYS exports */ -#include +#include #define UNIMPLEMENTED DbgPrint("(%s:%i) WIN32K: %s UNIMPLEMENTED\n", __FILE__, __LINE__, __FUNCTION__ ) diff --git a/reactos/subsystems/win32/win32k/stubs/umpdstubs.c b/reactos/subsystems/win32/win32k/stubs/umpdstubs.c index 3ceadbb6e8c..9ecafb906af 100644 --- a/reactos/subsystems/win32/win32k/stubs/umpdstubs.c +++ b/reactos/subsystems/win32/win32k/stubs/umpdstubs.c @@ -1,4 +1,4 @@ -#include +#include #define UNIMPLEMENTED DbgPrint("(%s:%i) WIN32K: %s UNIMPLEMENTED\n", __FILE__, __LINE__, __FUNCTION__ ) diff --git a/reactos/subsystems/win32/win32k/w32k.h b/reactos/subsystems/win32/win32k/win32k.h similarity index 100% rename from reactos/subsystems/win32/win32k/w32k.h rename to reactos/subsystems/win32/win32k/win32k.h diff --git a/reactos/tools/gendib/gendib.c b/reactos/tools/gendib/gendib.c index 36601b69459..a6cb9a3626e 100644 --- a/reactos/tools/gendib/gendib.c +++ b/reactos/tools/gendib/gendib.c @@ -1006,7 +1006,7 @@ Generate(char *OutputDir, unsigned Bpp) MARK(Out); Output(Out, "/* This is a generated file. Please do not edit */\n"); Output(Out, "\n"); - Output(Out, "#include \n"); + Output(Out, "#include \n"); CreateShiftTables(Out); RopInfo = FindRopInfo(ROPCODE_GENERIC); From 9721d8084b9e6220a9260db664c1c809ee655f55 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Mon, 26 Apr 2010 15:10:23 +0000 Subject: [PATCH 067/131] [USETUP] - Use newinflib instead of inflib. - Pass the user-selected language to the inf parser. - Convert registry code from ANSI APIs to UNICODE APIs. ATTENTION: This commit might break the build bot because it was not tested on a Linux system. svn path=/trunk/; revision=47037 --- reactos/base/setup/usetup/inffile.c | 4 ++++ reactos/base/setup/usetup/inffile.h | 2 ++ reactos/base/setup/usetup/interface/usetup.c | 9 ++++++++- reactos/base/setup/usetup/registry.c | 2 ++ reactos/base/setup/usetup/registry.h | 1 + reactos/base/setup/usetup/usetup.rbuild | 4 ++-- 6 files changed, 19 insertions(+), 3 deletions(-) diff --git a/reactos/base/setup/usetup/inffile.c b/reactos/base/setup/usetup/inffile.c index 51fe2e7489d..0bbde01d9da 100644 --- a/reactos/base/setup/usetup/inffile.c +++ b/reactos/base/setup/usetup/inffile.c @@ -132,6 +132,7 @@ InfpOpenInfFileW( IN PCWSTR FileName, IN PCWSTR InfClass, IN DWORD InfStyle, + IN LCID LocaleId, OUT PUINT ErrorLine) { HINF hInf = NULL; @@ -143,6 +144,7 @@ InfpOpenInfFileW( Status = InfOpenFile( &hInf, &FileNameU, + LocaleId, &ErrorLineUL); *ErrorLine = (UINT)ErrorLineUL; if (!NT_SUCCESS(Status)) @@ -252,6 +254,7 @@ INF_OpenBufferedFileA( IN ULONG FileSize, IN PCSTR InfClass, IN DWORD InfStyle, + IN LCID LocaleId, OUT PUINT ErrorLine) { #ifdef __REACTOS__ @@ -263,6 +266,7 @@ INF_OpenBufferedFileA( &hInf, FileBuffer, FileSize, + LocaleId, &ErrorLineUL); *ErrorLine = (UINT)ErrorLineUL; if (!NT_SUCCESS(Status)) diff --git a/reactos/base/setup/usetup/inffile.h b/reactos/base/setup/usetup/inffile.h index 52b002db3a9..864d2017020 100644 --- a/reactos/base/setup/usetup/inffile.h +++ b/reactos/base/setup/usetup/inffile.h @@ -110,6 +110,7 @@ InfpOpenInfFileW( IN PCWSTR FileName, IN PCWSTR InfClass, IN DWORD InfStyle, + IN LCID LocaleId, OUT PUINT ErrorLine); #endif /* __REACTOS__ */ @@ -132,6 +133,7 @@ INF_OpenBufferedFileA( IN ULONG FileSize, IN PCSTR InfClass, IN DWORD InfStyle, + IN LCID LocaleId, OUT PUINT ErrorLine); VOID INF_SetHeap( diff --git a/reactos/base/setup/usetup/interface/usetup.c b/reactos/base/setup/usetup/interface/usetup.c index 87df41628f9..ea1711ee3b2 100644 --- a/reactos/base/setup/usetup/interface/usetup.c +++ b/reactos/base/setup/usetup/interface/usetup.c @@ -79,6 +79,8 @@ static PGENERIC_LIST KeyboardList = NULL; static PGENERIC_LIST LayoutList = NULL; static PGENERIC_LIST LanguageList = NULL; +static LANGID LanguageId = 0; + /* FUNCTIONS ****************************************************************/ static VOID @@ -422,6 +424,7 @@ CheckUnattendedSetup(VOID) UnattendInf = SetupOpenInfFileW(UnattendInfPath, NULL, INF_STYLE_WIN4, + LanguageId, &ErrorLine); if (UnattendInf == INVALID_HANDLE_VALUE) @@ -678,6 +681,8 @@ LanguagePage(PINPUT_RECORD Ir) { SelectedLanguageId = (PWCHAR)GetListEntryUserData(GetCurrentListEntry(LanguageList)); + LanguageId = (LANGID)(wcstol(SelectedLanguageId, NULL, 16) & 0xFFFF); + if (wcscmp(SelectedLanguageId, DefaultLanguage)) { UpdateKBLayout(); @@ -765,6 +770,7 @@ SetupStartPage(PINPUT_RECORD Ir) SetupInf = SetupOpenInfFileW(FileNameBuffer, NULL, INF_STYLE_WIN4, + LanguageId, &ErrorLine); if (SetupInf == INVALID_HANDLE_VALUE) @@ -3045,6 +3051,7 @@ PrepareCopyPage(PINPUT_RECORD Ir) InfFileSize, (const CHAR*) NULL, INF_STYLE_WIN4, + LanguageId, &ErrorLine); if (InfHandle == INVALID_HANDLE_VALUE) @@ -3274,7 +3281,7 @@ RegistryPage(PINPUT_RECORD Ir) CONSOLE_SetStatusText(MUIGetString(STRING_IMPORTFILE), File); - if (!ImportRegistryFile(File, Section, Delete)) + if (!ImportRegistryFile(File, Section, LanguageId, Delete)) { DPRINT("Importing %S failed\n", File); diff --git a/reactos/base/setup/usetup/registry.c b/reactos/base/setup/usetup/registry.c index d313b4d28bd..a8081292e67 100644 --- a/reactos/base/setup/usetup/registry.c +++ b/reactos/base/setup/usetup/registry.c @@ -617,6 +617,7 @@ registry_callback (HINF hInf, PCWSTR Section, BOOLEAN Delete) BOOLEAN ImportRegistryFile(PWSTR Filename, PWSTR Section, + LCID LocaleId, BOOLEAN Delete) { WCHAR FileNameBuffer[MAX_PATH]; @@ -632,6 +633,7 @@ ImportRegistryFile(PWSTR Filename, FileNameBuffer, NULL, INF_STYLE_WIN4, + LocaleId, &ErrorLine); if (hInf == INVALID_HANDLE_VALUE) { diff --git a/reactos/base/setup/usetup/registry.h b/reactos/base/setup/usetup/registry.h index d76470402d7..63d2b67ef8b 100644 --- a/reactos/base/setup/usetup/registry.h +++ b/reactos/base/setup/usetup/registry.h @@ -29,6 +29,7 @@ BOOLEAN ImportRegistryFile(PWSTR Filename, PWSTR Section, + LCID LocaleId, BOOLEAN Delete); BOOLEAN diff --git a/reactos/base/setup/usetup/usetup.rbuild b/reactos/base/setup/usetup/usetup.rbuild index fa96c8cd59e..51f3c0386a0 100644 --- a/reactos/base/setup/usetup/usetup.rbuild +++ b/reactos/base/setup/usetup/usetup.rbuild @@ -4,10 +4,10 @@ . . - . + . include/reactos/drivers zlib - inflib + newinflib ext2lib vfatlib ntdll From 3a0805b27a693a623549f21b403641617f4110c1 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Mon, 26 Apr 2010 15:35:57 +0000 Subject: [PATCH 068/131] [MKHIVE] Partial revert of r47019 because mkhive failed on Linux machines. svn path=/trunk/; revision=47038 --- reactos/tools/mkhive/mkhive.rbuild | 4 +- reactos/tools/mkhive/reginf.c | 108 ++++++++++++++--------------- reactos/tools/mkhive/rtl.c | 29 -------- 3 files changed, 56 insertions(+), 85 deletions(-) diff --git a/reactos/tools/mkhive/mkhive.rbuild b/reactos/tools/mkhive/mkhive.rbuild index e4778b9d803..c5d22dc1fbc 100644 --- a/reactos/tools/mkhive/mkhive.rbuild +++ b/reactos/tools/mkhive/mkhive.rbuild @@ -1,13 +1,13 @@ - . + . . . . -fshort-wchar - newinflibhost + inflibhost cmlibhost host_wcsfuncs binhive.c diff --git a/reactos/tools/mkhive/reginf.c b/reactos/tools/mkhive/reginf.c index 9e03c08c668..50d379b0ffe 100644 --- a/reactos/tools/mkhive/reginf.c +++ b/reactos/tools/mkhive/reginf.c @@ -51,34 +51,34 @@ /* FUNCTIONS ****************************************************************/ static BOOL -GetRootKey (PWCHAR Name) +GetRootKey (PCHAR Name) { - if (!_wcsicmp (Name, L"HKCR")) + if (!strcasecmp (Name, "HKCR")) { - wcscpy (Name, L"\\Registry\\Machine\\SOFTWARE\\Classes\\"); + strcpy (Name, "\\Registry\\Machine\\SOFTWARE\\Classes\\"); return TRUE; } - if (!_wcsicmp (Name, L"HKCU")) + if (!strcasecmp (Name, "HKCU")) { - wcscpy (Name, L"\\Registry\\User\\.DEFAULT\\"); + strcpy (Name, "\\Registry\\User\\.DEFAULT\\"); return TRUE; } - if (!_wcsicmp (Name, L"HKLM")) + if (!strcasecmp (Name, "HKLM")) { - wcscpy (Name, L"\\Registry\\Machine\\"); + strcpy (Name, "\\Registry\\Machine\\"); return TRUE; } - if (!_wcsicmp (Name, L"HKU")) + if (!strcasecmp (Name, "HKU")) { - wcscpy (Name, L"\\Registry\\User\\"); + strcpy (Name, "\\Registry\\User\\"); return TRUE; } #if 0 - if (!_wcsicmp (Name, L"HKR")) + if (!strcasecmp (Name, "HKR")) return FALSE; #endif @@ -94,19 +94,19 @@ GetRootKey (PWCHAR Name) static VOID AppendMultiSzValue ( IN HKEY KeyHandle, - IN PWCHAR ValueName, - IN PWCHAR Strings, + IN PCHAR ValueName, + IN PCHAR Strings, IN SIZE_T StringSize) { SIZE_T Size; ULONG Type; size_t Total; - PWCHAR Buffer; - PWCHAR p; + PCHAR Buffer; + PCHAR p; size_t len; LONG Error; - Error = RegQueryValueExW ( + Error = RegQueryValueExA ( KeyHandle, ValueName, NULL, @@ -117,11 +117,11 @@ AppendMultiSzValue ( (Type != REG_MULTI_SZ)) return; - Buffer = malloc (Size + (StringSize * sizeof(WCHAR))); + Buffer = malloc (Size + StringSize); if (Buffer == NULL) return; - Error = RegQueryValueExW ( + Error = RegQueryValueExA ( KeyHandle, ValueName, NULL, @@ -135,25 +135,25 @@ AppendMultiSzValue ( Total = Size; while (*Strings != 0) { - len = wcslen (Strings) + 1; + len = strlen (Strings) + 1; - for (p = Buffer; *p != 0; p += wcslen (p) + 1) - if (!_wcsicmp (p, Strings)) + for (p = Buffer; *p != 0; p += strlen (p) + 1) + if (!strcasecmp (p, Strings)) break; if (*p == 0) /* not found, need to append it */ { - memcpy (p, Strings, len * sizeof(WCHAR)); + memcpy (p, Strings, len); p[len] = 0; - Total += len * sizeof(WCHAR); + Total += len; } Strings += len; } if (Total != Size) { - DPRINT ("setting value %S to %S\n", ValueName, Buffer); - RegSetValueExW ( + DPRINT ("setting value %s to %s\n", ValueName, Buffer); + RegSetValueExA ( KeyHandle, ValueName, 0, @@ -175,11 +175,11 @@ done: static BOOL do_reg_operation( IN HKEY KeyHandle, - IN PWCHAR ValueName, + IN PCHAR ValueName, IN PINFCONTEXT Context, IN ULONG Flags) { - WCHAR EmptyStr = (WCHAR)0; + CHAR EmptyStr = (CHAR)0; ULONG Type; ULONG Size; LONG Error; @@ -188,11 +188,11 @@ do_reg_operation( { if (ValueName) { - RegDeleteValueW (KeyHandle, ValueName); + RegDeleteValueA (KeyHandle, ValueName); } else { - RegDeleteKeyW (KeyHandle, NULL); + RegDeleteKeyA (KeyHandle, NULL); } return TRUE; @@ -203,7 +203,7 @@ do_reg_operation( if (Flags & (FLG_ADDREG_NOCLOBBER | FLG_ADDREG_OVERWRITEONLY)) { - Error = RegQueryValueExW ( + Error = RegQueryValueExA ( KeyHandle, ValueName, NULL, @@ -253,7 +253,7 @@ do_reg_operation( if (!(Flags & FLG_ADDREG_BINVALUETYPE) || (Type == REG_DWORD && InfHostGetFieldCount (Context) == 5)) { - WCHAR *Str = NULL; + CHAR *Str = NULL; if (Type == REG_MULTI_SZ) { @@ -262,7 +262,7 @@ do_reg_operation( if (Size) { - Str = malloc (Size * sizeof(WCHAR)); + Str = malloc (Size); if (Str == NULL) return FALSE; @@ -292,7 +292,7 @@ do_reg_operation( if (Size) { - Str = malloc (Size * sizeof(WCHAR)); + Str = malloc (Size); if (Str == NULL) return FALSE; @@ -302,11 +302,11 @@ do_reg_operation( if (Type == REG_DWORD) { - ULONG dw = Str ? wcstoul (Str, NULL, 0) : 0; + ULONG dw = Str ? strtoul (Str, NULL, 0) : 0; - DPRINT("setting dword %S to %x\n", ValueName, dw); + DPRINT("setting dword %s to %x\n", ValueName, dw); - RegSetValueExW ( + RegSetValueExA ( KeyHandle, ValueName, 0, @@ -316,27 +316,27 @@ do_reg_operation( } else { - DPRINT("setting value %S to %S\n", ValueName, Str); + DPRINT("setting value %s to %s\n", ValueName, Str); if (Str) { - RegSetValueExW ( + RegSetValueExA ( KeyHandle, ValueName, 0, Type, (PVOID)Str, - (ULONG)Size * sizeof(WCHAR)); + (ULONG)Size); } else { - RegSetValueExW ( + RegSetValueExA ( KeyHandle, ValueName, 0, Type, (PVOID)&EmptyStr, - (ULONG)sizeof(WCHAR)); + (ULONG)sizeof(CHAR)); } } free (Str); @@ -354,11 +354,11 @@ do_reg_operation( if (Data == NULL) return FALSE; - DPRINT("setting binary data %S len %d\n", ValueName, Size); + DPRINT("setting binary data %s len %d\n", ValueName, Size); InfHostGetBinaryField (Context, 5, Data, Size, NULL); } - RegSetValueExW ( + RegSetValueExA ( KeyHandle, ValueName, 0, @@ -378,10 +378,10 @@ do_reg_operation( * Called once for each AddReg and DelReg entry in a given section. */ static BOOL -registry_callback (HINF hInf, PWCHAR Section, BOOL Delete) +registry_callback (HINF hInf, PCHAR Section, BOOL Delete) { - WCHAR Buffer[MAX_INF_STRING_LENGTH]; - PWCHAR ValuePtr; + CHAR Buffer[MAX_INF_STRING_LENGTH]; + PCHAR ValuePtr; ULONG Flags; size_t Length; @@ -403,11 +403,11 @@ registry_callback (HINF hInf, PWCHAR Section, BOOL Delete) continue; /* get key */ - Length = wcslen (Buffer); + Length = strlen (Buffer); if (InfHostGetStringField (Context, 2, Buffer + Length, MAX_INF_STRING_LENGTH - (ULONG)Length, NULL) != 0) *Buffer = 0; - DPRINT("KeyName: <%S>\n", Buffer); + DPRINT("KeyName: <%s>\n", Buffer); if (Delete) { @@ -424,17 +424,17 @@ registry_callback (HINF hInf, PWCHAR Section, BOOL Delete) if (Delete || (Flags & FLG_ADDREG_OVERWRITEONLY)) { - if (RegOpenKeyW (NULL, Buffer, &KeyHandle) != ERROR_SUCCESS) + if (RegOpenKeyA (NULL, Buffer, &KeyHandle) != ERROR_SUCCESS) { - DPRINT("RegOpenKey(%S) failed\n", Buffer); + DPRINT("RegOpenKey(%s) failed\n", Buffer); continue; /* ignore if it doesn't exist */ } } else { - if (RegCreateKeyW (NULL, Buffer, &KeyHandle) != ERROR_SUCCESS) + if (RegCreateKeyA (NULL, Buffer, &KeyHandle) != ERROR_SUCCESS) { - DPRINT("RegCreateKey(%S) failed\n", Buffer); + DPRINT("RegCreateKey(%s) failed\n", Buffer); continue; } } @@ -469,18 +469,18 @@ ImportRegistryFile(PCHAR FileName) ULONG ErrorLine; /* Load inf file from install media. */ - if (InfHostOpenFile(&hInf, FileName, 0, &ErrorLine) != 0) + if (InfHostOpenFile(&hInf, FileName, &ErrorLine) != 0) { DPRINT1 ("InfHostOpenFile(%s) failed\n", FileName); return FALSE; } - if (!registry_callback (hInf, L"DelReg", TRUE)) + if (!registry_callback (hInf, "DelReg", TRUE)) { DPRINT1 ("registry_callback() for DelReg failed\n"); } - if (!registry_callback (hInf, L"AddReg", FALSE)) + if (!registry_callback (hInf, "AddReg", FALSE)) { DPRINT1 ("registry_callback() for AddReg failed\n"); } diff --git a/reactos/tools/mkhive/rtl.c b/reactos/tools/mkhive/rtl.c index a68d7a0672c..e9ed22b66e0 100644 --- a/reactos/tools/mkhive/rtl.c +++ b/reactos/tools/mkhive/rtl.c @@ -207,32 +207,3 @@ unsigned char BitScanReverse(ULONG * const Index, unsigned long Mask) } return Mask ? 1 : 0; } - -#undef tolower -WCHAR towlower(WCHAR ch) -{ - if (ch < L'A') - { - return ch; - } - else if (ch <= L'Z') - { - return ch + (L'a' - L'A'); - } - - return ch; -} - -int _wcsicmp(PCWSTR cs, PCWSTR ct) -{ - while (towlower(*cs) == towlower(*ct)) - { - if (*cs == 0) - return 0; - - cs++; - ct++; - } - - return towlower(*cs) - towlower(*ct); -} From cc87229eb87615550696d543af465882182c229f Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Mon, 26 Apr 2010 15:46:16 +0000 Subject: [PATCH 069/131] Comment out an ASSERT that gets trigged frequently. See issue #5320 for more details. svn path=/trunk/; revision=47039 --- reactos/subsystems/win32/win32k/ntuser/windc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/subsystems/win32/win32k/ntuser/windc.c b/reactos/subsystems/win32/win32k/ntuser/windc.c index 7dd06599a0e..ed49ac6a920 100644 --- a/reactos/subsystems/win32/win32k/ntuser/windc.c +++ b/reactos/subsystems/win32/win32k/ntuser/windc.c @@ -736,7 +736,7 @@ DceFreeWindowDCE(PWINDOW_OBJECT Window) else { DPRINT1("Not POWNED or CLASSDC hwndCurrent -> %x \n", pDCE->hwndCurrent); - ASSERT(FALSE); + //ASSERT(FALSE); } } else From 93b98b3f84a9b6e3111a1fb4d9fdda402951c0a5 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Mon, 26 Apr 2010 16:06:17 +0000 Subject: [PATCH 070/131] [MKHIVE] Revert remaining changes of r47019. svn path=/trunk/; revision=47040 --- reactos/tools/mkhive/reginf.c | 4 ++-- reactos/tools/mkhive/registry.c | 35 ++++++++------------------------- 2 files changed, 10 insertions(+), 29 deletions(-) diff --git a/reactos/tools/mkhive/reginf.c b/reactos/tools/mkhive/reginf.c index 50d379b0ffe..dd8ac4596e0 100644 --- a/reactos/tools/mkhive/reginf.c +++ b/reactos/tools/mkhive/reginf.c @@ -188,7 +188,7 @@ do_reg_operation( { if (ValueName) { - RegDeleteValueA (KeyHandle, ValueName); + RegDeleteValueA (KeyHandle, ValueName); } else { @@ -253,7 +253,7 @@ do_reg_operation( if (!(Flags & FLG_ADDREG_BINVALUETYPE) || (Type == REG_DWORD && InfHostGetFieldCount (Context) == 5)) { - CHAR *Str = NULL; + PCHAR Str = NULL; if (Type == REG_MULTI_SZ) { diff --git a/reactos/tools/mkhive/registry.c b/reactos/tools/mkhive/registry.c index e182596e23b..3bd2c9efe60 100644 --- a/reactos/tools/mkhive/registry.c +++ b/reactos/tools/mkhive/registry.c @@ -25,9 +25,9 @@ /* * TODO: - * - Implement RegDeleteKeyW() + * - Implement RegDeleteKey() * - Implement RegEnumValue() - * - Implement RegQueryValueExW() + * - Implement RegQueryValueExA() */ #include @@ -246,34 +246,15 @@ RegCreateKeyA( } LONG WINAPI -RegDeleteKeyW(IN HKEY hKey, - IN LPCWSTR lpSubKey) +RegDeleteKeyA(HKEY Key, + LPCSTR Name) { - if (lpSubKey != NULL && wcschr(lpSubKey, L'\\') != NULL) - return(ERROR_INVALID_PARAMETER); + if (Name != NULL && strchr(Name, '\\') != NULL) + return(ERROR_INVALID_PARAMETER); - DPRINT1("RegDeleteKeyW: FIXME!\n"); + DPRINT1("FIXME!\n"); - return(ERROR_SUCCESS); -} - -LONG WINAPI -RegDeleteKeyA(IN HKEY hKey, - IN LPCSTR lpSubKey) -{ - PWSTR lpSubKeyW; - LONG rc; - - if (lpSubKey != NULL && strchr(lpSubKey, '\\') != NULL) - return(ERROR_INVALID_PARAMETER); - - lpSubKeyW = MultiByteToWideChar(lpSubKey); - if (!lpSubKeyW) - return ERROR_OUTOFMEMORY; - - rc = RegDeleteKeyW(hKey, lpSubKeyW); - free(lpSubKeyW); - return rc; + return(ERROR_SUCCESS); } LONG WINAPI From 5d4a67e6250155cf0c5ad7dacc9a1874a38bcfd4 Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Mon, 26 Apr 2010 18:30:08 +0000 Subject: [PATCH 071/131] [NETSHELL] Fix LAN status icon resource See issue #3813 for more details. svn path=/trunk/; revision=47041 --- reactos/dll/win32/netshell/lang/bg-BG.rc | 2 +- reactos/dll/win32/netshell/lang/cs-CZ.rc | 2 +- reactos/dll/win32/netshell/lang/da-DK.rc | 2 +- reactos/dll/win32/netshell/lang/el-GR.rc | 2 +- reactos/dll/win32/netshell/lang/en-US.rc | 2 +- reactos/dll/win32/netshell/lang/es-ES.rc | 2 +- reactos/dll/win32/netshell/lang/fr-FR.rc | 2 +- reactos/dll/win32/netshell/lang/hu-HU.rc | 2 +- reactos/dll/win32/netshell/lang/id-ID.rc | 2 +- reactos/dll/win32/netshell/lang/it-IT.rc | 2 +- reactos/dll/win32/netshell/lang/ja-JP.rc | 2 +- reactos/dll/win32/netshell/lang/nl-NL.rc | 2 +- reactos/dll/win32/netshell/lang/no-NO.rc | 2 +- reactos/dll/win32/netshell/lang/pl-PL.rc | 2 +- reactos/dll/win32/netshell/lang/ro-RO.rc | 2 +- reactos/dll/win32/netshell/lang/ru-RU.rc | 2 +- reactos/dll/win32/netshell/lang/sv-SE.rc | 2 +- reactos/dll/win32/netshell/lang/uk-UA.rc | 2 +- reactos/dll/win32/netshell/lang/zh-CN.rc | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/reactos/dll/win32/netshell/lang/bg-BG.rc b/reactos/dll/win32/netshell/lang/bg-BG.rc index a42b9b510fc..c47a1813b80 100644 --- a/reactos/dll/win32/netshell/lang/bg-BG.rc +++ b/reactos/dll/win32/netshell/lang/bg-BG.rc @@ -37,7 +37,7 @@ BEGIN LTEXT ":", -1, 19, 48, 60, 8 GROUPBOX "", -1, 9, 74, 182, 70, BS_GROUPBOX RTEXT "", -1, 26, 90, 60, 8 - ICON IDI_NETSTAT, -1, 110, 85, 18, 20 + ICON "", IDC_NETSTAT, 110, 85, 18, 20 LTEXT "", -1, 149, 90, 37, 8 LTEXT ":", -1, 17, 115, 32, 8 RTEXT "000.000.000", IDC_SEND, 63, 115, 44, 8 diff --git a/reactos/dll/win32/netshell/lang/cs-CZ.rc b/reactos/dll/win32/netshell/lang/cs-CZ.rc index b98ecf7c9b8..c0818ab9754 100644 --- a/reactos/dll/win32/netshell/lang/cs-CZ.rc +++ b/reactos/dll/win32/netshell/lang/cs-CZ.rc @@ -37,7 +37,7 @@ BEGIN LTEXT "Rychlost:", -1, 19, 48, 60, 8 GROUPBOX "Aktivita", -1, 9, 74, 182, 70, BS_GROUPBOX RTEXT "Odeslno", -1, 26, 90, 60, 8 - ICON IDI_NETSTAT, -1, 110, 85, 32, 32 + ICON "", IDC_NETSTAT, 110, 85, 32, 32 LTEXT "Pijato", -1, 149, 90, 37, 8 LTEXT "Byt:", -1, 17, 115, 32, 8 RTEXT "000.000.000", IDC_SEND, 63, 115, 44, 8 diff --git a/reactos/dll/win32/netshell/lang/da-DK.rc b/reactos/dll/win32/netshell/lang/da-DK.rc index 682914a6d5a..d23e9c59471 100644 --- a/reactos/dll/win32/netshell/lang/da-DK.rc +++ b/reactos/dll/win32/netshell/lang/da-DK.rc @@ -36,7 +36,7 @@ BEGIN LTEXT "Hastighed:", -1, 19, 48, 60, 8 GROUPBOX "Netvrks Aktivitet", -1, 9, 74, 182, 70, BS_GROUPBOX RTEXT "Sendt", -1, 26, 90, 60, 8 - ICON IDI_NETSTAT, -1, 110, 85, 32, 32 + ICON "", IDC_NETSTAT, 110, 85, 32, 32 LTEXT " Modtaget", -1, 149, 90, 37, 8 LTEXT "Bytes:", -1, 73, 115, 44, 8 RTEXT "000.000.000", IDC_SEND, 63, 115, 44, 8 diff --git a/reactos/dll/win32/netshell/lang/el-GR.rc b/reactos/dll/win32/netshell/lang/el-GR.rc index 9df47c3fc46..c0eacd68648 100644 --- a/reactos/dll/win32/netshell/lang/el-GR.rc +++ b/reactos/dll/win32/netshell/lang/el-GR.rc @@ -36,7 +36,7 @@ BEGIN LTEXT ":", -1, 19, 48, 60, 8 GROUPBOX "", -1, 9, 74, 182, 70, BS_GROUPBOX RTEXT "", -1, 26, 90, 60, 8 - ICON IDI_NETSTAT, -1, 110, 85, 32, 32 + ICON "", IDC_NETSTAT, 110, 85, 32, 32 LTEXT "", -1, 149, 90, 37, 8 LTEXT "Bytes:", -1, 17, 115, 32, 8 RTEXT "000.000.000", IDC_SEND, 63, 115, 44, 8 diff --git a/reactos/dll/win32/netshell/lang/en-US.rc b/reactos/dll/win32/netshell/lang/en-US.rc index 350e73cd20f..a9d17bca423 100644 --- a/reactos/dll/win32/netshell/lang/en-US.rc +++ b/reactos/dll/win32/netshell/lang/en-US.rc @@ -37,7 +37,7 @@ BEGIN LTEXT "Speed:", -1, 19, 48, 60, 8 GROUPBOX "Activity", -1, 9, 74, 182, 70, BS_GROUPBOX RTEXT "Sent", -1, 26, 90, 60, 8 - ICON IDI_NETSTAT, -1, 110, 85, 32, 32 + ICON "", IDC_NETSTAT, 110, 85, 32, 32 LTEXT "Received", -1, 149, 90, 37, 8 LTEXT "Bytes:", -1, 17, 115, 32, 8 RTEXT "000.000.000", IDC_SEND, 63, 115, 44, 8 diff --git a/reactos/dll/win32/netshell/lang/es-ES.rc b/reactos/dll/win32/netshell/lang/es-ES.rc index 284425b4607..bc6cedc6539 100644 --- a/reactos/dll/win32/netshell/lang/es-ES.rc +++ b/reactos/dll/win32/netshell/lang/es-ES.rc @@ -37,7 +37,7 @@ BEGIN LTEXT "Velocidad:", -1, 19, 48, 60, 8 GROUPBOX "Actividad ", -1, 9, 74, 182, 70, BS_GROUPBOX RTEXT "Enviados", -1, 26, 90, 60, 8 - ICON IDI_NETSTAT, -1, 110, 85, 32, 32 + ICON "", IDC_NETSTAT, 110, 85, 32, 32 LTEXT "Recibidos", -1, 149, 90, 37, 8 LTEXT "Paquetes:", -1, 17, 115, 32, 8 RTEXT "000.000.000", IDC_SEND, 63, 115, 44, 8 diff --git a/reactos/dll/win32/netshell/lang/fr-FR.rc b/reactos/dll/win32/netshell/lang/fr-FR.rc index 6ca04cc5996..ed4926ca34e 100644 --- a/reactos/dll/win32/netshell/lang/fr-FR.rc +++ b/reactos/dll/win32/netshell/lang/fr-FR.rc @@ -37,7 +37,7 @@ BEGIN LTEXT "Vitesse :", -1, 19, 48, 60, 8 GROUPBOX "Activit", -1, 9, 74, 182, 70, BS_GROUPBOX RTEXT "Envoys", -1, 26, 90, 60, 8 - ICON IDI_NETSTAT, -1, 110, 85, 32, 32 + ICON "", IDC_NETSTAT, 110, 85, 32, 32 LTEXT "Reus", -1, 149, 90, 37, 8 LTEXT "Octets :", -1, 17, 115, 32, 8 RTEXT "000.000.000", IDC_SEND, 63, 115, 44, 8 diff --git a/reactos/dll/win32/netshell/lang/hu-HU.rc b/reactos/dll/win32/netshell/lang/hu-HU.rc index dc6b75047a4..1365ac40837 100644 --- a/reactos/dll/win32/netshell/lang/hu-HU.rc +++ b/reactos/dll/win32/netshell/lang/hu-HU.rc @@ -36,7 +36,7 @@ BEGIN LTEXT "Sebessg:", -1, 19, 48, 60, 8 GROUPBOX "Tevkenysg", -1, 9, 74, 182, 70, BS_GROUPBOX RTEXT "Elkldtt", -1, 26, 90, 60, 8 - ICON IDI_NETSTAT, -1, 110, 85, 32, 32 + ICON "", IDC_NETSTAT, 110, 85, 32, 32 LTEXT "Berkezett", -1, 149, 90, 37, 8 LTEXT "Bytes:", -1, 17, 115, 32, 8 RTEXT "000.000.000", IDC_SEND, 63, 115, 44, 8 diff --git a/reactos/dll/win32/netshell/lang/id-ID.rc b/reactos/dll/win32/netshell/lang/id-ID.rc index b6936192f0c..25675a79643 100644 --- a/reactos/dll/win32/netshell/lang/id-ID.rc +++ b/reactos/dll/win32/netshell/lang/id-ID.rc @@ -36,7 +36,7 @@ BEGIN LTEXT "Kecepatan:", -1, 19, 48, 60, 8 GROUPBOX "Aktivitas", -1, 9, 74, 182, 70, BS_GROUPBOX RTEXT "Dikirim", -1, 26, 90, 60, 8 - ICON IDI_NETSTAT, -1, 110, 85, 32, 32 + ICON "", IDC_NETSTAT, 110, 85, 32, 32 LTEXT "Diterima", -1, 149, 90, 37, 8 LTEXT "Bytes:", -1, 17, 115, 32, 8 RTEXT "000.000.000", IDC_SEND, 63, 115, 44, 8 diff --git a/reactos/dll/win32/netshell/lang/it-IT.rc b/reactos/dll/win32/netshell/lang/it-IT.rc index b7168eae222..5084bd727d3 100644 --- a/reactos/dll/win32/netshell/lang/it-IT.rc +++ b/reactos/dll/win32/netshell/lang/it-IT.rc @@ -39,7 +39,7 @@ BEGIN GROUPBOX "Attivit", -1, 9, 74, 182, 70, BS_GROUPBOX RTEXT "Inviati", -1, 26, 90, 60, 8 ICON IDI_HORIZONTAL, -1, 90, 85, 18, 20 - ICON IDI_NETSTAT, -1, 110, 85, 18, 20 + ICON "", IDC_NETSTAT, 110, 85, 18, 20 ICON IDI_HORIZONTAL, -1, 130, 85, 18, 20 LTEXT "Ricevuti", -1, 149, 90, 37, 8 LTEXT "Byte:", -1, 17, 115, 32, 8 diff --git a/reactos/dll/win32/netshell/lang/ja-JP.rc b/reactos/dll/win32/netshell/lang/ja-JP.rc index c9bdf75b1d5..dfe0ff7c58e 100644 --- a/reactos/dll/win32/netshell/lang/ja-JP.rc +++ b/reactos/dll/win32/netshell/lang/ja-JP.rc @@ -37,7 +37,7 @@ BEGIN LTEXT "x:", -1, 19, 48, 60, 8 GROUPBOX "", -1, 9, 74, 182, 70, BS_GROUPBOX RTEXT "M", -1, 26, 90, 60, 8 - ICON IDI_NETSTAT, -1, 110, 85, 32, 32 + ICON "", IDC_NETSTAT, 110, 85, 32, 32 LTEXT "M", -1, 149, 90, 37, 8 LTEXT "oCg:", -1, 17, 115, 32, 8 RTEXT "000.000.000", IDC_SEND, 63, 115, 44, 8 diff --git a/reactos/dll/win32/netshell/lang/nl-NL.rc b/reactos/dll/win32/netshell/lang/nl-NL.rc index 914abced291..bae6286dc86 100644 --- a/reactos/dll/win32/netshell/lang/nl-NL.rc +++ b/reactos/dll/win32/netshell/lang/nl-NL.rc @@ -39,7 +39,7 @@ BEGIN LTEXT "Snelheid:", -1, 19, 48, 60, 8 GROUPBOX "Activiteit", -1, 9, 74, 182, 70, BS_GROUPBOX RTEXT "Verzonden", -1, 26, 90, 60, 8 - ICON IDI_NETSTAT, -1, 110, 85, 32, 32 + ICON "", IDC_NETSTAT, 110, 85, 32, 32 LTEXT "Ontvangen", -1, 149, 90, 37, 8 LTEXT "Bytes:", -1, 17, 115, 32, 8 RTEXT "000.000.000", IDC_SEND, 63, 115, 44, 8 diff --git a/reactos/dll/win32/netshell/lang/no-NO.rc b/reactos/dll/win32/netshell/lang/no-NO.rc index 31fafa28464..b93f14261b8 100644 --- a/reactos/dll/win32/netshell/lang/no-NO.rc +++ b/reactos/dll/win32/netshell/lang/no-NO.rc @@ -37,7 +37,7 @@ BEGIN LTEXT "Hastighet:", -1, 19, 48, 60, 8 GROUPBOX "Aktivitet", -1, 9, 74, 182, 70, BS_GROUPBOX RTEXT "Sendt", -1, 26, 90, 60, 8 - ICON IDI_NETSTAT, -1, 110, 85, 32, 32 + ICON "", IDC_NETSTAT, 110, 85, 32, 32 LTEXT "Mottatt", -1, 149, 90, 37, 8 LTEXT "Byte:", -1, 17, 115, 32, 8 RTEXT "000.000.000", IDC_SEND, 63, 115, 44, 8 diff --git a/reactos/dll/win32/netshell/lang/pl-PL.rc b/reactos/dll/win32/netshell/lang/pl-PL.rc index f8c9cc8dcd1..38ff75b21b2 100644 --- a/reactos/dll/win32/netshell/lang/pl-PL.rc +++ b/reactos/dll/win32/netshell/lang/pl-PL.rc @@ -37,7 +37,7 @@ BEGIN LTEXT "Szybko:", -1, 19, 48, 60, 8 GROUPBOX "Aktywno", -1, 9, 74, 182, 70, BS_GROUPBOX RTEXT "Wysano", -1, 26, 90, 60, 8 - ICON IDI_NETSTAT, -1, 110, 85, 32, 32 + ICON "", IDC_NETSTAT, 110, 85, 32, 32 LTEXT "Odebrano", -1, 149, 90, 37, 8 LTEXT "bajtw:", -1, 17, 115, 32, 8 RTEXT "000.000.000", IDC_SEND, 63, 115, 44, 8 diff --git a/reactos/dll/win32/netshell/lang/ro-RO.rc b/reactos/dll/win32/netshell/lang/ro-RO.rc index 3a52b7df5b2..06ca39c1bf8 100644 --- a/reactos/dll/win32/netshell/lang/ro-RO.rc +++ b/reactos/dll/win32/netshell/lang/ro-RO.rc @@ -37,7 +37,7 @@ BEGIN LTEXT "Vitez:", -1, 19, 48, 60, 8 GROUPBOX "Activitate", -1, 9, 74, 182, 70, BS_GROUPBOX RTEXT "Trimis", -1, 26, 90, 60, 8 - ICON IDI_NETSTAT, -1, 110, 85, 32, 32 + ICON "", IDC_NETSTAT, 110, 85, 32, 32 LTEXT "Primit", -1, 149, 90, 37, 8 LTEXT "Octei:", -1, 17, 115, 32, 8 RTEXT "000.000.000", IDC_SEND, 63, 115, 44, 8 diff --git a/reactos/dll/win32/netshell/lang/ru-RU.rc b/reactos/dll/win32/netshell/lang/ru-RU.rc index 74c2b698959..91daab64e12 100644 --- a/reactos/dll/win32/netshell/lang/ru-RU.rc +++ b/reactos/dll/win32/netshell/lang/ru-RU.rc @@ -37,7 +37,7 @@ BEGIN LTEXT ":", -1, 19, 48, 60, 8 GROUPBOX "", -1, 9, 74, 198, 70, BS_GROUPBOX RTEXT "", -1, 20, 90, 60, 8 - ICON IDI_NETSTAT, -1, 110, 85, 32, 32 + ICON "", IDC_NETSTAT, 110, 85, 32, 32 LTEXT "", -1, 158, 90, 37, 8 LTEXT ":", -1, 17, 115, 32, 8 RTEXT "000.000.000", IDC_SEND, 54, 115, 44, 8 diff --git a/reactos/dll/win32/netshell/lang/sv-SE.rc b/reactos/dll/win32/netshell/lang/sv-SE.rc index d7243c4e8be..78651fccbfa 100644 --- a/reactos/dll/win32/netshell/lang/sv-SE.rc +++ b/reactos/dll/win32/netshell/lang/sv-SE.rc @@ -37,7 +37,7 @@ BEGIN LTEXT "Hastighet:", -1, 19, 48, 60, 8 GROUPBOX "Aktivitet", -1, 9, 74, 182, 70, BS_GROUPBOX RTEXT "Skickat", -1, 26, 90, 60, 8 - ICON IDI_NETSTAT, -1, 110, 85, 32, 32 + ICON "", IDC_NETSTAT, 110, 85, 32, 32 LTEXT "Mottaget", -1, 149, 90, 37, 8 LTEXT "Bytes:", -1, 17, 115, 32, 8 RTEXT "000.000.000", IDC_SEND, 63, 115, 44, 8 diff --git a/reactos/dll/win32/netshell/lang/uk-UA.rc b/reactos/dll/win32/netshell/lang/uk-UA.rc index a8abd4067c4..f109166df5a 100644 --- a/reactos/dll/win32/netshell/lang/uk-UA.rc +++ b/reactos/dll/win32/netshell/lang/uk-UA.rc @@ -45,7 +45,7 @@ BEGIN LTEXT ":", -1, 19, 48, 60, 8 GROUPBOX "", -1, 9, 74, 182, 70, BS_GROUPBOX RTEXT "", -1, 26, 90, 60, 8 - ICON IDI_NETSTAT, -1, 110, 85, 32, 32 + ICON "", IDC_NETSTAT, 110, 85, 32, 32 LTEXT "", -1, 149, 90, 37, 8 LTEXT ":", -1, 17, 115, 32, 8 RTEXT "000.000.000", IDC_SEND, 63, 115, 44, 8 diff --git a/reactos/dll/win32/netshell/lang/zh-CN.rc b/reactos/dll/win32/netshell/lang/zh-CN.rc index 184a73c0f7a..45acd1f3aa6 100644 --- a/reactos/dll/win32/netshell/lang/zh-CN.rc +++ b/reactos/dll/win32/netshell/lang/zh-CN.rc @@ -36,7 +36,7 @@ BEGIN LTEXT "ٶ:", -1, 19, 48, 60, 8 GROUPBOX "Activity", -1, 9, 74, 182, 70, BS_GROUPBOX RTEXT "", -1, 26, 90, 60, 8 - ICON IDI_NETSTAT, -1, 110, 85, 32, 32 + ICON "", IDC_NETSTAT, 110, 85, 32, 32 LTEXT "", -1, 149, 90, 37, 8 LTEXT "Bytes:", -1, 17, 115, 32, 8 RTEXT "000.000.000", IDC_SEND, 63, 115, 44, 8 From 0554e844fcaa573f5b8d8daf8bbf683df98a43c8 Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Mon, 26 Apr 2010 19:01:37 +0000 Subject: [PATCH 072/131] [EXPLORER] Add missing 24bpp start menu icon, created by Gabriel Ilardi See issue #5007 for more details. svn path=/trunk/; revision=47042 --- reactos/base/shell/explorer/res/startmenu.ico | Bin 25214 -> 36710 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/reactos/base/shell/explorer/res/startmenu.ico b/reactos/base/shell/explorer/res/startmenu.ico index 492e388a939f05b77da8a5a5681b2843e38b3a55..b0c5059f3d82ab5a34978dbb7ec8989290606d5a 100644 GIT binary patch delta 8744 zcmdT}d0bTG-hUu<$b8i-%WP50HZxzdZjq*_A-JH3g2=wj!p^YFoMD?8aF{v3FawSV zilVrJ;S!j+hl&d+D(+hdD9mUmm|&8(?gb-A=re>kxpglXO-kP; zWQTkA0z8B8lBDkWqe*B#LjK4i#NMs7cm_fbFv>JVHi`I?TadjNGM^Xc>9-)VHly9VdP4QSPTXa#12#Vi!El4`8Oyd}JRjMAVmuv#Z)xljZ#h@2-x1QvzatYqa*&WzG*CIUGp z7YG>)tbsk@OqsW0Tw+yIY0z0La-mS+Kw%o$-r8ioRn4E7(E#b7-m`4VqndV&g!0Vn1LI{8-+y3 zkp~_j=v`+8+sU$>25iu;n=#|WfC|5vEm|k5p9De)%NmVFmTj|G6v|K`Z#Tk#3W!ib zEC}i4jvOI@kimGD5icO9fw4$=2)f$gZqZF8`o zN+1U;)Zk1h3EH|frUN{PFpLK}-Ucb@M&Z`I2`q+AmNC^0YpOi^s>a5Y^u~Mtd1x$A z*(r40l)38wx$~bQKp@o#nP|iX-m*9ZhzK!bZc$1ZxrokG5WpqHa7yCj$U#fMhFZ){ zfWCwkaFl>!rQBK0mu}k1Z zpgOQ>)0lx`Q~hX-Y0>Ndu}i*w{q==*Oek*&sXRKGkpzNzicA8-+gT)HC33J`Bx_g# zV`yQPWsx0$?17h^MxeD*CHVw(2sTW%y? zq#&ZW1mYVfA|VMe#5Z0>;uGV!Llosp6w*i%CyK)nk0XdA#Ke=~pizp$b;>2u0NNkp zDm>mn${v}CX>LDCJG$Rn!^!TE`Q+Kz_sHI%_mIlFNDX~Ic;Eq3!?4DUi(Y)zWILc+ zp|J!0TNSDtJaA3Fywz4kzCI|kaU@dv4o=}x$6tvwwS!E~>L4p&FnTHp3=D z<3JoXWCYIGUadUh{d~U>D^{$K%MpRSTU=b6QmKSxWn=Yfi9znI6Fcgo7Od4qtu`c? z*jNm@ySw}Q`(p_|F>;>L&wg3Z7ls(ObpOv|X1oyX@O-Mr1e4sm*qFRBDwUOxYHXJwpbJIjp?n_ad#Gj~~pAw6tWwrq8Jc&g{b@X60cO&yGzRVon(n=&GE z)WK^rJ+|jL9xnRi#JchPj{9=sw6!`{yan6f;9x2xvcnKu!2^7IIE_%{D1!@9gA1}^ zFcpS?VZgOeD}@A5B+OnA@BA9{swj#)yM6xU@{cZmH39pjZR4#HhdiZxm~Q| z%X#tc2RB7su9$c2>#0|FPUa=)5#z#^u~-Fn0Y3l|Gk( z;d9pJrCM!g%0LqfX-j~&jL7itaEycd$uifQ-@0JGwRgd-1D;?C%tcIj4y5Gs#uTLq zk8O*Bcs*jA{>lSxD@^eRWZ+A{2b1|dZq_Sm@4w~7c>vz4wb1}8MqqOQ!)kC7OJ!hV zHy3DO7-08c$UaCQpoSwM4M#-Xdr0j!2>=E>0>eU6iXXiU1YuaP=A*GFc_AE8y4(wR;DOFF0^T4} z#FRmRM7~Z6|Bnq@t`S}N){EmKYB(xstd3}`j%qp{-Lqq)?qC{ll<4{nI6%e3h411K zn1UdC*N4zx`Dy~3kI;bY5CS|mz%V~G1Xckz6UXgc@t!ro(4_HLI3<4~_Rh(KyQi4D zHHrLw{b>63)iUH2CkUyW* zQkPe=#|ZahDTl~Ga+fy&L=3i^H-bL|fjHn(e=Gq|;A0PpA&{UvQVDE`behk`0T$r! zu{WTFMObR7%eh=#RKiA3v`-!g@}P}J4Bo$5eE-U-`9%IGaJ4oRR}H2!vGk z519XT^`JWAfQ4|9taK)`qJ@DZS^}I+$zJ~dSla% z*C>-eaX6U(99}sPVYS%gfe2!x8Nd%dLE4}SgaAKRt8)vIy!lXsQ*lpeH|%L|;`YYM zwuTC@YQ4F&^?FG!6WFRI5k5o&05m8lpa56^egH3W6PO?`AY#F1Tp02*uLCrNzDQ^_ z`wJg59{lOi+$#Oxe`>_}m-d^Ghe~3uhMax1rx=BEPceWG zGAR-(DhetGk}Mh-xER79^59}uSJ$3;PEZm!84$h*88{eTL9|mb8my-1`0*TMfB;WB zTAn_+hyB-|??4jB23PO~p>PJwcqi}}J01-&P);BQVh~6|0p@EPz=leUv;s+Jar#TY zfZ~98z~xG{7}nv9wXc+IZ>$6}u%t$5zX@r6>ume`)5qAUOg}YRP1ACO2P5yHUQ|$l zL{y-CZYUaj3qZ@1pUNKb3D_YGBB%0zw7Ll2yy;;m@pub)p+VnqppzE}jNu#z0a5<= z`%|2M`=yl{sqLE8S9kW)SnP&OFHAXsRH#d+C$x3qHokVElRyxle#3OVB^(0Dz0tm* z`GA}BdVP;TxB-3;ng4GKsrbM_Ug$OvK*J}3q$K>NM>oiX38(E!R}TP(zeSVO`9SpOx4RR0D<=*?h!G@7tK${>D%0}pg@XmjBgG(s@ap9J!n z1bm_K0G81l;tXqH4%!|NK@qrex(r65@y*4S3eNkt!PS$?P$_9S)JajYXckKkM>CHd zBgiMHm+;P()ofpvp+duJn2b~aQz6M=K41>>P}>6k(2NR2lg>E`Z!YgZz<-f+_?m~l z4AM|4gg~==6uGDc=nqf@kx*b8L_S~y)ioLoKdt8sU}0^R%0`52I6ROh`%?Ddog>sX zeKYOdL)L)0xwSXb)~2JlqZP%f9)kQ0v_<0pB@s7}0Tw~hf#JdA(+_dwO9=8Cg6Gkl z{XA`J0^y6{ITj59`ZcV0V-Phq8;f=HCe7Ai46Xn=sGv$CPocs!ohv{&M8AQi3d`^j z=+fVG_EmdTrvRVGU4*pLPi5{(FhZY+%^yQ>olZyp& z8UN$70KcwusRL3x`^aY1JuuyAYH&Qz_pV;kKzO(1cV#t zGZ-CF6VeX?EW>pGy;eaUT=B>W)^mlxfzOy)UlR`-jW^SA^n45ts(gNAiOnE<4C6Oa zB$rjIR^bD9!3g~_S**x2O6V0G>K`ulK~I5jLa@TPvsGD9^Rr{!)d7=JJSL?3eV!v* zYD^9G@^JI@b{7YEg$kF3i#)O8Mk4eMlLXVRE0YOq|FVG}w!aMGu^>$%mj=g1hb~Kr z&5T)?>^`2E|CUxftC$TrQsR7CwQ171E#uE^8CO#>?nu%2m>_#UPiG$=AB92zJs>2) zDk>~ET;wed_6+o25*8MglatezO-`z0bymD8S%x2VF>ca`wq`EQ@O>}N@#QSZ^ol&! z^W~10cYJoaeBz~TA6(e-=Gl#7Bt8!Ai{=?s!W@OlHz&@670*)pe3}t7ZMni{g*K}1 zhXv1Rl{Oki#7}rKY3RX{#aAllo!!2;T<T0;m+-+Pn>#u^UQMmyQL%0-vXU}VBa&hk-rDc+ z!$Gef4*Ap{_B+2@v`#rY!Fgo-?AO*U^ZvFtB2zqrHoVh@C|pMA0zdR|oe?GR%TUrU zzSvM7gx~Vi5IA&!pJko#mTB=~ai)VomdDB}(hfpoqsxtcwPiEH17<{seL!Q(%uTD5E$7$^hcfeGoa3EdNpgF4t3LF` z$)bDLHq*>^xzJpvZ?4rq+#83ZwrJ+WJB@(8>(boQ;^upJcxbg+ka=SktCE!J1LgBZ zrMi#Xnk~6|c~^VWzVS4pZidnw)DgcH%BdM=vh z>%GMK>yAnu9h4K}66f^Fa_OA&hYMP7@29<~?_&HS z)k~PWOOyttcuv#^XXb0eELTfuOKUmt z)?~)S#>Vn?GR7`Wj1$XZBa@iejPw+ZO15=%>Vw839jzBQ3*Ds_QvI`ufWDInw+@T9 zvwuh4gFDsm z0v!D0;gyco^Dxh!U9A4$XlzBXWW%}wV}?q;JS7;}S>-=DT{IIBvr;YLsq^RctFqUu zq-nPAR#uXG^-TH0rlY+et>5wE^$h^&ozuEAdzf6Etnd7i)j1}uOe1kJGTzzC;`_cb z<=DPDV(U8n_lJsZp4oi=`ZmjzlItgypQuPLHYHXzelD@ae{F`kcB;C%8b;wD0&@c@ zU?Yxp9H_2uq0)YdLxB4sI2>?{qW5?&z+6EU>M0r{8+xd5q@iX^9rO0{Lka%5jiaZW zn!a{<-!yUH!Vw$R=I7>UGcqz%Divx#R#q0;a1=X){&3a$d@Y+C78fu_Bbq7nT^Jtd z7!y1_B4}oi??QwK{#l)-PEJXTTb7pE1GT~&CHPbpdaRM#XNG+I-CF0%+drw@GAYn~ zdRnjpB2*JJO&{mp<5)~CWP?x*@Kt?!dyvL&(sHR|y5DEZ!^Y>SWDY({7bQga%Y^u6 zeeZUwD(dd{$(Qyg7R1j?^ZMTswM(k|`}+%B&Tg5o)MG)M#QNJ3zhL*SEsZr9o3)}us@lPAw2N`+gKfWZO_8AKzpg* z99dk9R4Of7zd{+cbi?{J>kHEm8NYQtM0BG$eOSNUQfFv79;0OzWa`qx+^5D17bDvI zN>*xD<)jqkWfbM>ny&4qAIv=r&ShTQ7nz+FqgO_0qQ}*hKc=5(`OH_ KeDvPfF|DB&sw_X1%=Mv>;74`I}Ri}d;L~jw%;9$02)QPS`H!{-PcM-jhC*$X7I7hT+ zpvBMA&uv6UHnjM8I(P@svm0CdK{}Wxx^#DoKS+z~;dtx4tpiYOA^P@yqUgk?jnQ(o zGyY`LRIZm*tQu=T7I*#0Do1PVzBg(t+Oc_k9~(cb(N|%OIYtMS=V}bW(+-7xoga@b zZSH=??MFKe+eM8~>@9-p!&oyz3&VS8eF^1$R&xv_Rv)fAbHIX zuen)SS%J=@hQje`G(Q^ICOWAN?A1issVLm@$Hs&;LYka?&C)%rRw=|(YTFs#2ZqfU zyWo*tcI%Q`L|KlTU;{ohDheRD_o}E0D&kCBeCEgn^=y#!BO;37@gj`k_!3<9~A|3mNWP zD2>Y`_lq9r`Y3Z<7ko#W%AYR)*BST=q6pX`-f$bt<=mlC@EGXa7BX^FNQ~EIg|wM01eF6rONOJ%`JGYMrsF5Syrr(d%%Qxn zguwrDt!s^%mQbnvPlOO=NeCa!NekVAeY9xC@MR299U+mO7T5^W6iGPC7d+(U`zfG9 zA2J0bah#xYhLKj1gr_G<%r%WCmv}H^nx-#GX%BQ;Pq<7>lUXNm4!nI{>Rq7OoY_Xv zH%Ac$Wi3I~WsoEx^NpeilZ5niQgA}&9EFdH%J~xXR%V7mbWi%G85l<3j)iDqY97;u zLeCaP1MV0_eyZG36ZjWQE0B`Um=;&pB$I$Sg%UzS`wb(UYpIEIs4-O%Z7meD!BQZ~ zkg9FQ#UKrAsojMS)eHpj$ r8*X9`-i-Ie2fF)n@$3B6?lmI-_TLO{jtj#-v_~fnb;cizpV{~y)r9y7 From 42c28cc44f397363225de805fe8afb07ba408e80 Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Mon, 26 Apr 2010 19:50:11 +0000 Subject: [PATCH 073/131] [SHELL32] - Start implementing file copy / move / delete dialog - Not yet enabled svn path=/trunk/; revision=47043 --- reactos/dll/win32/shell32/lang/en-US.rc | 11 ++ reactos/dll/win32/shell32/shlfileop.c | 214 +++++++++++++++++++++--- reactos/dll/win32/shell32/shresdef.h | 1 + 3 files changed, 205 insertions(+), 21 deletions(-) diff --git a/reactos/dll/win32/shell32/lang/en-US.rc b/reactos/dll/win32/shell32/lang/en-US.rc index 6e8aef34ee0..04df98d1e60 100644 --- a/reactos/dll/win32/shell32/lang/en-US.rc +++ b/reactos/dll/win32/shell32/lang/en-US.rc @@ -373,6 +373,17 @@ BEGIN PUSHBUTTON "Cancel", 14006, 206, 236, 50, 14 END +IDD_SH_FILE_COPY DIALOGEX 0, 0, 264, 45 +STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION +CAPTION "Copying..." +FONT 8, "MS Shell Dlg", 0, 0, 0x0 +BEGIN + PUSHBUTTON "Cancel", 14002, 195, 14, 60, 16 + CONTROL "", 14000, "MSCTLS_PROGRESS32", 0, 8, 20, 170, 10 + LTEXT "File", 14001, 8, 6, 169, 10 +END + + FOLDER_OPTIONS_GENERAL_DLG DIALOGEX 0, 0, 264, 256 STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION CAPTION "General" diff --git a/reactos/dll/win32/shell32/shlfileop.c b/reactos/dll/win32/shell32/shlfileop.c index 6992d187ee4..defe95facd6 100644 --- a/reactos/dll/win32/shell32/shlfileop.c +++ b/reactos/dll/win32/shell32/shlfileop.c @@ -33,6 +33,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(shell); #define IsDotDir(x) ((x[0] == '.') && ((x[1] == 0) || ((x[1] == '.') && (x[2] == 0)))) #define FO_MASK 0xF +#define WM_FILE (WM_USER + 1) +#define TIMER_ID (100) static const WCHAR wWildcardFile[] = {'*',0}; static const WCHAR wWildcardChars[] = {'*','?',0}; @@ -52,6 +54,40 @@ typedef struct BOOL bCancelled; } FILE_OPERATION; +#define ERROR_SHELL_INTERNAL_FILE_NOT_FOUND 1026 + +typedef struct +{ + DWORD attributes; + LPWSTR szDirectory; + LPWSTR szFilename; + LPWSTR szFullPath; + BOOL bFromWildcard; + BOOL bFromRelative; + BOOL bExists; +} FILE_ENTRY; + +typedef struct +{ + FILE_ENTRY *feFiles; + DWORD num_alloc; + DWORD dwNumFiles; + BOOL bAnyFromWildcard; + BOOL bAnyDirectories; + BOOL bAnyDontExist; +} FILE_LIST; + +typedef struct +{ + FILE_LIST * from; + FILE_LIST * to; + FILE_OPERATION * op; + DWORD Index; + HWND hDlgCtrl; + HWND hwndDlg; +}FILE_OPERATION_CONTEXT; + + /* Confirm dialogs with an optional "Yes To All" as used in file operations confirmations */ static const WCHAR CONFIRM_MSG_PROP[] = {'W','I','N','E','_','C','O','N','F','I','R','M',0}; @@ -514,6 +550,163 @@ static DWORD SHNotifyMoveFileW(LPCWSTR src, LPCWSTR dest) return GetLastError(); } +static WINAPI DWORD SHOperationProgressRoutine(LARGE_INTEGER TotalFileSize, LARGE_INTEGER TotalBytesTransferred, LARGE_INTEGER StreamSize, LARGE_INTEGER StreamBytesTransferred, DWORD dwStreamNumber, DWORD dwCallbackReason, HANDLE hSourceFile, HANDLE hDestinationFile, LPVOID lpData) +{ + FILE_OPERATION_CONTEXT * Context; + LARGE_INTEGER Progress; + + /* get context */ + Context = (FILE_OPERATION_CONTEXT*)lpData; + + if (TotalBytesTransferred.QuadPart) + { + Progress.QuadPart = (TotalBytesTransferred.QuadPart * 100) / TotalFileSize.QuadPart; + } + else + { + Progress.QuadPart = 1; + } + + /* update progress bar */ + SendMessageW(Context->hDlgCtrl, PBM_SETPOS, (WPARAM)Progress.u.LowPart, 0); + + if (TotalBytesTransferred.QuadPart == TotalFileSize.QuadPart) + { + /* file was copied */ + Context->Index++; + PostMessageW(Context->hwndDlg, WM_FILE, 0, 0); + } + + return PROGRESS_CONTINUE; +} + +BOOL +QueueFile( + FILE_OPERATION_CONTEXT * Context) +{ + FILE_ENTRY * from, *to; + BOOL bRet = FALSE; + + if (Context->Index >= Context->from->dwNumFiles) + return FALSE; + + /* get current file */ + from = &Context->from->feFiles[Context->Index]; + + if (Context->op->req->fFlags != FO_DELETE) + to = &Context->to->feFiles[Context->Index]; + + /* update status */ + SendDlgItemMessageW(Context->hwndDlg, 14001, WM_SETTEXT, 0, (LPARAM)from->szFullPath); + + if (Context->op->req->wFunc == FO_COPY) + { + bRet = CopyFileExW(from->szFullPath, to->szFullPath, SHOperationProgressRoutine, (LPVOID)Context, &Context->op->bCancelled, 0); + } + else if (Context->op->req->wFunc == FO_MOVE) + { + //bRet = MoveFileWithProgressW(from->szFullPath, to->szFullPath, SHOperationProgressRoutine, (LPVOID)Context, MOVEFILE_COPY_ALLOWED); + } + else if (Context->op->req->wFunc == FO_DELETE) + { + bRet = DeleteFile(from->szFullPath); + } + + return bRet; +} + +static INT_PTR CALLBACK SHOperationDialog(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + FILE_OPERATION_CONTEXT * Context; + + Context = (FILE_OPERATION_CONTEXT*) GetWindowLongPtr(hwndDlg, DWLP_USER); + + switch(uMsg) + { + case WM_INITDIALOG: + SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG)lParam); + + /* get context */ + Context = (FILE_OPERATION_CONTEXT*)lParam; + + /* store progress bar handle */ + Context->hDlgCtrl = GetDlgItem(hwndDlg, 14000); + + /* store window handle */ + Context->hwndDlg = hwndDlg; + + /* set progress bar range */ + (void)SendMessageW(Context->hDlgCtrl, (UINT) PBM_SETRANGE, 0, MAKELPARAM(0, 100)); + + /* start file queueing */ + SetTimer(hwndDlg, TIMER_ID, 1000, NULL); + //QueueFile(Context); + + return TRUE; + + case WM_CLOSE: + Context->op->bCancelled = TRUE; + EndDialog(hwndDlg, Context->op->bCancelled); + return TRUE; + case WM_COMMAND: + if (LOWORD(wParam) == 14002) + { + Context->op->bCancelled = TRUE; + EndDialog(hwndDlg, Context->op->bCancelled); + return TRUE; + } + break; + case WM_TIMER: + if (wParam == TIMER_ID) + { + QueueFile(Context); + KillTimer(hwndDlg, TIMER_ID); + } + break; + case WM_FILE: + if (!QueueFile(Context)) + EndDialog(hwndDlg, Context->op->bCancelled); + default: + break; + } + return FALSE; +} + +HRESULT +SHShowFileOperationDialog(FILE_OPERATION *op, FILE_LIST *flFrom, FILE_LIST *flTo) +{ + HWND hwnd; + BOOL bRet; + MSG msg; + FILE_OPERATION_CONTEXT Context; + + Context.from = flFrom; + Context.to = flTo; + Context.op = op; + Context.Index = 0; + Context.op->bCancelled = FALSE; + + hwnd = CreateDialogParam(shell32_hInstance, MAKEINTRESOURCE(IDD_SH_FILE_COPY), NULL, SHOperationDialog, (LPARAM)&Context); + if (hwnd == NULL) + { + ERR("Failed to create dialog\n"); + return E_FAIL; + } + ShowWindow(hwnd, SW_SHOWNORMAL); + + while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0) + { + if (!IsWindow(hwnd) || !IsDialogMessage(hwnd, &msg)) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + } + + return NOERROR; +} + + /************************************************************************ * SHNotifyCopyFile [internal] * @@ -808,28 +1001,7 @@ int WINAPI SHFileOperationA(LPSHFILEOPSTRUCTA lpFileOp) return retCode; } -#define ERROR_SHELL_INTERNAL_FILE_NOT_FOUND 1026 -typedef struct -{ - DWORD attributes; - LPWSTR szDirectory; - LPWSTR szFilename; - LPWSTR szFullPath; - BOOL bFromWildcard; - BOOL bFromRelative; - BOOL bExists; -} FILE_ENTRY; - -typedef struct -{ - FILE_ENTRY *feFiles; - DWORD num_alloc; - DWORD dwNumFiles; - BOOL bAnyFromWildcard; - BOOL bAnyDirectories; - BOOL bAnyDontExist; -} FILE_LIST; static void __inline grow_list(FILE_LIST *list) diff --git a/reactos/dll/win32/shell32/shresdef.h b/reactos/dll/win32/shell32/shresdef.h index 93b50975a07..43e409cbf44 100644 --- a/reactos/dll/win32/shell32/shresdef.h +++ b/reactos/dll/win32/shell32/shresdef.h @@ -193,6 +193,7 @@ #define IDD_TREEVIEW 0x3741 #define SHELL_EXTENDED_SHORTCUT_DLG 0x4000 #define OPEN_WITH_PROGRAMM_DLG 0x4001 +#define IDD_SH_FILE_COPY 0x4002 /* ID's of the ShellAbout controls */ // Part 1 - ID's identical to Windows Server 2003 SP1's shell32.dll From 2e62657924092429314dd529c04a9eaa4c814ba5 Mon Sep 17 00:00:00 2001 From: Daniel Reimer Date: Tue, 27 Apr 2010 06:31:32 +0000 Subject: [PATCH 074/131] Update rapps Database to recent Versions. svn path=/trunk/; revision=47046 --- reactos/base/applications/rapps/rapps/mirandaim.txt | 4 ++-- reactos/base/applications/rapps/rapps/opera.txt | 6 +++--- reactos/base/applications/rapps/rapps/scite.txt | 4 ++-- reactos/base/applications/rapps/rapps/utorrent.txt | 6 +++--- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/reactos/base/applications/rapps/rapps/mirandaim.txt b/reactos/base/applications/rapps/rapps/mirandaim.txt index db0b17f1ab6..e1f66280ecc 100644 --- a/reactos/base/applications/rapps/rapps/mirandaim.txt +++ b/reactos/base/applications/rapps/rapps/mirandaim.txt @@ -2,13 +2,13 @@ [Section] Name = Miranda IM -Version = 0.8.19 +Version = 0.8.21 Licence = GPL Description = Open source multiprotocol instant messaging application - May not work completely. Size = 1.6MB Category = 5 URLSite = http://www.miranda-im.org/ -URLDownload = http://miranda.googlecode.com/files/miranda-im-v0.8.19-unicode.exe +URLDownload = http://miranda.googlecode.com/files/miranda-im-v0.8.21-unicode.exe CDPath = none [Section.0407] diff --git a/reactos/base/applications/rapps/rapps/opera.txt b/reactos/base/applications/rapps/rapps/opera.txt index 44e49cc61ac..aee4c21a933 100644 --- a/reactos/base/applications/rapps/rapps/opera.txt +++ b/reactos/base/applications/rapps/rapps/opera.txt @@ -2,13 +2,13 @@ [Section] Name = Opera -Version = 10.51 +Version = 10.52 Licence = Freeware Description = The popular Opera Browser with many advanced features and including a Mail and BitTorrent client. -Size = 11.0M +Size = 12.0M Category = 5 URLSite = http://www.opera.com/ -URLDownload = http://get4.opera.com/pub/opera/win/1051/int/Opera_1051_int_Setup.exe +URLDownload = http://get4.opera.com/pub/opera/win/1052/int/Opera_1052_int_Setup.exe CDPath = none [Section.0407] diff --git a/reactos/base/applications/rapps/rapps/scite.txt b/reactos/base/applications/rapps/rapps/scite.txt index 1f8208b2153..c32df9cd195 100644 --- a/reactos/base/applications/rapps/rapps/scite.txt +++ b/reactos/base/applications/rapps/rapps/scite.txt @@ -2,13 +2,13 @@ [Section] Name = SciTE -Version = 2.10 +Version = 2.11 Licence = Freeware Description = SciTE is a SCIntilla based Text Editor. Originally built to demonstrate Scintilla, it has grown to be a generally useful editor with facilities for building and running programs. Size = 0.6M Category = 7 URLSite = http://www.scintilla.org/ -URLDownload = http://ovh.dl.sourceforge.net/sourceforge/scintilla/Sc210.exe +URLDownload = http://ovh.dl.sourceforge.net/sourceforge/scintilla/Sc211.exe CDPath = none [Section.0407] diff --git a/reactos/base/applications/rapps/rapps/utorrent.txt b/reactos/base/applications/rapps/rapps/utorrent.txt index 988263777c5..ffcded74c34 100644 --- a/reactos/base/applications/rapps/rapps/utorrent.txt +++ b/reactos/base/applications/rapps/rapps/utorrent.txt @@ -2,13 +2,13 @@ [Section] Name = µTorrent -Version = 2.0 +Version = 2.0.1 Licence = Freeware for non-commercial uses Description = Small and fast BitTorrent Client. -Size = 312K +Size = 314K Category = 5 URLSite = http://www.utorrent.com/ -URLDownload = http://download.utorrent.com/2.0/utorrent.exe +URLDownload = http://download.utorrent.com/2.0.1/utorrent.exe CDPath = none From e2463c955c8dcb8fbbec110b13474882cdfc805a Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Tue, 27 Apr 2010 13:06:42 +0000 Subject: [PATCH 075/131] [KMTEST] - Add KeStallExecutionProcessor test. svn path=/trunk/; revision=47047 --- rostests/drivers/kmtest/kmtest.c | 2 + rostests/drivers/kmtest/kmtest.rbuild | 1 + rostests/drivers/kmtest/ntos_ke.c | 86 +++++++++++++++++++++++++++ 3 files changed, 89 insertions(+) create mode 100644 rostests/drivers/kmtest/ntos_ke.c diff --git a/rostests/drivers/kmtest/kmtest.c b/rostests/drivers/kmtest/kmtest.c index 948797a3273..964486a93f6 100644 --- a/rostests/drivers/kmtest/kmtest.c +++ b/rostests/drivers/kmtest/kmtest.c @@ -106,6 +106,7 @@ PWCHAR CreateLowerDeviceRegistryKey(PUNICODE_STRING RegistryPath, PWCHAR NewDriv * Test Declarations */ VOID NtoskrnlIoTests(); +VOID NtoskrnlKeTests(); VOID NtoskrnlObTest(); VOID NtoskrnlExecutiveTests(); VOID NtoskrnlPoolsTest(); @@ -214,6 +215,7 @@ DriverEntry(PDRIVER_OBJECT DriverObject, ThisDriverObject = DriverObject; NtoskrnlExecutiveTests(); + NtoskrnlKeTests(); NtoskrnlIoTests(); NtoskrnlObTest(); NtoskrnlPoolsTest(); diff --git a/rostests/drivers/kmtest/kmtest.rbuild b/rostests/drivers/kmtest/kmtest.rbuild index e45f8a6baea..9219db9f9c1 100644 --- a/rostests/drivers/kmtest/kmtest.rbuild +++ b/rostests/drivers/kmtest/kmtest.rbuild @@ -12,6 +12,7 @@ reghelper.c ntos_ex.c ntos_io.c + ntos_ke.c ntos_ob.c ntos_pools.c kmtest.rc diff --git a/rostests/drivers/kmtest/ntos_ke.c b/rostests/drivers/kmtest/ntos_ke.c new file mode 100644 index 00000000000..1c6032238be --- /dev/null +++ b/rostests/drivers/kmtest/ntos_ke.c @@ -0,0 +1,86 @@ +/* + * NTOSKRNL Executive Regressions KM-Test + * ReactOS Kernel Mode Regression Testing framework + * + * Copyright 2006 Aleksey Bragin + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; see the file COPYING.LIB. + * If not, write to the Free Software Foundation, + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +/* INCLUDES *******************************************************************/ + +#include +#include +#include +#include "kmtest.h" + +#define NDEBUG +#include "debug.h" + +/* PRIVATE FUNCTIONS ***********************************************************/ + +VOID +NTAPI +KeStallTest() +{ + ULONG i; + LARGE_INTEGER TimeStart, TimeFinish; + + StartTest(); + + DPRINT1("Waiting for 30 secs with 50us stalls...\n"); + KeQuerySystemTime(&TimeStart); + for (i = 0; i < (30*1000*20); i++) + { + KeStallExecutionProcessor(50); + } + KeQuerySystemTime(&TimeFinish); + DPRINT1("Time elapsed: %d secs\n", (TimeFinish.QuadPart - TimeStart.QuadPart) / 10000000); // 30 + + DPRINT1("Waiting for 30 secs with 1000us stalls...\n"); + KeQuerySystemTime(&TimeStart); + for (i = 0; i < (30*1000); i++) + { + KeStallExecutionProcessor(1000); + } + KeQuerySystemTime(&TimeFinish); + DPRINT1("Time elapsed: %d secs\n", (TimeFinish.QuadPart - TimeStart.QuadPart) / 10000000); // 30 + + DPRINT1("Waiting for 30 secs with 1us stalls...\n"); + KeQuerySystemTime(&TimeStart); + for (i = 0; i < (30*1000*1000); i++) + { + KeStallExecutionProcessor(1); + } + KeQuerySystemTime(&TimeFinish); + DPRINT1("Time elapsed: %d secs\n", (TimeFinish.QuadPart - TimeStart.QuadPart) / 10000000); // 43 + + DPRINT1("Waiting for 30 secs with one huge stall...\n"); + KeQuerySystemTime(&TimeStart); + KeStallExecutionProcessor(30*1000000); + KeQuerySystemTime(&TimeFinish); + DPRINT1("Time elapsed: %d secs\n", (TimeFinish.QuadPart - TimeStart.QuadPart) / 10000000); // 30 + + FinishTest("NTOSKRNL KeStallmanExecution test"); +} + +/* PUBLIC FUNCTIONS ***********************************************************/ + +VOID +NtoskrnlKeTests() +{ + KeStallTest(); +} From 60eddf565732fba67b051990f95c1471710cd8f9 Mon Sep 17 00:00:00 2001 From: Michael Martin Date: Tue, 27 Apr 2010 13:35:52 +0000 Subject: [PATCH 076/131] [ntoskrnl\mm] - Fix a continuous loop bug in MiWriteProtectSystemImage. svn path=/trunk/; revision=47048 --- reactos/ntoskrnl/mm/sysldr.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/reactos/ntoskrnl/mm/sysldr.c b/reactos/ntoskrnl/mm/sysldr.c index 1fb86f95d01..fcecf3c8da5 100644 --- a/reactos/ntoskrnl/mm/sysldr.c +++ b/reactos/ntoskrnl/mm/sysldr.c @@ -2154,6 +2154,10 @@ MiWriteProtectSystemImage(IN PVOID ImageBase) { /* Same protection, so merge the request */ CurrentAddress = BaseAddress + Size - 1; + + /* Next */ + Sections--; + Section++; continue; } From 02c3f0fa12720e3962587014c8d825a20dd7106e Mon Sep 17 00:00:00 2001 From: Michael Martin Date: Tue, 27 Apr 2010 13:41:37 +0000 Subject: [PATCH 077/131] [ntoskrnl/io] - Check for null pointers before attempting to copy or free memory. svn path=/trunk/; revision=47049 --- reactos/ntoskrnl/io/iomgr/deviface.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/reactos/ntoskrnl/io/iomgr/deviface.c b/reactos/ntoskrnl/io/iomgr/deviface.c index 8a8db7a843f..7d97336cc16 100644 --- a/reactos/ntoskrnl/io/iomgr/deviface.c +++ b/reactos/ntoskrnl/io/iomgr/deviface.c @@ -884,7 +884,8 @@ IoGetDeviceInterfaces(IN CONST GUID *InterfaceClassGuid, NextReferenceString: ExFreePool(ReferenceBi); ReferenceBi = NULL; - ExFreePool(bip); + if (bip) + ExFreePool(bip); bip = NULL; if (ReferenceKey != INVALID_HANDLE_VALUE) { @@ -921,8 +922,11 @@ NextReferenceString: Status = STATUS_INSUFFICIENT_RESOURCES; goto cleanup; } - RtlCopyMemory(NewBuffer, ReturnBuffer.Buffer, ReturnBuffer.Length); - ExFreePool(ReturnBuffer.Buffer); + if (ReturnBuffer.Buffer) + { + RtlCopyMemory(NewBuffer, ReturnBuffer.Buffer, ReturnBuffer.Length); + ExFreePool(ReturnBuffer.Buffer); + } ReturnBuffer.Buffer = NewBuffer; } ReturnBuffer.Buffer[ReturnBuffer.Length / sizeof(WCHAR)] = UNICODE_NULL; From d39102cd836a3465172f862fa037132b448d1b85 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Tue, 27 Apr 2010 21:47:54 +0000 Subject: [PATCH 078/131] [MKHIVE] - Add RegDeleteKeyW stub. - Implement RegDeleteKeyA so that it calls RegDeleteKeyW. svn path=/trunk/; revision=47050 --- reactos/tools/mkhive/registry.c | 39 ++++++++++++++++++++++++++------- 1 file changed, 31 insertions(+), 8 deletions(-) diff --git a/reactos/tools/mkhive/registry.c b/reactos/tools/mkhive/registry.c index 3bd2c9efe60..a6d7d4b248f 100644 --- a/reactos/tools/mkhive/registry.c +++ b/reactos/tools/mkhive/registry.c @@ -25,9 +25,9 @@ /* * TODO: - * - Implement RegDeleteKey() + * - Implement RegDeleteKeyW() * - Implement RegEnumValue() - * - Implement RegQueryValueExA() + * - Implement RegQueryValueExW() */ #include @@ -246,15 +246,38 @@ RegCreateKeyA( } LONG WINAPI -RegDeleteKeyA(HKEY Key, - LPCSTR Name) +RegDeleteKeyW( + IN HKEY hKey, + IN LPCWSTR lpSubKey) { - if (Name != NULL && strchr(Name, '\\') != NULL) - return(ERROR_INVALID_PARAMETER); + DPRINT1("FIXME!\n"); + return ERROR_SUCCESS; +} - DPRINT1("FIXME!\n"); +LONG WINAPI +RegDeleteKeyA( + IN HKEY hKey, + IN LPCSTR lpSubKey) +{ + PWSTR lpSubKeyW = NULL; + LONG rc; - return(ERROR_SUCCESS); + if (lpSubKey != NULL && strchr(lpSubKey, '\\') != NULL) + return ERROR_INVALID_PARAMETER; + + if (lpSubKey) + { + lpSubKeyW = MultiByteToWideChar(lpSubKey); + if (!lpSubKeyW) + return ERROR_OUTOFMEMORY; + } + + rc = RegDeleteKeyW(hKey, lpSubKeyW); + + if (lpSubKey) + free(lpSubKeyW); + + return rc; } LONG WINAPI From 5f783c4e2d6dd11d366ffd9a8636a03b5819cd2f Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Tue, 27 Apr 2010 22:12:11 +0000 Subject: [PATCH 079/131] [FREELDR] - Set the partition count to 0 for a floppy drive so it can be told apart from a cd-rom drive - Add a last-chance sector size detection algorithm based on the partition number - Add the same detection code to the xbox code too (it is essentially the same as what was already there just with more comments) - Change DiskNormalizeSystemPath so it doesn't try to "normalize" a floppy boot path - Fixes bug #5233 svn path=/trunk/; revision=47051 --- .../boot/freeldr/freeldr/arch/i386/hardware.c | 18 +++++++++++++++++- .../boot/freeldr/freeldr/arch/i386/xboxhw.c | 15 ++++++++++++++- reactos/boot/freeldr/freeldr/disk/disk.c | 2 +- reactos/boot/freeldr/freeldr/reactos/arcname.c | 2 +- 4 files changed, 33 insertions(+), 4 deletions(-) diff --git a/reactos/boot/freeldr/freeldr/arch/i386/hardware.c b/reactos/boot/freeldr/freeldr/arch/i386/hardware.c index 1dff167c987..97577aa020c 100644 --- a/reactos/boot/freeldr/freeldr/arch/i386/hardware.c +++ b/reactos/boot/freeldr/freeldr/arch/i386/hardware.c @@ -452,7 +452,23 @@ static LONG DiskOpen(CHAR* Path, OPENMODE OpenMode, ULONG* FileId) SectorCount = Geometry.Sectors; } else - return EINVAL; + { + DPRINTM(DPRINT_HWDETECT, "Using legacy sector size detection\n"); + + /* Fall back to legacy detection */ + if (DrivePartition == 0xff) + { + /* This is a CD-ROM device */ + SectorSize = 2048; + } + else + { + /* This is either a floppy disk device (DrivePartition == 0) or + * a hard disk device (DrivePartition != 0 && DrivePartition != 0xFF) but + * it doesn't matter which one because they both have 512 bytes per sector */ + SectorSize = 512; + } + } if (DrivePartition != 0xff && DrivePartition != 0) { diff --git a/reactos/boot/freeldr/freeldr/arch/i386/xboxhw.c b/reactos/boot/freeldr/freeldr/arch/i386/xboxhw.c index 5c7680b17ae..ff325b3dd49 100644 --- a/reactos/boot/freeldr/freeldr/arch/i386/xboxhw.c +++ b/reactos/boot/freeldr/freeldr/arch/i386/xboxhw.c @@ -138,7 +138,20 @@ static LONG DiskOpen(CHAR* Path, OPENMODE OpenMode, ULONG* FileId) if (!DissectArcPath(Path, FileName, &DriveNumber, &DrivePartition)) return EINVAL; - SectorSize = (DrivePartition == 0xff ? 2048 : 512); + + if (DrivePartition == 0xff) + { + /* This is a CD-ROM device */ + SectorSize = 2048; + } + else + { + /* This is either a floppy disk device (DrivePartition == 0) or + * a hard disk device (DrivePartition != 0 && DrivePartition != 0xFF) but + * it doesn't matter which one because they both have 512 bytes per sector */ + SectorSize = 512; + } + if (DrivePartition != 0xff && DrivePartition != 0) { if (!XboxDiskGetPartitionEntry(DriveNumber, DrivePartition, &PartitionTableEntry)) diff --git a/reactos/boot/freeldr/freeldr/disk/disk.c b/reactos/boot/freeldr/freeldr/disk/disk.c index 16ee1be7ad9..a5a65103aac 100644 --- a/reactos/boot/freeldr/freeldr/disk/disk.c +++ b/reactos/boot/freeldr/freeldr/disk/disk.c @@ -136,7 +136,7 @@ DiskNormalizeSystemPath(char *SystemPath, unsigned Size) return FALSE; } - if (0 != PartitionNumber) + if (0 != PartitionNumber || DriveNumber < 0x80) { return TRUE; } diff --git a/reactos/boot/freeldr/freeldr/reactos/arcname.c b/reactos/boot/freeldr/freeldr/reactos/arcname.c index 3ca69fadb51..3fe1fc6bd26 100644 --- a/reactos/boot/freeldr/freeldr/reactos/arcname.c +++ b/reactos/boot/freeldr/freeldr/reactos/arcname.c @@ -60,7 +60,7 @@ BOOLEAN DissectArcPath(CHAR *ArcPath, CHAR *BootPath, ULONG* BootDrive, ULONG* B if (p == NULL) return FALSE; p++; - *BootPartition = 0xff; + *BootPartition = 0; } else if (_strnicmp(p, "cdrom(", 6) == 0) { From 9adb79a0d9b3604895b167c6c8e9af526539cb9e Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Wed, 28 Apr 2010 03:07:21 +0000 Subject: [PATCH 080/131] [FREELDR] - Remove the useless function MachDiskNormalizeSystemPath - Rewrite DiskGetBootPath to be much less hacky (but still not hack free) - Freeloader doesn't have to be installed on multi(0)disk(0)rdisk(0)partition(1) (IDE primary master) anymore :) - Freeloader successfully booted ROS after loading itself from multi(0)disk(0)rdisk(1)partition(1) svn path=/trunk/; revision=47052 --- .../boot/freeldr/freeldr/arch/i386/machpc.c | 1 - .../boot/freeldr/freeldr/arch/i386/machxbox.c | 1 - .../boot/freeldr/freeldr/arch/i386/miscboot.c | 6 - .../boot/freeldr/freeldr/arch/powerpc/mach.c | 1 - reactos/boot/freeldr/freeldr/disk/disk.c | 120 ++++++++++-------- reactos/boot/freeldr/freeldr/disk/partition.c | 4 - reactos/boot/freeldr/freeldr/include/disk.h | 1 - .../boot/freeldr/freeldr/include/machine.h | 1 - reactos/boot/freeldr/freeldr/linuxboot.c | 7 - reactos/boot/freeldr/freeldr/machine.c | 7 - .../boot/freeldr/freeldr/reactos/arcname.c | 2 +- .../boot/freeldr/freeldr/reactos/reactos.c | 6 - 12 files changed, 70 insertions(+), 87 deletions(-) diff --git a/reactos/boot/freeldr/freeldr/arch/i386/machpc.c b/reactos/boot/freeldr/freeldr/arch/i386/machpc.c index 74f3e22ee4c..1b985f28c4d 100644 --- a/reactos/boot/freeldr/freeldr/arch/i386/machpc.c +++ b/reactos/boot/freeldr/freeldr/arch/i386/machpc.c @@ -45,7 +45,6 @@ PcMachInit(const char *CmdLine) MachVtbl.PrepareForReactOS = PcPrepareForReactOS; MachVtbl.GetMemoryMap = PcMemGetMemoryMap; MachVtbl.DiskGetBootPath = DiskGetBootPath; - MachVtbl.DiskNormalizeSystemPath = DiskNormalizeSystemPath; MachVtbl.DiskReadLogicalSectors = PcDiskReadLogicalSectors; MachVtbl.DiskGetDriveGeometry = PcDiskGetDriveGeometry; MachVtbl.DiskGetCacheableBlockCount = PcDiskGetCacheableBlockCount; diff --git a/reactos/boot/freeldr/freeldr/arch/i386/machxbox.c b/reactos/boot/freeldr/freeldr/arch/i386/machxbox.c index 442c7be2f1d..704a7ae91cc 100644 --- a/reactos/boot/freeldr/freeldr/arch/i386/machxbox.c +++ b/reactos/boot/freeldr/freeldr/arch/i386/machxbox.c @@ -48,7 +48,6 @@ XboxMachInit(const char *CmdLine) MachVtbl.PrepareForReactOS = XboxPrepareForReactOS; MachVtbl.GetMemoryMap = XboxMemGetMemoryMap; MachVtbl.DiskGetBootPath = DiskGetBootPath; - MachVtbl.DiskNormalizeSystemPath = DiskNormalizeSystemPath; MachVtbl.DiskReadLogicalSectors = XboxDiskReadLogicalSectors; MachVtbl.DiskGetDriveGeometry = XboxDiskGetDriveGeometry; MachVtbl.DiskGetCacheableBlockCount = XboxDiskGetCacheableBlockCount; diff --git a/reactos/boot/freeldr/freeldr/arch/i386/miscboot.c b/reactos/boot/freeldr/freeldr/arch/i386/miscboot.c index e0aa98cfd50..1f30141ce7f 100644 --- a/reactos/boot/freeldr/freeldr/arch/i386/miscboot.c +++ b/reactos/boot/freeldr/freeldr/arch/i386/miscboot.c @@ -44,12 +44,6 @@ VOID LoadAndBootBootSector(PCSTR OperatingSystemName) return; } - if (!MachDiskNormalizeSystemPath(FileName, sizeof(FileName))) - { - UiMessageBox("Invalid path to boot sector file"); - return; - } - FilePointer = FsOpenFile(FileName); if (!FilePointer) { diff --git a/reactos/boot/freeldr/freeldr/arch/powerpc/mach.c b/reactos/boot/freeldr/freeldr/arch/powerpc/mach.c index 57cacd27675..9abd56bca53 100644 --- a/reactos/boot/freeldr/freeldr/arch/powerpc/mach.c +++ b/reactos/boot/freeldr/freeldr/arch/powerpc/mach.c @@ -440,7 +440,6 @@ void PpcDefaultMachVtbl() MachVtbl.GetMemoryMap = PpcGetMemoryMap; - MachVtbl.DiskNormalizeSystemPath = DiskNormalizeSystemPath; MachVtbl.DiskGetBootPath = PpcDiskGetBootPath; MachVtbl.DiskReadLogicalSectors = PpcDiskReadLogicalSectors; MachVtbl.DiskGetDriveGeometry = PpcDiskGetDriveGeometry; diff --git a/reactos/boot/freeldr/freeldr/disk/disk.c b/reactos/boot/freeldr/freeldr/disk/disk.c index a5a65103aac..b7ce3295497 100644 --- a/reactos/boot/freeldr/freeldr/disk/disk.c +++ b/reactos/boot/freeldr/freeldr/disk/disk.c @@ -107,62 +107,80 @@ DiskGetBootPath(char *BootPath, unsigned Size) { static char Path[] = "multi(0)disk(0)"; char Device[4]; - - _itoa(BootDrive, Device, 10); - if (Size <= sizeof(Path) + 6 + strlen(Device)) + char Partition[4]; + PARTITION_TABLE_ENTRY PartitionEntry; + MASTER_BOOT_RECORD MasterBootRecord; + + if (BootDrive < 0x80) { - return FALSE; + /* This is a floppy */ + + if (Size <= sizeof(Path) + 7 + strlen(Device)) + { + return FALSE; + } + + strcpy(BootPath, Path); + + strcat(BootPath, "fdisk"); + + _itoa(BootDrive, Device, 10); + strcat(BootPath, "("); + strcat(BootPath, Device); + strcat(BootPath, ")"); } - strcpy(BootPath, Path); - strcat(BootPath, BootDrive < 0x80 ? "fdisk" : "cdrom"); - strcat(strcat(strcat(BootPath, "("), Device), ")"); - - if (strcmp(BootPath, "multi(0)disk(0)cdrom(128)") == 0) - strcpy(BootPath, "multi(0)disk(0)rdisk(0)partition(1)"); + /* FIXME */ + else if (DiskReadBootRecord(BootDrive, 0, &MasterBootRecord)) + { + /* This is a hard disk */ + + if (!DiskGetActivePartitionEntry(BootDrive, &PartitionEntry, &BootPartition)) + { + DbgPrint("Invalid active partition information\n"); + return FALSE; + } + + if (Size <= sizeof(Path) + 18 + strlen(Device) + strlen(Partition)) + { + return FALSE; + } + + strcpy(BootPath, Path); + + strcat(BootPath, "rdisk"); + + _itoa(BootDrive - 0x80, Device, 10); + strcat(BootPath, "("); + strcat(BootPath, Device); + strcat(BootPath, ")"); + + _itoa(BootPartition, Partition, 10); + strcat(BootPath, "partition("); + strcat(BootPath, Partition); + strcat(BootPath, ")"); + } + else + { + /* This is a CD-ROM drive */ + + if (Size <= sizeof(Path) + 7 + strlen(Device)) + { + return FALSE; + } + + strcpy(BootPath, Path); + + strcat(BootPath, "cdrom"); + + _itoa(BootDrive - 0x80, Device, 10); + strcat(BootPath, "("); + strcat(BootPath, Device); + strcat(BootPath, ")"); + } + return TRUE; } -BOOLEAN -DiskNormalizeSystemPath(char *SystemPath, unsigned Size) -{ - CHAR BootPath[256]; - ULONG PartitionNumber; - ULONG DriveNumber; - PARTITION_TABLE_ENTRY PartEntry; - char *p; - - if (!DissectArcPath(SystemPath, BootPath, &DriveNumber, &PartitionNumber)) - { - return FALSE; - } - - if (0 != PartitionNumber || DriveNumber < 0x80) - { - return TRUE; - } - - if (! DiskGetActivePartitionEntry(DriveNumber, - &PartEntry, - &PartitionNumber) || - PartitionNumber < 1 || 9 < PartitionNumber) - { - return FALSE; - } - - p = SystemPath; - while ('\0' != *p && 0 != _strnicmp(p, "partition(", 10)) { - p++; - } - p = strchr(p, ')'); - if (NULL == p || '0' != *(p - 1)) { - return FALSE; - } - *(p - 1) = '0' + PartitionNumber; - - return TRUE; -} - - // This function is in arch/i386/i386disk.c //VOID DiskStopFloppyMotor(VOID) diff --git a/reactos/boot/freeldr/freeldr/disk/partition.c b/reactos/boot/freeldr/freeldr/disk/partition.c index 8966e67187a..b93b2e17b2a 100644 --- a/reactos/boot/freeldr/freeldr/disk/partition.c +++ b/reactos/boot/freeldr/freeldr/disk/partition.c @@ -197,7 +197,6 @@ BOOLEAN DiskGetFirstExtendedPartitionEntry(PMASTER_BOOT_RECORD MasterBootRecord, BOOLEAN DiskReadBootRecord(ULONG DriveNumber, ULONGLONG LogicalSectorNumber, PMASTER_BOOT_RECORD BootRecord) { - char ErrMsg[64]; ULONG Index; // Read master boot record @@ -231,9 +230,6 @@ BOOLEAN DiskReadBootRecord(ULONG DriveNumber, ULONGLONG LogicalSectorNumber, PMA // Check the partition table magic value if (BootRecord->MasterBootRecordMagic != 0xaa55) { - sprintf(ErrMsg, "Invalid partition table magic 0x%x found on drive 0x%lx", - BootRecord->MasterBootRecordMagic, DriveNumber); - DiskError(ErrMsg, 0); return FALSE; } diff --git a/reactos/boot/freeldr/freeldr/include/disk.h b/reactos/boot/freeldr/freeldr/include/disk.h index daaaa495e55..191ee1215d6 100644 --- a/reactos/boot/freeldr/freeldr/include/disk.h +++ b/reactos/boot/freeldr/freeldr/include/disk.h @@ -127,7 +127,6 @@ extern ULONG BootDrive; extern ULONG BootPartition; BOOLEAN DiskGetBootPath(char *BootPath, unsigned Size); -BOOLEAN DiskNormalizeSystemPath(char *SystemPath, unsigned Size); /////////////////////////////////////////////////////////////////////////////////////// diff --git a/reactos/boot/freeldr/freeldr/include/machine.h b/reactos/boot/freeldr/freeldr/include/machine.h index 0c0076f4760..65952056faa 100644 --- a/reactos/boot/freeldr/freeldr/include/machine.h +++ b/reactos/boot/freeldr/freeldr/include/machine.h @@ -62,7 +62,6 @@ typedef struct tagMACHVTBL ULONG (*GetMemoryMap)(PBIOS_MEMORY_MAP BiosMemoryMap, ULONG MaxMemoryMapSize); BOOLEAN (*DiskGetBootPath)(char *BootPath, unsigned Size); - BOOLEAN (*DiskNormalizeSystemPath)(char *SystemPath, unsigned Size); BOOLEAN (*DiskReadLogicalSectors)(ULONG DriveNumber, ULONGLONG SectorNumber, ULONG SectorCount, PVOID Buffer); BOOLEAN (*DiskGetDriveGeometry)(ULONG DriveNumber, PGEOMETRY DriveGeometry); ULONG (*DiskGetCacheableBlockCount)(ULONG DriveNumber); diff --git a/reactos/boot/freeldr/freeldr/linuxboot.c b/reactos/boot/freeldr/freeldr/linuxboot.c index 10c2017eb0c..5aea40c2427 100644 --- a/reactos/boot/freeldr/freeldr/linuxboot.c +++ b/reactos/boot/freeldr/freeldr/linuxboot.c @@ -97,13 +97,6 @@ VOID LoadAndBootLinux(PCSTR OperatingSystemName, PCSTR Description) goto LinuxBootFailed; } - // Open the boot volume - if (!MachDiskNormalizeSystemPath(LinuxBootPath, sizeof(LinuxBootPath))) - { - UiMessageBox("Invalid boot path"); - goto LinuxBootFailed; - } - // Open the kernel LinuxKernel = FsOpenFile(LinuxKernelName); if (!LinuxKernel) diff --git a/reactos/boot/freeldr/freeldr/machine.c b/reactos/boot/freeldr/freeldr/machine.c index 9021a7c57a7..c898bf49430 100644 --- a/reactos/boot/freeldr/freeldr/machine.c +++ b/reactos/boot/freeldr/freeldr/machine.c @@ -37,7 +37,6 @@ #undef MachBeep #undef MachPrepareForReactOS #undef MachDiskGetBootPath -#undef MachDiskNormalizeSystemPath #undef MachDiskReadLogicalSectors #undef MachDiskGetDriveGeometry #undef MachDiskGetCacheableBlockCount @@ -152,12 +151,6 @@ MachDiskGetBootPath(char *BootPath, unsigned Size) return MachVtbl.DiskGetBootPath(BootPath, Size); } -BOOLEAN -MachDiskNormalizeSystemPath(char *SystemPath, unsigned Size) -{ - return MachVtbl.DiskNormalizeSystemPath(SystemPath, Size); -} - BOOLEAN MachDiskReadLogicalSectors(ULONG DriveNumber, ULONGLONG SectorNumber, ULONG SectorCount, PVOID Buffer) { diff --git a/reactos/boot/freeldr/freeldr/reactos/arcname.c b/reactos/boot/freeldr/freeldr/reactos/arcname.c index 3fe1fc6bd26..4b7f97addb6 100644 --- a/reactos/boot/freeldr/freeldr/reactos/arcname.c +++ b/reactos/boot/freeldr/freeldr/reactos/arcname.c @@ -69,7 +69,7 @@ BOOLEAN DissectArcPath(CHAR *ArcPath, CHAR *BootPath, ULONG* BootDrive, ULONG* B * multi(0)disk(0)cdrom(x)\path */ p = p + 6; - *BootDrive = atoi(p); + *BootDrive = atoi(p) + 0x80; p = strchr(p, ')'); if (p == NULL) return FALSE; diff --git a/reactos/boot/freeldr/freeldr/reactos/reactos.c b/reactos/boot/freeldr/freeldr/reactos/reactos.c index 12c8c6647e4..81b654b84b9 100644 --- a/reactos/boot/freeldr/freeldr/reactos/reactos.c +++ b/reactos/boot/freeldr/freeldr/reactos/reactos.c @@ -718,12 +718,6 @@ LoadAndBootReactOS(PCSTR OperatingSystemName) } else { - if (! MachDiskNormalizeSystemPath(SystemPath, - sizeof(SystemPath))) - { - UiMessageBox("Invalid system path"); - return; - } /* copy system path into kernel command line */ strcpy(reactos_kernel_cmdline, SystemPath); } From 1a9d9f441c0b721f0a6e195e70ffd2e384a592f0 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Wed, 28 Apr 2010 11:35:34 +0000 Subject: [PATCH 081/131] [MKHIVE/USETUP] - Fix buffer size calculation for the parser. - Do not try to execute an empty registry instruction Patches by Roel Messiant. - Stop the parser at the first NULL character. Patch by me. svn path=/trunk/; revision=47053 --- reactos/base/setup/usetup/interface/usetup.c | 2 ++ reactos/lib/newinflib/infcore.c | 5 +++-- reactos/lib/newinflib/infrosgen.c | 4 ++-- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/reactos/base/setup/usetup/interface/usetup.c b/reactos/base/setup/usetup/interface/usetup.c index ea1711ee3b2..7a97b492c27 100644 --- a/reactos/base/setup/usetup/interface/usetup.c +++ b/reactos/base/setup/usetup/interface/usetup.c @@ -3266,6 +3266,8 @@ RegistryPage(PINPUT_RECORD Ir) DPRINT("Action: %S File: %S Section %S\n", Action, File, Section); + if (Action == NULL) break; // Hackfix + if (!_wcsicmp (Action, L"AddReg")) { Delete = FALSE; diff --git a/reactos/lib/newinflib/infcore.c b/reactos/lib/newinflib/infcore.c index 3582ec56787..b70ce795e19 100644 --- a/reactos/lib/newinflib/infcore.c +++ b/reactos/lib/newinflib/infcore.c @@ -365,7 +365,7 @@ __inline static enum parser_state set_state( struct parser *parser, enum parser_ /* check if the pointer points to an end of file */ __inline static int is_eof( struct parser *parser, const WCHAR *ptr ) { - return (ptr >= parser->end || *ptr == CONTROL_Z); + return (ptr >= parser->end || *ptr == CONTROL_Z || *ptr == 0); } @@ -375,7 +375,8 @@ __inline static int is_eol( struct parser *parser, const WCHAR *ptr ) return (ptr >= parser->end || *ptr == CONTROL_Z || *ptr == '\n' || - (*ptr == '\r' && *(ptr + 1) == '\n')); + (*ptr == '\r' && *(ptr + 1) == '\n') || + *ptr == 0); } diff --git a/reactos/lib/newinflib/infrosgen.c b/reactos/lib/newinflib/infrosgen.c index e994b28f030..b23403b96c0 100644 --- a/reactos/lib/newinflib/infrosgen.c +++ b/reactos/lib/newinflib/infrosgen.c @@ -120,7 +120,7 @@ InfOpenBufferedFile(PHINF InfHandle, Status = InfpParseBuffer(Cache, new_buff, - new_buff + len, + new_buff + len / sizeof(WCHAR), ErrorLine); FREE(new_buff); } @@ -293,7 +293,7 @@ InfOpenFile(PHINF InfHandle, Status = InfpParseBuffer(Cache, new_buff, - new_buff + len, + new_buff + len / sizeof(WCHAR), ErrorLine); FREE(new_buff); } From 0ddb991b140fbd54b7f173c23a5b8f32807d5167 Mon Sep 17 00:00:00 2001 From: Sylvain Petreolle Date: Wed, 28 Apr 2010 19:15:17 +0000 Subject: [PATCH 082/131] Hardcode GeckoCabDir to C:\ReactOS. the mshtml installer now wants a REG_SZ string for it, which excludes using %SystemRoot%. Fixes bootcdregtest. svn path=/trunk/; revision=47055 --- reactos/boot/bootdata/hivedef_arm.inf | 3 ++- reactos/boot/bootdata/hivedef_i386.inf | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/reactos/boot/bootdata/hivedef_arm.inf b/reactos/boot/bootdata/hivedef_arm.inf index 8d8c48935d1..086ee67f4fa 100644 --- a/reactos/boot/bootdata/hivedef_arm.inf +++ b/reactos/boot/bootdata/hivedef_arm.inf @@ -1530,7 +1530,8 @@ HKCU,"Control Panel\Accessibility\Keyboard Preference","On",2,"0" ; Internet Explorer HKCU,Software\Wine\MSHTML,"GeckoUrl",,"http://source.winehq.org/winegecko.php" -HKCU,Software\Wine\MSHTML,"GeckoCabDir",0x00020000,"%SystemRoot%\" +;HKCU,Software\Wine\MSHTML,"GeckoCabDir",0x00020000,"%SystemRoot%\" +HKCU,Software\Wine\MSHTML,"GeckoCabDir",,"C:\ReactOS\" ; Sound Schemes HKCU,"AppEvents",,0x00000012 diff --git a/reactos/boot/bootdata/hivedef_i386.inf b/reactos/boot/bootdata/hivedef_i386.inf index 9650563ee47..9cf6b0c1147 100644 --- a/reactos/boot/bootdata/hivedef_i386.inf +++ b/reactos/boot/bootdata/hivedef_i386.inf @@ -1712,7 +1712,8 @@ HKCU,"SOFTWARE\ReactOS\Debug","SpyInclude",0x00020000,"INCLUDEALL" ; Internet Explorer HKCU,Software\Wine\MSHTML,"GeckoUrl",,"http://source.winehq.org/winegecko.php" -HKCU,Software\Wine\MSHTML,"GeckoCabDir",0x00020000,"%SystemRoot%\" +;HKCU,Software\Wine\MSHTML,"GeckoCabDir",0x00020000,"%SystemRoot%\" +HKCU,Software\Wine\MSHTML,"GeckoCabDir",,"C:\ReactOS\" ; Sound Schemes HKCU,"AppEvents",,0x00000012 From 62b639c945a8b44876132edb918b23c8d1921d3b Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Wed, 28 Apr 2010 20:06:28 +0000 Subject: [PATCH 083/131] [NTOSKRNL] - Fix length calculation of symbolic links with reference strings attached - Fixes opening registry keys for symbolic links with reference strings (such as audio devices) svn path=/trunk/; revision=47056 --- reactos/ntoskrnl/io/iomgr/deviface.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/ntoskrnl/io/iomgr/deviface.c b/reactos/ntoskrnl/io/iomgr/deviface.c index 7d97336cc16..fa1b1a35acd 100644 --- a/reactos/ntoskrnl/io/iomgr/deviface.c +++ b/reactos/ntoskrnl/io/iomgr/deviface.c @@ -127,7 +127,7 @@ OpenRegistryHandlesFromSymbolicLink(IN PUNICODE_STRING SymbolicLinkName, { ReferenceString.Buffer[0] = L'#'; - SubKeyName.Length = ReferenceString.Buffer - SubKeyName.Buffer; + SubKeyName.Length = (USHORT)((ULONG_PTR)(ReferenceString.Buffer) - (ULONG_PTR)SubKeyName.Buffer); ReferenceString.Length = SymbolicLinkName->Length - SubKeyName.Length; } else From 3ec3baec08b3d28a9b10bdb5996ddc09163db45e Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Thu, 29 Apr 2010 01:44:20 +0000 Subject: [PATCH 084/131] [NTOSKRNL] - Rewrite IoOpenDeviceInterfaceRegistryKey using the same helper function that is used in IoGetDeviceInterfaces and IoSetDeviceInterfaceState to reduce complexity and chance of bugs (tested and confirmed working) - Revert r46748 - Fixes bug #5321 (AC97) svn path=/trunk/; revision=47057 --- reactos/ntoskrnl/io/iomgr/deviface.c | 182 +++++---------------------- 1 file changed, 33 insertions(+), 149 deletions(-) diff --git a/reactos/ntoskrnl/io/iomgr/deviface.c b/reactos/ntoskrnl/io/iomgr/deviface.c index fa1b1a35acd..a9b5e475705 100644 --- a/reactos/ntoskrnl/io/iomgr/deviface.c +++ b/reactos/ntoskrnl/io/iomgr/deviface.c @@ -224,159 +224,37 @@ IoOpenDeviceInterfaceRegistryKey(IN PUNICODE_STRING SymbolicLinkName, IN ACCESS_MASK DesiredAccess, OUT PHANDLE DeviceInterfaceKey) { - WCHAR StrBuff[MAX_PATH], PathBuff[MAX_PATH]; - PWCHAR Guid, RefString; - UNICODE_STRING DevParamU = RTL_CONSTANT_STRING(L"\\Device Parameters"); - UNICODE_STRING PrefixU = RTL_CONSTANT_STRING(L"\\??\\"); - UNICODE_STRING KeyPath, KeyName; - UNICODE_STRING MatchableGuid; - UNICODE_STRING GuidString; - HANDLE GuidKey, hInterfaceKey; - ULONG Index = 0; - PKEY_BASIC_INFORMATION KeyInformation; - ULONG KeyInformationLength; - OBJECT_ATTRIBUTES ObjectAttributes; - NTSTATUS Status; - ULONG RequiredLength; + HANDLE InstanceKey, DeviceParametersKey; + NTSTATUS Status; + OBJECT_ATTRIBUTES ObjectAttributes; + UNICODE_STRING DeviceParametersU = RTL_CONSTANT_STRING(L"Device Parameters"); - swprintf(StrBuff, L"##?#%s", &SymbolicLinkName->Buffer[PrefixU.Length / sizeof(WCHAR)]); + Status = OpenRegistryHandlesFromSymbolicLink(SymbolicLinkName, + KEY_CREATE_SUB_KEY, + NULL, + NULL, + &InstanceKey); + if (!NT_SUCCESS(Status)) + return Status; - RefString = wcsstr(StrBuff, L"\\"); - if (RefString) - { - RefString[0] = 0; - } + InitializeObjectAttributes(&ObjectAttributes, + &DeviceParametersU, + OBJ_CASE_INSENSITIVE | OBJ_OPENIF, + InstanceKey, + NULL); + Status = ZwCreateKey(&DeviceParametersKey, + DesiredAccess, + &ObjectAttributes, + 0, + NULL, + REG_OPTION_NON_VOLATILE, + NULL); + ZwClose(InstanceKey); - RtlInitUnicodeString(&MatchableGuid, StrBuff); + if (NT_SUCCESS(Status)) + *DeviceInterfaceKey = DeviceParametersKey; - Guid = wcsstr(StrBuff, L"{"); - if (!Guid) - return STATUS_OBJECT_NAME_NOT_FOUND; - - KeyPath.Buffer = PathBuff; - KeyPath.Length = 0; - KeyPath.MaximumLength = MAX_PATH * sizeof(WCHAR); - - GuidString.Buffer = Guid; - GuidString.Length = GuidString.MaximumLength = 38 * sizeof(WCHAR); - - RtlAppendUnicodeToString(&KeyPath, BaseKeyString); - RtlAppendUnicodeStringToString(&KeyPath, &GuidString); - - InitializeObjectAttributes(&ObjectAttributes, - &KeyPath, - OBJ_CASE_INSENSITIVE, - 0, - NULL); - - Status = ZwOpenKey(&GuidKey, KEY_CREATE_SUB_KEY, &ObjectAttributes); - if (!NT_SUCCESS(Status)) - return Status; - - while (TRUE) - { - Status = ZwEnumerateKey(GuidKey, - Index, - KeyBasicInformation, - NULL, - 0, - &RequiredLength); - if (Status == STATUS_NO_MORE_ENTRIES) - break; - else if (Status == STATUS_BUFFER_TOO_SMALL) - { - KeyInformationLength = RequiredLength; - KeyInformation = ExAllocatePool(PagedPool, KeyInformationLength); - if (!KeyInformation) - { - ZwClose(GuidKey); - return STATUS_INSUFFICIENT_RESOURCES; - } - - Status = ZwEnumerateKey(GuidKey, - Index, - KeyBasicInformation, - KeyInformation, - KeyInformationLength, - &RequiredLength); - } - else - { - ZwClose(GuidKey); - return STATUS_OBJECT_PATH_NOT_FOUND; - } - Index++; - - if (!NT_SUCCESS(Status)) - { - ZwClose(GuidKey); - return Status; - } - - KeyName.Length = KeyName.MaximumLength = KeyInformation->NameLength; - KeyName.Buffer = KeyInformation->Name; - - if (!RtlEqualUnicodeString(&KeyName, &MatchableGuid, TRUE)) - { - ExFreePool(KeyInformation); - continue; - } - - KeyPath.Length = 0; - RtlAppendUnicodeStringToString(&KeyPath, &KeyName); - RtlAppendUnicodeToString(&KeyPath, L"\\"); - - /* check for presence of a reference string */ - if (RefString) - { - /* append reference string */ - RefString[0] = L'#'; - RtlInitUnicodeString(&KeyName, RefString); - } - else - { - /* no reference string */ - RtlInitUnicodeString(&KeyName, L"#"); - } - RtlAppendUnicodeStringToString(&KeyPath, &KeyName); - - /* initialize reference string attributes */ - InitializeObjectAttributes(&ObjectAttributes, - &KeyPath, - OBJ_CASE_INSENSITIVE, - GuidKey, - NULL); - - /* now open device interface key */ - Status = ZwOpenKey(&hInterfaceKey, KEY_CREATE_SUB_KEY, &ObjectAttributes); - - if (NT_SUCCESS(Status)) - { - /* check if it provides a DeviceParameters key */ - InitializeObjectAttributes(&ObjectAttributes, &DevParamU, OBJ_CASE_INSENSITIVE, hInterfaceKey, NULL); - - Status = ZwCreateKey(DeviceInterfaceKey, DesiredAccess, &ObjectAttributes, 0, NULL, REG_OPTION_NON_VOLATILE, NULL); - - if (NT_SUCCESS(Status)) - { - /* DeviceParameters key present */ - ZwClose(hInterfaceKey); - } - else - { - /* fall back to device interface */ - *DeviceInterfaceKey = hInterfaceKey; - Status = STATUS_SUCCESS; - } - } - - /* close class key */ - ZwClose(GuidKey); - ExFreePool(KeyInformation); - return Status; - } - - return STATUS_OBJECT_PATH_NOT_FOUND; + return Status; } /*++ @@ -881,6 +759,12 @@ IoGetDeviceInterfaces(IN CONST GUID *InterfaceClassGuid, DPRINT("RtlAppendUnicodeStringToString() failed with status 0x%08lx\n", Status); goto cleanup; } + /* RtlAppendUnicodeStringToString added a NULL at the end of the + * destination string, but didn't increase the Length field. + * Do it for it. + */ + ReturnBuffer.Length += sizeof(WCHAR); + NextReferenceString: ExFreePool(ReferenceBi); ReferenceBi = NULL; From 0ec839d5443f665f2f19b1333ae96c89851678d2 Mon Sep 17 00:00:00 2001 From: Giannis Adamopoulos Date: Thu, 29 Apr 2010 07:48:43 +0000 Subject: [PATCH 085/131] [win32k] - Do not do callbacks to user mode while holding a lock - Fix when WH_MOUSE_LL and WH_JOURNALRECORD are called See issue #4926 for more details. svn path=/trunk/; revision=47058 --- .../win32/win32k/include/msgqueue.h | 10 ++ .../subsystems/win32/win32k/ntuser/input.c | 10 ++ .../subsystems/win32/win32k/ntuser/message.c | 123 +++++++++++------- .../subsystems/win32/win32k/ntuser/msgqueue.c | 109 ++++++---------- 4 files changed, 140 insertions(+), 112 deletions(-) diff --git a/reactos/subsystems/win32/win32k/include/msgqueue.h b/reactos/subsystems/win32/win32k/include/msgqueue.h index 5752481c9d4..c751f3a911d 100644 --- a/reactos/subsystems/win32/win32k/include/msgqueue.h +++ b/reactos/subsystems/win32/win32k/include/msgqueue.h @@ -248,6 +248,16 @@ VOID APIENTRY MsqRemoveWindowMessagesFromQueue(PVOID pWindow); /* F*(&$ headers, (message) == WM_NCRBUTTON##code || \ (message) == WM_NCXBUTTON##code ) +#define WM_NCMOUSEFIRST WM_NCMOUSEMOVE +#define WM_NCMOUSELAST (WM_NCMOUSEFIRST+(WM_MOUSELAST-WM_MOUSEFIRST)) + +#define IS_MOUSE_MESSAGE(message) \ + ((message >= WM_NCMOUSEFIRST && message <= WM_NCMOUSELAST) || \ + (message >= WM_MOUSEFIRST && message <= WM_MOUSELAST)) + +#define IS_KBD_MESSAGE(message) \ + (message == WM_KEYDOWN || message == WM_KEYUP) + HANDLE FASTCALL IntMsqSetWakeMask(DWORD WakeMask); diff --git a/reactos/subsystems/win32/win32k/ntuser/input.c b/reactos/subsystems/win32/win32k/ntuser/input.c index 78f8384460e..f51395ee607 100644 --- a/reactos/subsystems/win32/win32k/ntuser/input.c +++ b/reactos/subsystems/win32/win32k/ntuser/input.c @@ -204,6 +204,16 @@ MouseThreadMain(PVOID StartContext) NTSTATUS Status; MOUSE_ATTRIBUTES MouseAttr; + Status = Win32kInitWin32Thread(PsGetCurrentThread()); + if (!NT_SUCCESS(Status)) + { + DPRINT1("Win32K: Failed making keyboard thread a win32 thread.\n"); + return; //(Status); + } + + KeSetPriorityThread(&PsGetCurrentThread()->Tcb, + LOW_REALTIME_PRIORITY + 3); + InitializeObjectAttributes(&MouseObjectAttributes, &MouseDeviceName, 0, diff --git a/reactos/subsystems/win32/win32k/ntuser/message.c b/reactos/subsystems/win32/win32k/ntuser/message.c index 01977a089da..3bd92011346 100644 --- a/reactos/subsystems/win32/win32k/ntuser/message.c +++ b/reactos/subsystems/win32/win32k/ntuser/message.c @@ -645,6 +645,74 @@ co_IntTranslateMouseMessage( return FALSE; } +BOOL ProcessMouseMessage(MSG* Msg, USHORT HitTest, UINT RemoveMsg) +{ + MOUSEHOOKSTRUCT MHook; + EVENTMSG Event; + + Event.message = Msg->message; + Event.time = Msg->time; + Event.hwnd = Msg->hwnd; + Event.paramL = Msg->pt.x; + Event.paramH = Msg->pt.y; + co_HOOK_CallHooks( WH_JOURNALRECORD, HC_ACTION, 0, (LPARAM)&Event); + + + MHook.pt = Msg->pt; + MHook.hwnd = Msg->hwnd; + MHook.wHitTestCode = HitTest; + MHook.dwExtraInfo = 0; + if (co_HOOK_CallHooks( WH_MOUSE, + RemoveMsg ? HC_ACTION : HC_NOREMOVE, + Msg->message, + (LPARAM)&MHook )) + { + if (ISITHOOKED(WH_CBT)) + { + MHook.pt = Msg->pt; + MHook.hwnd = Msg->hwnd; + MHook.wHitTestCode = HitTest; + MHook.dwExtraInfo = 0; + co_HOOK_CallHooks( WH_CBT, + HCBT_CLICKSKIPPED, + Msg->message, + (LPARAM)&MHook); + } + return FALSE; + } + + return TRUE; +} + +BOOL ProcessKeyboardMessage(MSG* Msg, UINT RemoveMsg) +{ + EVENTMSG Event; + + Event.message = Msg->message; + Event.hwnd = Msg->hwnd; + Event.time = Msg->time; + Event.paramL = (Msg->wParam & 0xFF) | (HIWORD(Msg->lParam) << 8); + Event.paramH = Msg->lParam & 0x7FFF; + if (HIWORD(Msg->lParam) & 0x0100) Event.paramH |= 0x8000; + co_HOOK_CallHooks( WH_JOURNALRECORD, HC_ACTION, 0, (LPARAM)&Event); + + if (co_HOOK_CallHooks( WH_KEYBOARD, + RemoveMsg ? HC_ACTION : HC_NOREMOVE, + LOWORD(Msg->wParam), + Msg->lParam)) + { + if (ISITHOOKED(WH_CBT)) + { + /* skip this message */ + co_HOOK_CallHooks( WH_CBT, + HCBT_KEYSKIPPED, + LOWORD(Msg->wParam), + Msg->lParam ); + } + return FALSE; + } + return TRUE; +} /* * Internal version of PeekMessage() doing all the work */ @@ -662,7 +730,6 @@ co_IntPeekMessage( PUSER_MESSAGE Msg, BOOL Present, RemoveMessages; USER_REFERENCE_ENTRY Ref; USHORT HitTest; - MOUSEHOOKSTRUCT MHook; /* The queues and order in which they are checked are documented in the MSDN article on GetMessage() */ @@ -867,52 +934,20 @@ MessageFound: } MsgExit: - if ( ISITHOOKED(WH_MOUSE) && - Msg->Msg.message >= WM_MOUSEFIRST && - Msg->Msg.message <= WM_MOUSELAST ) + if ( ISITHOOKED(WH_MOUSE) && IS_MOUSE_MESSAGE(Msg->Msg.message)) { - MHook.pt = Msg->Msg.pt; - MHook.hwnd = Msg->Msg.hwnd; - MHook.wHitTestCode = HitTest; - MHook.dwExtraInfo = 0; - if (co_HOOK_CallHooks( WH_MOUSE, - RemoveMsg ? HC_ACTION : HC_NOREMOVE, - Msg->Msg.message, - (LPARAM)&MHook )) - { - if (ISITHOOKED(WH_CBT)) - { - MHook.pt = Msg->Msg.pt; - MHook.hwnd = Msg->Msg.hwnd; - MHook.wHitTestCode = HitTest; - MHook.dwExtraInfo = 0; - co_HOOK_CallHooks( WH_CBT, - HCBT_CLICKSKIPPED, - Msg->Msg.message, - (LPARAM)&MHook); - } - return FALSE; - } - } + if(!ProcessMouseMessage(&Msg->Msg, HitTest, RemoveMsg)) + { + return FALSE; + } + } - if ( ISITHOOKED(WH_KEYBOARD) && - (Msg->Msg.message == WM_KEYDOWN || Msg->Msg.message == WM_KEYUP) ) + if ( ISITHOOKED(WH_KEYBOARD) && IS_KBD_MESSAGE(Msg->Msg.message)) { - if (co_HOOK_CallHooks( WH_KEYBOARD, - RemoveMsg ? HC_ACTION : HC_NOREMOVE, - LOWORD(Msg->Msg.wParam), - Msg->Msg.lParam)) - { - if (ISITHOOKED(WH_CBT)) - { - /* skip this message */ - co_HOOK_CallHooks( WH_CBT, - HCBT_KEYSKIPPED, - LOWORD(Msg->Msg.wParam), - Msg->Msg.lParam ); - } - return FALSE; - } + if(!ProcessKeyboardMessage(&Msg->Msg, RemoveMsg)) + { + return FALSE; + } } // The WH_GETMESSAGE hook enables an application to monitor messages about to // be returned by the GetMessage or PeekMessage function. diff --git a/reactos/subsystems/win32/win32k/ntuser/msgqueue.c b/reactos/subsystems/win32/win32k/ntuser/msgqueue.c index 4fc8b0e24d8..16323aeb5c4 100644 --- a/reactos/subsystems/win32/win32k/ntuser/msgqueue.c +++ b/reactos/subsystems/win32/win32k/ntuser/msgqueue.c @@ -174,8 +174,41 @@ MsqInsertSystemMessage(MSG* Msg) LARGE_INTEGER LargeTickCount; KIRQL OldIrql; ULONG Prev; - EVENTMSG Event; + MSLLHOOKSTRUCT MouseHookData; + KeQueryTickCount(&LargeTickCount); + Msg->time = MsqCalculateMessageTime(&LargeTickCount); + + MouseHookData.pt.x = LOWORD(Msg->lParam); + MouseHookData.pt.y = HIWORD(Msg->lParam); + switch(Msg->message) + { + case WM_MOUSEWHEEL: + MouseHookData.mouseData = MAKELONG(0, GET_WHEEL_DELTA_WPARAM(Msg->wParam)); + break; + case WM_XBUTTONDOWN: + case WM_XBUTTONUP: + case WM_XBUTTONDBLCLK: + case WM_NCXBUTTONDOWN: + case WM_NCXBUTTONUP: + case WM_NCXBUTTONDBLCLK: + MouseHookData.mouseData = MAKELONG(0, HIWORD(Msg->wParam)); + break; + default: + MouseHookData.mouseData = 0; + break; + } + MouseHookData.flags = 0; + MouseHookData.time = Msg->time; + MouseHookData.dwExtraInfo = 0; + if( co_HOOK_CallHooks(WH_MOUSE_LL, HC_ACTION, Msg->message, (LPARAM) &MouseHookData)) + return; + + /* + * If we got WM_MOUSEMOVE and there are already messages in the + * system message queue, check if the last message is mouse move + * and if it is then just overwrite it. + */ IntLockSystemMessageQueue(OldIrql); /* @@ -189,22 +222,6 @@ MsqInsertSystemMessage(MSG* Msg) return; } - KeQueryTickCount(&LargeTickCount); - Msg->time = MsqCalculateMessageTime(&LargeTickCount); - - Event.message = Msg->message; - Event.time = Msg->time; - Event.hwnd = Msg->hwnd; - Event.paramL = Msg->pt.x; - Event.paramH = Msg->pt.y; - co_HOOK_CallHooks( WH_JOURNALRECORD, HC_ACTION, 0, (LPARAM)&Event); - - /* - * If we got WM_MOUSEMOVE and there are already messages in the - * system message queue, check if the last message is mouse move - * and if it is then just overwrite it. - */ - if (Msg->message == WM_MOUSEMOVE && SystemMessageQueueCount) { if (SystemMessageQueueTail == 0) @@ -623,7 +640,6 @@ co_MsqPeekHardwareMessage(PUSER_MESSAGE_QUEUE MessageQueue, PWINDOW_OBJECT Windo { PUSER_MESSAGE UserMsg; MSG Msg; - BOOL ProcessMessage; ASSERT(SystemMessageQueueHead < SYSTEM_MESSAGE_QUEUE_SIZE); Msg = SystemMessageQueue[SystemMessageQueueHead]; @@ -631,48 +647,14 @@ co_MsqPeekHardwareMessage(PUSER_MESSAGE_QUEUE MessageQueue, PWINDOW_OBJECT Windo (SystemMessageQueueHead + 1) % SYSTEM_MESSAGE_QUEUE_SIZE; SystemMessageQueueCount--; IntUnLockSystemMessageQueue(OldIrql); - if (WM_MOUSEFIRST <= Msg.message && Msg.message <= WM_MOUSELAST) - { - MSLLHOOKSTRUCT MouseHookData; - MouseHookData.pt.x = LOWORD(Msg.lParam); - MouseHookData.pt.y = HIWORD(Msg.lParam); - switch(Msg.message) - { - case WM_MOUSEWHEEL: - MouseHookData.mouseData = MAKELONG(0, GET_WHEEL_DELTA_WPARAM(Msg.wParam)); - break; - case WM_XBUTTONDOWN: - case WM_XBUTTONUP: - case WM_XBUTTONDBLCLK: - case WM_NCXBUTTONDOWN: - case WM_NCXBUTTONUP: - case WM_NCXBUTTONDBLCLK: - MouseHookData.mouseData = MAKELONG(0, HIWORD(Msg.wParam)); - break; - default: - MouseHookData.mouseData = 0; - break; - } - MouseHookData.flags = 0; - MouseHookData.time = Msg.time; - MouseHookData.dwExtraInfo = 0; - ProcessMessage = (0 == co_HOOK_CallHooks(WH_MOUSE_LL, HC_ACTION, - Msg.message, (LPARAM) &MouseHookData)); - } - else - { - ProcessMessage = TRUE; - } - if (ProcessMessage) - { - UserMsg = ExAllocateFromPagedLookasideList(&MessageLookasideList); - /* What to do if out of memory? For now we just panic a bit in debug */ - ASSERT(UserMsg); - UserMsg->FreeLParam = FALSE; - UserMsg->Msg = Msg; - InsertTailList(&HardwareMessageQueueHead, &UserMsg->ListEntry); - } + UserMsg = ExAllocateFromPagedLookasideList(&MessageLookasideList); + /* What to do if out of memory? For now we just panic a bit in debug */ + ASSERT(UserMsg); + UserMsg->FreeLParam = FALSE; + UserMsg->Msg = Msg; + InsertTailList(&HardwareMessageQueueHead, &UserMsg->ListEntry); + IntLockSystemMessageQueue(OldIrql); } HardwareMessageQueueStamp++; @@ -767,7 +749,6 @@ co_MsqPostKeyboardMessage(UINT uMsg, WPARAM wParam, LPARAM lParam) MSG Msg; LARGE_INTEGER LargeTickCount; KBDLLHOOKSTRUCT KbdHookData; - EVENTMSG Event; BOOLEAN Entered = FALSE; DPRINT("MsqPostKeyboardMessage(uMsg 0x%x, wParam 0x%x, lParam 0x%x)\n", @@ -795,14 +776,6 @@ co_MsqPostKeyboardMessage(UINT uMsg, WPARAM wParam, LPARAM lParam) KeQueryTickCount(&LargeTickCount); Msg.time = MsqCalculateMessageTime(&LargeTickCount); - Event.message = Msg.message; - Event.hwnd = Msg.hwnd; - Event.time = Msg.time; - Event.paramL = (Msg.wParam & 0xFF) | (HIWORD(Msg.lParam) << 8); - Event.paramH = Msg.lParam & 0x7FFF; - if (HIWORD(Msg.lParam) & 0x0100) Event.paramH |= 0x8000; - co_HOOK_CallHooks( WH_JOURNALRECORD, HC_ACTION, 0, (LPARAM)&Event); - /* We can't get the Msg.pt point here since we don't know thread (and thus the window station) the message will end up in yet. */ From d34a8d86bcd110e982aa9912f9f8e80b54dc3206 Mon Sep 17 00:00:00 2001 From: Michael Martin Date: Thu, 29 Apr 2010 13:41:32 +0000 Subject: [PATCH 086/131] [win32k] - Fix a problem where application that used WH_CBT hook procedures were receiving destroy window notification on windows that were never created. The window was never created because the application had returned a non zero value when it was notified of window creation, which effectively destroys the window and returns failure for window creation. See CBTProc Function on MSDN. Fixes bug #4461. svn path=/trunk/; revision=47059 --- reactos/subsystems/win32/win32k/ntuser/window.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/reactos/subsystems/win32/win32k/ntuser/window.c b/reactos/subsystems/win32/win32k/ntuser/window.c index f95965027bd..aa1cbc0188e 100644 --- a/reactos/subsystems/win32/win32k/ntuser/window.c +++ b/reactos/subsystems/win32/win32k/ntuser/window.c @@ -2468,7 +2468,23 @@ AllocErr: CLEANUP: if (!_ret_ && Window && Window->Wnd && ti) + { + ULONG SavedHooks; + /* HACK: co_UserDestroyWindow will call CBT proc with code HCBT_DESTROYWND. + Applications can choke on this as a hwnd was never returned from this call */ + /* Save the flags */ + SavedHooks = ((PTHREADINFO)PsGetCurrentThreadWin32Thread())->fsHooks; + + /* Temporary remove the flag */ + ((PTHREADINFO)PsGetCurrentThreadWin32Thread())->fsHooks &= ~HOOKID_TO_FLAG(WH_CBT); + + /* Destroy the window */ co_UserDestroyWindow(Window); + + /* Restore the flag */ + ((PTHREADINFO)PsGetCurrentThreadWin32Thread())->fsHooks = SavedHooks; + } + // UserFreeWindowInfo(ti, Window); if (Window) { From 91a35b7ec11b661e627713b8c0e740a1103aaeae Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Thu, 29 Apr 2010 16:39:52 +0000 Subject: [PATCH 087/131] [NTOSKRNL] - On backtraces, print the address of the call instruction (assumed 5 bytes lentgh) instead of the return address, which in many cases does not make sense. (WinDbg does it this way, too) - Fix Ke386SaveFpuState to store the fpu state in the buffer, but in the pointer to the buffer - Anable Ke386SaveFpuState to save the floating point state in KiNpxHandler and KiTrap13Handler, so we know what error we got. - Disable saving debug registers in the trap frame, as long as the kernel doesn't support this - Fixes ntdll_winetest exception / OllyDbg freeze/reboot See issue #5301 for more details. svn path=/trunk/; revision=47060 --- .../ntoskrnl/include/internal/i386/intrin_i.h | 4 +- reactos/ntoskrnl/kdbg/kdb_cli.c | 3 +- reactos/ntoskrnl/ke/i386/exp.c | 2 +- reactos/ntoskrnl/ke/i386/traphdlr.c | 102 +++++++++--------- 4 files changed, 56 insertions(+), 55 deletions(-) diff --git a/reactos/ntoskrnl/include/internal/i386/intrin_i.h b/reactos/ntoskrnl/include/internal/i386/intrin_i.h index 94501841149..6cb2a7cbf0a 100644 --- a/reactos/ntoskrnl/include/internal/i386/intrin_i.h +++ b/reactos/ntoskrnl/include/internal/i386/intrin_i.h @@ -42,11 +42,11 @@ Ke386SaveFpuState(IN PFX_SAVE_AREA SaveArea) extern ULONG KeI386FxsrPresent; if (KeI386FxsrPresent) { - __asm__ __volatile__ ("fxsave %0\n" : : "m"(SaveArea)); + __asm__ __volatile__ ("fxsave %0\n" : : "m"(*SaveArea)); } else { - __asm__ __volatile__ ("fnsave %0\n wait\n" : : "m"(SaveArea)); + __asm__ __volatile__ ("fnsave %0\n wait\n" : : "m"(*SaveArea)); } } diff --git a/reactos/ntoskrnl/kdbg/kdb_cli.c b/reactos/ntoskrnl/kdbg/kdb_cli.c index fa42826c9fa..4c469fd3721 100644 --- a/reactos/ntoskrnl/kdbg/kdb_cli.c +++ b/reactos/ntoskrnl/kdbg/kdb_cli.c @@ -823,7 +823,8 @@ KdbpCmdBackTrace( break; } - if (!KdbSymPrintAddress((PVOID)Address)) + /* Print the location of the call instruction */ + if (!KdbSymPrintAddress((PVOID)(Address - 5))) KdbpPrint("<%08x>\n", Address); else KdbpPrint("\n"); diff --git a/reactos/ntoskrnl/ke/i386/exp.c b/reactos/ntoskrnl/ke/i386/exp.c index 284ff19e3bf..38dded77062 100644 --- a/reactos/ntoskrnl/ke/i386/exp.c +++ b/reactos/ntoskrnl/ke/i386/exp.c @@ -584,7 +584,7 @@ KeContextToTrapFrame(IN PCONTEXT Context, } /* Handle the Debug Registers */ - if ((ContextFlags & CONTEXT_DEBUG_REGISTERS) == CONTEXT_DEBUG_REGISTERS) + if (0 && (ContextFlags & CONTEXT_DEBUG_REGISTERS) == CONTEXT_DEBUG_REGISTERS) { /* Loop DR registers */ for (i = 0; i < 4; i++) diff --git a/reactos/ntoskrnl/ke/i386/traphdlr.c b/reactos/ntoskrnl/ke/i386/traphdlr.c index f9a954ec298..b9033c2069e 100644 --- a/reactos/ntoskrnl/ke/i386/traphdlr.c +++ b/reactos/ntoskrnl/ke/i386/traphdlr.c @@ -240,7 +240,7 @@ KiNpxHandler(IN PKTRAP_FRAME TrapFrame, } /* User or kernel trap -- get ready to issue an exception */ - if (Thread->NpxState == NPX_STATE_NOT_LOADED) + //if (Thread->NpxState == NPX_STATE_NOT_LOADED) { /* Update CR0 */ Cr0 = __readcr0(); @@ -248,7 +248,7 @@ KiNpxHandler(IN PKTRAP_FRAME TrapFrame, __writecr0(Cr0); /* Save FPU state */ - //Ke386SaveFpuState(SaveArea); + Ke386SaveFpuState(SaveArea); /* Mark CR0 state dirty */ Cr0 |= NPX_STATE_NOT_LOADED; @@ -1082,64 +1082,64 @@ KiTrap0DHandler(IN PKTRAP_FRAME TrapFrame) * we should probably table this for now since it's not a "real" issue. */ - /* - * NOTE2: Another scenario is the IRET during a V8086 restore (BIOS Call) - * which will cause a GPF since the trap frame is a total mess (on purpose) - * as built in KiEnterV86Mode. - * - * The idea is to scan for IRET, scan for the known EIP adress, validate CS - * and then manually issue a jump to the V8086 return EIP. - */ - Instructions = (PUCHAR)TrapFrame->Eip; - if (Instructions[0] == 0xCF) - { - /* - * Some evil shit is going on here -- this is not the SS:ESP you're - * looking for! Instead, this is actually CS:EIP you're looking at! - * Why? Because part of the trap frame actually corresponds to the IRET - * stack during the trap exit! - */ - if ((TrapFrame->HardwareEsp == (ULONG)Ki386BiosCallReturnAddress) && - (TrapFrame->HardwareSegSs == (KGDT_R0_CODE | RPL_MASK))) - { - /* Exit the V86 trap! */ - Ki386BiosCallReturnAddress(TrapFrame); - } - else - { - /* Otherwise, this is another kind of IRET fault */ - UNIMPLEMENTED; - while (TRUE); - } - } + /* + * NOTE2: Another scenario is the IRET during a V8086 restore (BIOS Call) + * which will cause a GPF since the trap frame is a total mess (on purpose) + * as built in KiEnterV86Mode. + * + * The idea is to scan for IRET, scan for the known EIP adress, validate CS + * and then manually issue a jump to the V8086 return EIP. + */ + Instructions = (PUCHAR)TrapFrame->Eip; + if (Instructions[0] == 0xCF) + { + /* + * Some evil shit is going on here -- this is not the SS:ESP you're + * looking for! Instead, this is actually CS:EIP you're looking at! + * Why? Because part of the trap frame actually corresponds to the IRET + * stack during the trap exit! + */ + if ((TrapFrame->HardwareEsp == (ULONG)Ki386BiosCallReturnAddress) && + (TrapFrame->HardwareSegSs == (KGDT_R0_CODE | RPL_MASK))) + { + /* Exit the V86 trap! */ + Ki386BiosCallReturnAddress(TrapFrame); + } + else + { + /* Otherwise, this is another kind of IRET fault */ + UNIMPLEMENTED; + while (TRUE); + } + } /* So since we're not dealing with the above case, check for RDMSR/WRMSR */ - if ((Instructions[0] == 0xF) && // 2-byte opcode + if ((Instructions[0] == 0xF) && // 2-byte opcode (((Instructions[1] >> 8) == 0x30) || // RDMSR ((Instructions[2] >> 8) == 0x32))) // WRMSR - { + { /* Unknown CPU MSR, so raise an access violation */ KiDispatchException0Args(STATUS_ACCESS_VIOLATION, TrapFrame->Eip, TrapFrame); - } + } - /* Check for lazy segment load */ - if (TrapFrame->SegDs != (KGDT_R3_DATA | RPL_MASK)) - { - /* Fix it */ - TrapFrame->SegDs = (KGDT_R3_DATA | RPL_MASK); - } - else if (TrapFrame->SegEs != (KGDT_R3_DATA | RPL_MASK)) - { + /* Check for lazy segment load */ + if (TrapFrame->SegDs != (KGDT_R3_DATA | RPL_MASK)) + { + /* Fix it */ + TrapFrame->SegDs = (KGDT_R3_DATA | RPL_MASK); + } + else if (TrapFrame->SegEs != (KGDT_R3_DATA | RPL_MASK)) + { /* Fix it */ TrapFrame->SegEs = (KGDT_R3_DATA | RPL_MASK); - } - else - { - /* Whatever it is, we can't handle it */ - KiSystemFatalException(EXCEPTION_GP_FAULT, TrapFrame); - } + } + else + { + /* Whatever it is, we can't handle it */ + KiSystemFatalException(EXCEPTION_GP_FAULT, TrapFrame); + } /* Return to where we came from */ KiTrapReturn(TrapFrame); @@ -1353,7 +1353,7 @@ KiTrap13Handler(IN PKTRAP_FRAME TrapFrame) __writecr0(Cr0); /* Save FPU state */ - //Ke386SaveFpuState(SaveArea); + Ke386SaveFpuState(SaveArea); /* Mark CR0 state dirty */ Cr0 |= NPX_STATE_NOT_LOADED; @@ -1379,7 +1379,7 @@ KiTrap13Handler(IN PKTRAP_FRAME TrapFrame) FSW_UNDERFLOW | FSW_PRECISION); Error &= MxCsrMask; - + /* Now handle any of those legal errors */ if (Error & (FSW_INVALID_OPERATION | FSW_DENORMAL | From 8e5ba15296ba7862e0fec9eea79193089aaf71ca Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Thu, 29 Apr 2010 19:20:32 +0000 Subject: [PATCH 088/131] [INF] - Comment out the service installation for VBE and VGA so the configuration set in first-stage won't get overwritten - Nasty graphical glitches still remain in VGA mode - Fixes bug 2073 and bug 4192 svn path=/trunk/; revision=47061 --- reactos/media/inf/display.inf | Bin 6476 -> 6534 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/reactos/media/inf/display.inf b/reactos/media/inf/display.inf index a9469631e79220346346aa9b12f60a0a41ff6762..f2179abb9c1045bb69ebabda5dfc0e28c68d0d19 100644 GIT binary patch delta 52 tcmX?O)MmV)f Date: Thu, 29 Apr 2010 19:56:18 +0000 Subject: [PATCH 089/131] [PAINT] - angle rounding for lines and polygons when SHIFT key is pressed - equal width and height for (rounded) rectangles and ellipses when SHIFT key is pressed Based on a patch by Katayama Hirofumi, see #5285 svn path=/trunk/; revision=47062 --- reactos/base/applications/paint/main.c | 9 ++-- reactos/base/applications/paint/mouse.c | 72 +++++++++++++++++++++++++ 2 files changed, 78 insertions(+), 3 deletions(-) diff --git a/reactos/base/applications/paint/main.c b/reactos/base/applications/paint/main.c index 98565f4b36c..904220567d1 100644 --- a/reactos/base/applications/paint/main.c +++ b/reactos/base/applications/paint/main.c @@ -143,6 +143,7 @@ _tWinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPTSTR lpszArgument HBITMAP tempBm; int i; TCHAR tooltips[16][30]; + HDC hDC; TCHAR *c; TCHAR sfnFilename[1000]; @@ -152,7 +153,7 @@ _tWinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPTSTR lpszArgument TCHAR ofnFiletitle[256]; TCHAR ofnFilter[1000]; TCHAR miniaturetitle[100]; - int custColors[16] = { 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, + static int custColors[16] = { 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff }; @@ -371,8 +372,10 @@ _tWinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPTSTR lpszArgument CreateWindowEx(0, _T("Scrollbox"), _T(""), WS_CHILD | WS_VISIBLE, 3, 3, imgXRes, imgYRes, hScrlClient, NULL, hThisInstance, NULL); - hDrawingDC = CreateCompatibleDC(GetDC(hImageArea)); - hSelDC = CreateCompatibleDC(GetDC(hImageArea)); + hDC = GetDC(hImageArea); + hDrawingDC = CreateCompatibleDC(hDC); + hSelDC = CreateCompatibleDC(hDC); + ReleaseDC(hImageArea, hDC); SelectObject(hDrawingDC, CreatePen(PS_SOLID, 0, fgColor)); SelectObject(hDrawingDC, CreateSolidBrush(bgColor)); diff --git a/reactos/base/applications/paint/mouse.c b/reactos/base/applications/paint/mouse.c index 4f5c13031fd..9165291594e 100644 --- a/reactos/base/applications/paint/mouse.c +++ b/reactos/base/applications/paint/mouse.c @@ -25,6 +25,34 @@ placeSelWin() //SendMessage(hSelection, WM_PAINT, 0, 0); } +void +regularize(short x0, short y0, short *x1, short *y1) +{ + if (abs(*x1 - x0) >= abs(*y1 - y0)) + *y1 = y0 + (*y1 > y0 ? abs(*x1 - x0) : -abs(*x1 - x0)); + else + *x1 = x0 + (*x1 > x0 ? abs(*y1 - y0) : -abs(*y1 - y0)); +} + +void +roundTo8Directions(short x0, short y0, short *x1, short *y1) +{ + if (abs(*x1 - x0) >= abs(*y1 - y0)) + { + if (abs(*y1 - y0) * 5 < abs(*x1 - x0) * 2) + *y1 = y0; + else + *y1 = y0 + (*y1 > y0 ? abs(*x1 - x0) : -abs(*x1 - x0)); + } + else + { + if (abs(*x1 - x0) * 5 < abs(*y1 - y0) * 2) + *x1 = x0; + else + *x1 = x0 + (*x1 > x0 ? abs(*y1 - y0) : -abs(*y1 - y0)); + } +} + POINT pointStack[256]; short pointSP; POINT *ptStack = NULL; @@ -147,6 +175,8 @@ whilePaintingL(HDC hdc, short x, short y, int fg, int bg) break; case 11: resetToU1(); + if (GetAsyncKeyState(VK_SHIFT) < 0) + roundTo8Directions(startX, startY, &x, &y); Line(hdc, startX, startY, x, y, fg, lineWidth); break; case 12: @@ -169,21 +199,30 @@ whilePaintingL(HDC hdc, short x, short y, int fg, int bg) break; case 13: resetToU1(); + if (GetAsyncKeyState(VK_SHIFT) < 0) + regularize(startX, startY, &x, &y); Rect(hdc, startX, startY, x, y, fg, bg, lineWidth, shapeStyle); break; case 14: resetToU1(); pointStack[pointSP].x = x; pointStack[pointSP].y = y; + if ((pointSP > 0) && (GetAsyncKeyState(VK_SHIFT) < 0)) + roundTo8Directions(pointStack[pointSP - 1].x, pointStack[pointSP - 1].y, + (short *)&pointStack[pointSP].x, (short *)&pointStack[pointSP].y); if (pointSP + 1 >= 2) Poly(hdc, pointStack, pointSP + 1, fg, bg, lineWidth, shapeStyle, FALSE); break; case 15: resetToU1(); + if (GetAsyncKeyState(VK_SHIFT) < 0) + regularize(startX, startY, &x, &y); Ellp(hdc, startX, startY, x, y, fg, bg, lineWidth, shapeStyle); break; case 16: resetToU1(); + if (GetAsyncKeyState(VK_SHIFT) < 0) + regularize(startX, startY, &x, &y); RRect(hdc, startX, startY, x, y, fg, bg, lineWidth, shapeStyle); break; } @@ -276,6 +315,8 @@ endPaintingL(HDC hdc, short x, short y, int fg, int bg) break; case 11: resetToU1(); + if (GetAsyncKeyState(VK_SHIFT) < 0) + roundTo8Directions(startX, startY, &x, &y); Line(hdc, startX, startY, x, y, fg, lineWidth); break; case 12: @@ -285,12 +326,17 @@ endPaintingL(HDC hdc, short x, short y, int fg, int bg) break; case 13: resetToU1(); + if (GetAsyncKeyState(VK_SHIFT) < 0) + regularize(startX, startY, &x, &y); Rect(hdc, startX, startY, x, y, fg, bg, lineWidth, shapeStyle); break; case 14: resetToU1(); pointStack[pointSP].x = x; pointStack[pointSP].y = y; + if ((pointSP > 0) && (GetAsyncKeyState(VK_SHIFT) < 0)) + roundTo8Directions(pointStack[pointSP - 1].x, pointStack[pointSP - 1].y, + (short *)&pointStack[pointSP].x, (short *)&pointStack[pointSP].y); pointSP++; if (pointSP >= 2) { @@ -310,10 +356,14 @@ endPaintingL(HDC hdc, short x, short y, int fg, int bg) break; case 15: resetToU1(); + if (GetAsyncKeyState(VK_SHIFT) < 0) + regularize(startX, startY, &x, &y); Ellp(hdc, startX, startY, x, y, fg, bg, lineWidth, shapeStyle); break; case 16: resetToU1(); + if (GetAsyncKeyState(VK_SHIFT) < 0) + regularize(startX, startY, &x, &y); RRect(hdc, startX, startY, x, y, fg, bg, lineWidth, shapeStyle); break; } @@ -398,6 +448,8 @@ whilePaintingR(HDC hdc, short x, short y, int fg, int bg) break; case 11: resetToU1(); + if (GetAsyncKeyState(VK_SHIFT) < 0) + roundTo8Directions(startX, startY, &x, &y); Line(hdc, startX, startY, x, y, bg, lineWidth); break; case 12: @@ -420,21 +472,30 @@ whilePaintingR(HDC hdc, short x, short y, int fg, int bg) break; case 13: resetToU1(); + if (GetAsyncKeyState(VK_SHIFT) < 0) + regularize(startX, startY, &x, &y); Rect(hdc, startX, startY, x, y, bg, fg, lineWidth, shapeStyle); break; case 14: resetToU1(); pointStack[pointSP].x = x; pointStack[pointSP].y = y; + if ((pointSP > 0) && (GetAsyncKeyState(VK_SHIFT) < 0)) + roundTo8Directions(pointStack[pointSP - 1].x, pointStack[pointSP - 1].y, + (short *)&pointStack[pointSP].x, (short *)&pointStack[pointSP].y); if (pointSP + 1 >= 2) Poly(hdc, pointStack, pointSP + 1, bg, fg, lineWidth, shapeStyle, FALSE); break; case 15: resetToU1(); + if (GetAsyncKeyState(VK_SHIFT) < 0) + regularize(startX, startY, &x, &y); Ellp(hdc, startX, startY, x, y, bg, fg, lineWidth, shapeStyle); break; case 16: resetToU1(); + if (GetAsyncKeyState(VK_SHIFT) < 0) + regularize(startX, startY, &x, &y); RRect(hdc, startX, startY, x, y, bg, fg, lineWidth, shapeStyle); break; } @@ -457,6 +518,8 @@ endPaintingR(HDC hdc, short x, short y, int fg, int bg) break; case 11: resetToU1(); + if (GetAsyncKeyState(VK_SHIFT) < 0) + roundTo8Directions(startX, startY, &x, &y); Line(hdc, startX, startY, x, y, bg, lineWidth); break; case 12: @@ -466,12 +529,17 @@ endPaintingR(HDC hdc, short x, short y, int fg, int bg) break; case 13: resetToU1(); + if (GetAsyncKeyState(VK_SHIFT) < 0) + regularize(startX, startY, &x, &y); Rect(hdc, startX, startY, x, y, bg, fg, lineWidth, shapeStyle); break; case 14: resetToU1(); pointStack[pointSP].x = x; pointStack[pointSP].y = y; + if ((pointSP > 0) && (GetAsyncKeyState(VK_SHIFT) < 0)) + roundTo8Directions(pointStack[pointSP - 1].x, pointStack[pointSP - 1].y, + (short *)&pointStack[pointSP].x, (short *)&pointStack[pointSP].y); pointSP++; if (pointSP >= 2) { @@ -491,10 +559,14 @@ endPaintingR(HDC hdc, short x, short y, int fg, int bg) break; case 15: resetToU1(); + if (GetAsyncKeyState(VK_SHIFT) < 0) + regularize(startX, startY, &x, &y); Ellp(hdc, startX, startY, x, y, bg, fg, lineWidth, shapeStyle); break; case 16: resetToU1(); + if (GetAsyncKeyState(VK_SHIFT) < 0) + regularize(startX, startY, &x, &y); RRect(hdc, startX, startY, x, y, bg, fg, lineWidth, shapeStyle); break; } From 04c6b4502390e39177bc17508fa3caacc1e22af9 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Thu, 29 Apr 2010 20:51:28 +0000 Subject: [PATCH 090/131] [MSIMTF] Silence debug spam svn path=/trunk/; revision=47063 --- reactos/dll/win32/msimtf/activeimmapp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/dll/win32/msimtf/activeimmapp.c b/reactos/dll/win32/msimtf/activeimmapp.c index 73ce0758c70..d8446267893 100644 --- a/reactos/dll/win32/msimtf/activeimmapp.c +++ b/reactos/dll/win32/msimtf/activeimmapp.c @@ -655,7 +655,7 @@ static HRESULT WINAPI ActiveIMMApp_Deactivate(IActiveIMMApp* This) static HRESULT WINAPI ActiveIMMApp_OnDefWindowProc(IActiveIMMApp* This, HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam, LRESULT *plResult) { - FIXME("Stub (%p %x %lx %lx)\n",hWnd,Msg,wParam,lParam); + //FIXME("Stub (%p %x %lx %lx)\n",hWnd,Msg,wParam,lParam); return E_FAIL; } From 174a4670ea5a7893c79d9bb0d87a2b36adedd5ec Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Thu, 29 Apr 2010 22:35:49 +0000 Subject: [PATCH 091/131] [NTOSKRNL] - Fix a horrible casting bug - EventCategoryData1 is a pointer to a GUID not a pointer to a UNICODE_STRING - Convert the GUID into a UNICODE_STRING properly by using RtlStringFromGUID and pass that string to RtlCompareUnicodeString - Fix another bug which results in us sending EventCategoryHardwareProfileChange and EventCategoryTargetDeviceChange events to everyone registered for PnP notifications - Fixes sending EventCategoryDeviceInterfaceChange notifications that happen after calling IoRegisterPlugPlayNotification svn path=/trunk/; revision=47064 --- reactos/ntoskrnl/io/pnpmgr/pnpnotify.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/reactos/ntoskrnl/io/pnpmgr/pnpnotify.c b/reactos/ntoskrnl/io/pnpmgr/pnpnotify.c index c328c80965f..f19f986e4e3 100644 --- a/reactos/ntoskrnl/io/pnpmgr/pnpnotify.c +++ b/reactos/ntoskrnl/io/pnpmgr/pnpnotify.c @@ -42,6 +42,8 @@ IopNotifyPlugPlayNotification( PLIST_ENTRY ListEntry; PVOID NotificationStructure; BOOLEAN CallCurrentEntry; + UNICODE_STRING GuidString; + NTSTATUS Status; ASSERT(DeviceObject); @@ -71,6 +73,13 @@ IopNotifyPlugPlayNotification( RtlCopyMemory(&NotificationInfos->Event, Event, sizeof(GUID)); RtlCopyMemory(&NotificationInfos->InterfaceClassGuid, EventCategoryData1, sizeof(GUID)); NotificationInfos->SymbolicLinkName = (PUNICODE_STRING)EventCategoryData2; + Status = RtlStringFromGUID(&NotificationInfos->InterfaceClassGuid, &GuidString); + if (!NT_SUCCESS(Status)) + { + KeReleaseGuardedMutex(&PnpNotifyListLock); + ExFreePool(NotificationStructure); + return; + } break; } case EventCategoryHardwareProfileChange: @@ -125,12 +134,17 @@ IopNotifyPlugPlayNotification( ChangeEntry = CONTAINING_RECORD(ListEntry, PNP_NOTIFY_ENTRY, PnpNotifyList); CallCurrentEntry = FALSE; + if (ChangeEntry->EventCategory != EventCategory) + { + ListEntry = ListEntry->Flink; + continue; + } + switch (EventCategory) { case EventCategoryDeviceInterfaceChange: { - if (ChangeEntry->EventCategory == EventCategory - && RtlCompareUnicodeString(&ChangeEntry->Guid, (PUNICODE_STRING)EventCategoryData1, FALSE) == 0) + if (RtlCompareUnicodeString(&ChangeEntry->Guid, &GuidString, FALSE) == 0) { CallCurrentEntry = TRUE; } @@ -174,6 +188,8 @@ IopNotifyPlugPlayNotification( } KeReleaseGuardedMutex(&PnpNotifyListLock); ExFreePoolWithTag(NotificationStructure, TAG_PNP_NOTIFY); + if (EventCategory == EventCategoryDeviceInterfaceChange) + RtlFreeUnicodeString(&GuidString); } /* PUBLIC FUNCTIONS **********************************************************/ From 0409ef75e863fe0497616b0a25d1642ce5a915ed Mon Sep 17 00:00:00 2001 From: Michael Martin Date: Fri, 30 Apr 2010 11:23:17 +0000 Subject: [PATCH 092/131] [win32k] - When calling NtUserCallNextHookEx check that the current hook is not the first in the chain. If so don't call the hook proc and just return, as it has already been called and it makes no sense for the NextHook function to call the first hook proc. Fixes bugs #4461 and #4407. - The previous commit claiming to fix bug #4461 was incorrect, it may have actually fixed bug #5320. Testers please test. svn path=/trunk/; revision=47065 --- reactos/subsystems/win32/win32k/ntuser/hook.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/reactos/subsystems/win32/win32k/ntuser/hook.c b/reactos/subsystems/win32/win32k/ntuser/hook.c index 93633370c43..a71ea9bebf2 100644 --- a/reactos/subsystems/win32/win32k/ntuser/hook.c +++ b/reactos/subsystems/win32/win32k/ntuser/hook.c @@ -1050,6 +1050,12 @@ NtUserCallNextHookEx(int Code, if (!HookObj) RETURN( 0); + /* Check that the first hook in the chain is not this hook */ + NextObj = IntGetFirstHook(IntGetTable(HookObj), HookObj->HookId); + + /* Its the same so it has already been called */ + if (HookObj == NextObj) RETURN(0); + UserReferenceObject(HookObj); Ansi = HookObj->Ansi; From 8dc269c258e4554784f2fa13949e1a0f65d3d0c4 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Fri, 30 Apr 2010 22:47:44 +0000 Subject: [PATCH 093/131] [NTOSKRNL] - Fix RtlWalkFrameChain to do usermode back traces for threads that are not system threads. Also use _SEH2_YIELD when leaving the SEH block. svn path=/trunk/; revision=47066 --- reactos/ntoskrnl/rtl/libsupp.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/reactos/ntoskrnl/rtl/libsupp.c b/reactos/ntoskrnl/rtl/libsupp.c index 27f78952c72..4a6c8bc55ea 100644 --- a/reactos/ntoskrnl/rtl/libsupp.c +++ b/reactos/ntoskrnl/rtl/libsupp.c @@ -317,7 +317,7 @@ RtlWalkFrameChain(OUT PVOID *Callers, &StackBegin, &StackEnd); if (!Result) return 0; - } + } /* Use a SEH block for maximum protection */ _SEH2_TRY @@ -331,12 +331,11 @@ RtlWalkFrameChain(OUT PVOID *Callers, /* Make sure we can trust the TEB and trap frame */ if (!(Teb) || - !(Thread->SystemThread) || (KeIsAttachedProcess()) || (KeGetCurrentIrql() >= DISPATCH_LEVEL)) { /* Invalid or unsafe attempt to get the stack */ - return 0; + _SEH2_YIELD(return 0;) } /* Get the stack limits */ From 9bb0bed65510639d1fa3cc2774c74c762d8d8093 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Fri, 30 Apr 2010 22:48:43 +0000 Subject: [PATCH 094/131] [WIN32K] - Fix IntDumpHandleTable, it was very broken. svn path=/trunk/; revision=47067 --- .../subsystems/win32/win32k/objects/gdidbg.c | 136 +++++++++++------- 1 file changed, 87 insertions(+), 49 deletions(-) diff --git a/reactos/subsystems/win32/win32k/objects/gdidbg.c b/reactos/subsystems/win32/win32k/objects/gdidbg.c index a9991ad3610..efa686fc06b 100644 --- a/reactos/subsystems/win32/win32k/objects/gdidbg.c +++ b/reactos/subsystems/win32/win32k/objects/gdidbg.c @@ -3,23 +3,48 @@ #define KeRosDumpStackFrames(Frames, Count) KdSystemDebugControl('DsoR', (PVOID)Frames, Count, NULL, 0, NULL, KernelMode) NTSYSAPI ULONG APIENTRY RtlWalkFrameChain(OUT PVOID *Callers, IN ULONG Count, IN ULONG Flags); -static int leak_reported = 0; -#define GDI_STACK_LEVELS 12 -static ULONG GDIHandleAllocator[GDI_HANDLE_COUNT][GDI_STACK_LEVELS+1]; -static ULONG GDIHandleLocker[GDI_HANDLE_COUNT][GDI_STACK_LEVELS+1]; -static ULONG GDIHandleShareLocker[GDI_HANDLE_COUNT][GDI_STACK_LEVELS+1]; -static ULONG GDIHandleDeleter[GDI_HANDLE_COUNT][GDI_STACK_LEVELS+1]; +#define GDI_STACK_LEVELS 20 +static ULONG_PTR GDIHandleAllocator[GDI_HANDLE_COUNT][GDI_STACK_LEVELS+1]; +static ULONG_PTR GDIHandleLocker[GDI_HANDLE_COUNT][GDI_STACK_LEVELS+1]; +static ULONG_PTR GDIHandleShareLocker[GDI_HANDLE_COUNT][GDI_STACK_LEVELS+1]; +static ULONG_PTR GDIHandleDeleter[GDI_HANDLE_COUNT][GDI_STACK_LEVELS+1]; struct DbgOpenGDIHandle { ULONG idx; int count; }; -#define H 1024 -static struct DbgOpenGDIHandle h[H]; +#define MAX_BACKTRACES 1024 +static struct DbgOpenGDIHandle AllocatorTable[MAX_BACKTRACES]; + +static +BOOL +CompareBacktraces(ULONG idx1, ULONG idx2) +{ + ULONG iLevel; + + /* Loop all stack levels */ + for (iLevel = 0; iLevel < GDI_STACK_LEVELS; iLevel++) + { + if (GDIHandleAllocator[idx1][iLevel] + != GDIHandleAllocator[idx2][iLevel]) +// if (GDIHandleShareLocker[idx1][iLevel] +// != GDIHandleShareLocker[idx2][iLevel]) + { + return FALSE; + } + } + + return TRUE; +} + +#define IS_HANDLE_VALID(idx) \ + ((GdiHandleTable->Entries[idx].Type & GDI_ENTRY_BASETYPE_MASK) != 0) void IntDumpHandleTable(PGDI_HANDLE_TABLE HandleTable) { - int i, n = 0, j, k, J; + static int leak_reported = 0; + int i, j, idx, nTraces = 0; + KIRQL OldIrql; if (leak_reported) { @@ -30,68 +55,79 @@ void IntDumpHandleTable(PGDI_HANDLE_TABLE HandleTable) leak_reported = 1; DPRINT1("reporting gdi handle abusers:\n"); - /* step through GDI handle table and find out who our culprit is... */ - for (i = RESERVE_ENTRIES_COUNT; i < GDI_HANDLE_COUNT; i++) + /* We've got serious business to do */ + KeRaiseIrql(DISPATCH_LEVEL, &OldIrql); + + /* Step through GDI handle table and find out who our culprit is... */ + for (idx = RESERVE_ENTRIES_COUNT; idx < GDI_HANDLE_COUNT; idx++) { - for (j = 0; j < n; j++) + /* If the handle is free, continue */ + if (!IS_HANDLE_VALID(idx)) continue; + + /* Step through all previous backtraces */ + for (j = 0; j < nTraces; j++) { -next: - J = h[j].idx; - for (k = 0; k < GDI_STACK_LEVELS; k++) + /* Check if the backtrace matches */ + if (CompareBacktraces(idx, AllocatorTable[j].idx)) { - if (GDIHandleAllocator[i][k] - != GDIHandleAllocator[J][k]) - { - if (++j == n) - goto done; - else - goto next; - } + /* It matches, increment count and break out */ + AllocatorTable[j].count++; + break; } - goto done; } -done: - if (j < H) + + /* Did we find a new backtrace? */ + if (j == nTraces) { - if (j == n) - { - h[j].idx = i; - h[j].count = 1; - n = n + 1; - } - else - h[j].count++; + /* Break out, if we reached the maximum */ + if (nTraces == MAX_BACKTRACES) break; + + /* Initialize this entry */ + AllocatorTable[j].idx = idx; + AllocatorTable[j].count = 1; + nTraces++; } } + /* bubble sort time! weeeeee!! */ - for (i = 0; i < n-1; i++) + for (i = 0; i < nTraces-1; i++) { - if (h[i].count < h[i+1].count) + if (AllocatorTable[i].count < AllocatorTable[i+1].count) { - struct DbgOpenGDIHandle t; - t = h[i+1]; - h[i+1] = h[i]; + struct DbgOpenGDIHandle temp; + + temp = AllocatorTable[i+1]; + AllocatorTable[i+1] = AllocatorTable[i]; j = i; - while (j > 0 && h[j-1].count < t.count) + while (j > 0 && AllocatorTable[j-1].count < temp.count) j--; - h[j] = t; + AllocatorTable[j] = temp; } } - /* print the worst offenders... */ - DbgPrint("Worst GDI Handle leak offenders (out of %i unique locations):\n", n); - for (i = 0; i < n && h[i].count > 1; i++) + + /* Print the worst offenders... */ + DbgPrint("Worst GDI Handle leak offenders (out of %i unique locations):\n", nTraces); + for (i = 0; i < nTraces && AllocatorTable[i].count > 1; i++) { /* Print out the allocation count */ - DbgPrint(" %i allocs: ", h[i].count); + DbgPrint(" %i allocs, type = 0x%lx:\n", + AllocatorTable[i].count, + GdiHandleTable->Entries[AllocatorTable[i].idx].Type); /* Dump the frames */ - KeRosDumpStackFrames(GDIHandleAllocator[h[i].idx], GDI_STACK_LEVELS); + KeRosDumpStackFrames(GDIHandleAllocator[AllocatorTable[i].idx], GDI_STACK_LEVELS); + //KeRosDumpStackFrames(GDIHandleShareLocker[AllocatorTable[i].idx], GDI_STACK_LEVELS); /* Print new line for better readability */ DbgPrint("\n"); } - if (i < n && h[i].count == 1) + + if (i < nTraces) DbgPrint("(list terminated - the remaining entries have 1 allocation only)\n"); + + KeLowerIrql(OldIrql); + + ASSERT(FALSE); } ULONG @@ -101,11 +137,13 @@ CaptureStackBackTace(PVOID* pFrames, ULONG nFramesToCapture) memset(pFrames, 0x00, (nFramesToCapture + 1) * sizeof(PVOID)); - nFrameCount = RtlCaptureStackBackTrace(1, nFramesToCapture, pFrames, NULL); + nFrameCount = RtlWalkFrameChain(pFrames, nFramesToCapture, 0); if (nFrameCount < nFramesToCapture) { - nFrameCount += RtlWalkFrameChain(pFrames + nFrameCount, nFramesToCapture - nFrameCount, 1); + nFrameCount += RtlWalkFrameChain(pFrames + nFrameCount, + nFramesToCapture - nFrameCount, + 1); } return nFrameCount; From e66431b123de0038bdcdc0fe02396d1d8701a284 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sat, 1 May 2010 01:52:47 +0000 Subject: [PATCH 095/131] [PCI] - Store correct bus and slot information in resource lists that we give in response to IRP_MN_QUERY_RESOURCES and IRP_MN_QUERY_RESOURCE_REQUIREMENTS - Fixes bug 4354 svn path=/trunk/; revision=47068 --- reactos/drivers/bus/pci/pdo.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/reactos/drivers/bus/pci/pdo.c b/reactos/drivers/bus/pci/pdo.c index 266b95d6a97..e5961fbf3a2 100644 --- a/reactos/drivers/bus/pci/pdo.c +++ b/reactos/drivers/bus/pci/pdo.c @@ -413,8 +413,8 @@ PdoQueryResourceRequirements( RtlZeroMemory(ResourceList, ListSize); ResourceList->ListSize = ListSize; ResourceList->InterfaceType = PCIBus; - ResourceList->BusNumber = 0; - ResourceList->SlotNumber = 0; + ResourceList->BusNumber = DeviceExtension->PciDevice->BusNumber; + ResourceList->SlotNumber = DeviceExtension->PciDevice->SlotNumber.u.AsULONG; ResourceList->AlternativeLists = 1; ResourceList->List[0].Version = 1; @@ -717,7 +717,7 @@ PdoQueryResources( RtlZeroMemory(ResourceList, ListSize); ResourceList->Count = 1; ResourceList->List[0].InterfaceType = PCIBus; - ResourceList->List[0].BusNumber = 0; + ResourceList->List[0].BusNumber = DeviceExtension->PciDevice->BusNumber; PartialList = &ResourceList->List[0].PartialResourceList; PartialList->Version = 1; From a0790104cc81365eae2435808f4efee6c8a85d1c Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Sat, 1 May 2010 09:55:16 +0000 Subject: [PATCH 096/131] [WIN32K] - The timer implementation uses a bitmap to store window-less timers. As an optimization to find the first free index, it uses the variable "HintIndex" which points to the first timer index. In order to find the next free index, the RtlFindClearBitsAndSet function is used. When a new timer is allocated, the "HintIndex" variable is increased, which increases the search offset. Now if more than NUM_WINDOW_LESS_TIMERS (1024) timers are allocated, no more timers can be allocated because RtlFindClearBitsAndSet will claim no more index are available, because the free indexes are below the search offset. Everytime a timer gets freed, store the freed index in "HintIndex". As a result the timer implementation will always find a free timer index (when there is one) svn path=/trunk/; revision=47069 --- reactos/subsystems/win32/win32k/ntuser/timer.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/reactos/subsystems/win32/win32k/ntuser/timer.c b/reactos/subsystems/win32/win32k/ntuser/timer.c index 863987f689e..a1da2d64314 100644 --- a/reactos/subsystems/win32/win32k/ntuser/timer.c +++ b/reactos/subsystems/win32/win32k/ntuser/timer.c @@ -526,6 +526,8 @@ IntKillTimer(HWND Wnd, UINT_PTR IDEvent, BOOL SystemTimer) ASSERT(RtlAreBitsSet(&WindowLessTimersBitMap, IDEvent - 1, 1)); RtlClearBits(&WindowLessTimersBitMap, IDEvent - 1, 1); + HintIndex = IDEvent - 1; + IntUnlockWindowlessTimerBitmap(); } From 06ef98d273d3081335dd06e6adba0a75a7ae9fcc Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Sat, 1 May 2010 10:42:45 +0000 Subject: [PATCH 097/131] [WIN32K] - Add an assert to PostTimerMessages to catch null pointer windows - Add another assert to catch special windows (Window == 1) - Improve check if the window is '1' svn path=/trunk/; revision=47070 --- reactos/subsystems/win32/win32k/ntuser/timer.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/reactos/subsystems/win32/win32k/ntuser/timer.c b/reactos/subsystems/win32/win32k/ntuser/timer.c index a1da2d64314..1c34ab751d5 100644 --- a/reactos/subsystems/win32/win32k/ntuser/timer.c +++ b/reactos/subsystems/win32/win32k/ntuser/timer.c @@ -279,7 +279,9 @@ PostTimerMessages(PWINDOW_OBJECT Window) if (!pTmr) return FALSE; - if (Window && (int)Window != 1) + ASSERT(Window); + + if (Window && ((ULONG_PTR)Window != 1)) { if (!Window->Wnd) return FALSE; } @@ -294,6 +296,7 @@ PostTimerMessages(PWINDOW_OBJECT Window) (pTmr->pti == pti) && (pTmr->pWnd == Window)) { + ASSERT((ULONG_PTR)Window != 1); Msg.hwnd = Window->hSelf; Msg.message = (pTmr->flags & TMRF_SYSTEM) ? WM_SYSTIMER : WM_TIMER; Msg.wParam = (WPARAM) pTmr->nID; From d771ba8ec64e0b6339056590a98a6ec7d47c378a Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sat, 1 May 2010 10:43:39 +0000 Subject: [PATCH 098/131] [NEWINFLIB] - Change Unicode string functions from wcs* to str*W because glibc (Linux build) provides the wcs* functions but they use a wchar_t size of 32 bits instead of the required 16 bits. - Add a str*W to wcs* wrapper (infrosrtl.c) in order to use the wcs* function for the WIN32 build. - Add required str*W functions to the host library. ATTENTION: This might break the build bot although it has been tested on Windows and Linux!!! svn path=/trunk/; revision=47071 --- reactos/lib/host/wcsfuncs/wcsfuncs.c | 40 ++++++++++++++++++++++ reactos/lib/newinflib/builddep.h | 27 ++++++++------- reactos/lib/newinflib/infcore.c | 28 +++++++-------- reactos/lib/newinflib/infget.c | 24 ++++++------- reactos/lib/newinflib/infhost.h | 6 ---- reactos/lib/newinflib/infhostrtl.c | 4 +-- reactos/lib/newinflib/inflib.rbuild | 1 + reactos/lib/newinflib/infput.c | 2 +- reactos/lib/newinflib/infrosput.c | 6 ++-- reactos/lib/newinflib/infrosrtl.c | 51 ++++++++++++++++++++++++++++ 10 files changed, 138 insertions(+), 51 deletions(-) create mode 100644 reactos/lib/newinflib/infrosrtl.c diff --git a/reactos/lib/host/wcsfuncs/wcsfuncs.c b/reactos/lib/host/wcsfuncs/wcsfuncs.c index fc40b7408c6..58dafe13cd3 100644 --- a/reactos/lib/host/wcsfuncs/wcsfuncs.c +++ b/reactos/lib/host/wcsfuncs/wcsfuncs.c @@ -18,6 +18,17 @@ SIZE_T utf16_wcslen(PCWSTR str) return i; } + +SIZE_T strlenW(PCWSTR str) +{ + SIZE_T i; + + for(i = 0; str[i]; i++); + + return i; +} + + PWSTR utf16_wcschr(PWSTR str, WCHAR c) { SIZE_T i; @@ -30,6 +41,18 @@ PWSTR utf16_wcschr(PWSTR str, WCHAR c) return NULL; } +PWSTR strchrW(PWSTR str, WCHAR c) +{ + SIZE_T i; + + for(i = 0; str[i] && str[i] != c; i++); + + if(str[i]) + return &str[i]; + else + return NULL; +} + INT utf16_wcsncmp(PCWSTR string1, PCWSTR string2, size_t count) { while(count--) @@ -46,3 +69,20 @@ INT utf16_wcsncmp(PCWSTR string1, PCWSTR string2, size_t count) return 0; } + +INT strncmpW(PCWSTR string1, PCWSTR string2, size_t count) +{ + while(count--) + { + if(*string1 != *string2) + return 1; + + if(*string1 == 0) + return 0; + + string1++; + string2++; + } + + return 0; +} diff --git a/reactos/lib/newinflib/builddep.h b/reactos/lib/newinflib/builddep.h index 6930a7d597d..873ab39915f 100644 --- a/reactos/lib/newinflib/builddep.h +++ b/reactos/lib/newinflib/builddep.h @@ -28,20 +28,13 @@ #define INF_STATUS_BUFFER_OVERFLOW E2BIG #define INF_SUCCESS(x) (0 == (x)) -typedef char TCHAR, *PTCHAR, *PTSTR; -typedef const TCHAR *PCTSTR; - -#define _T(x) x -#define _tcsicmp strcasecmp -#define _tcslen strlen -#define _tcscpy strcpy -#define _tcstoul strtoul -#define _tcstol strtol #define STRFMT "%s" -#ifdef _MSC_VER -#define strcasecmp _stricmp -#endif +NTSTATUS NTAPI RtlMultiByteToUnicodeN(IN PWCHAR UnicodeString, + IN ULONG UnicodeSize, IN PULONG ResultSize, IN PCSTR MbString, IN ULONG MbSize); + +BOOLEAN NTAPI RtlIsTextUnicode( PVOID buf, INT len, INT *pf ); + #define IS_TEXT_UNICODE_ASCII16 1 #define IS_TEXT_UNICODE_REVERSE_ASCII16 16 @@ -69,10 +62,18 @@ typedef const TCHAR *PCTSTR; #include #define NTOS_MODE_USER #include -#include extern PVOID InfpHeap; +INT isspaceW(WCHAR c); +INT strlenW(PCWSTR s); +PWSTR strcpyW(PWSTR d, PCWSTR s); +PWSTR strncpyW(PWSTR d, PCWSTR s, SIZE_T c); +INT strcmpiW(PCWSTR s1, PCWSTR s2); +LONG strtolW(PCWSTR s, PWSTR *e, INT r); +ULONG strtoulW(PCWSTR s, PWSTR *e, INT r); + + #define FREE(Area) RtlFreeHeap(InfpHeap, 0, (Area)) #define MALLOC(Size) RtlAllocateHeap(InfpHeap, 0, (Size)) #define ZEROMEMORY(Area, Size) RtlZeroMemory((Area), (Size)) diff --git a/reactos/lib/newinflib/infcore.c b/reactos/lib/newinflib/infcore.c index b70ce795e19..7e187359e2a 100644 --- a/reactos/lib/newinflib/infcore.c +++ b/reactos/lib/newinflib/infcore.c @@ -154,7 +154,7 @@ InfpFindSection(PINFCACHE Cache, Section = Cache->FirstSection; while (Section != NULL) { - if (_wcsicmp (Section->Name, Name) == 0) + if (strcmpiW(Section->Name, Name) == 0) { return Section; } @@ -182,7 +182,7 @@ InfpAddSection(PINFCACHE Cache, /* Allocate and initialize the new section */ Size = (ULONG)FIELD_OFFSET(INFCACHESECTION, - Name[wcslen (Name) + 1]); + Name[strlenW(Name) + 1]); Section = (PINFCACHESECTION)MALLOC(Size); if (Section == NULL) { @@ -193,7 +193,7 @@ InfpAddSection(PINFCACHE Cache, Size); /* Copy section name */ - wcscpy (Section->Name, Name); + strcpyW(Section->Name, Name); /* Append section */ if (Cache->FirstSection == NULL) @@ -266,14 +266,14 @@ InfpAddKeyToLine(PINFCACHELINE Line, return NULL; } - Line->Key = (PWCHAR)MALLOC((wcslen(Key) + 1) * sizeof(WCHAR)); + Line->Key = (PWCHAR)MALLOC((strlenW(Key) + 1) * sizeof(WCHAR)); if (Line->Key == NULL) { DPRINT1("MALLOC() failed\n"); return NULL; } - wcscpy(Line->Key, Key); + strcpyW(Line->Key, Key); return (PVOID)Line->Key; } @@ -287,7 +287,7 @@ InfpAddFieldToLine(PINFCACHELINE Line, ULONG Size; Size = (ULONG)FIELD_OFFSET(INFCACHEFIELD, - Data[wcslen(Data) + 1]); + Data[strlenW(Data) + 1]); Field = (PINFCACHEFIELD)MALLOC(Size); if (Field == NULL) { @@ -296,7 +296,7 @@ InfpAddFieldToLine(PINFCACHELINE Line, } ZEROMEMORY (Field, Size); - wcscpy (Field->Data, Data); + strcpyW(Field->Data, Data); /* Append key */ if (Line->FirstField == NULL) @@ -325,7 +325,7 @@ InfpFindKeyLine(PINFCACHESECTION Section, Line = Section->FirstLine; while (Line != NULL) { - if (Line->Key != NULL && _wcsicmp (Line->Key, Key) == 0) + if (Line->Key != NULL && strcmpiW(Line->Key, Key) == 0) { return Line; } @@ -522,7 +522,7 @@ static const WCHAR *line_start_state( struct parser *parser, const WCHAR *pos ) return p + 1; default: - if (!iswspace(*p)) + if (!isspaceW(*p)) { parser->start = p; set_state( parser, KEY_NAME ); @@ -595,7 +595,7 @@ static const WCHAR *key_name_state( struct parser *parser, const WCHAR *pos ) set_state( parser, EOL_BACKSLASH ); return p; default: - if (!iswspace(*p)) token_end = p + 1; + if (!isspaceW(*p)) token_end = p + 1; else { push_token( parser, p ); @@ -647,7 +647,7 @@ static const WCHAR *value_name_state( struct parser *parser, const WCHAR *pos ) set_state( parser, EOL_BACKSLASH ); return p; default: - if (!isspace(*p)) token_end = p + 1; + if (!isspaceW(*p)) token_end = p + 1; else { push_token( parser, p ); @@ -692,7 +692,7 @@ static const WCHAR *eol_backslash_state( struct parser *parser, const WCHAR *pos return p + 1; default: - if (iswspace(*p)) + if (isspaceW(*p)) continue; push_token( parser, p ); pop_state( parser ); @@ -749,7 +749,7 @@ static const WCHAR *leading_spaces_state( struct parser *parser, const WCHAR *po set_state( parser, EOL_BACKSLASH ); return p; } - if (!iswspace(*p)) + if (!isspaceW(*p)) break; } parser->start = p; @@ -770,7 +770,7 @@ static const WCHAR *trailing_spaces_state( struct parser *parser, const WCHAR *p set_state( parser, EOL_BACKSLASH ); return p; } - if (!iswspace(*p)) + if (!isspaceW(*p)) break; } pop_state( parser ); diff --git a/reactos/lib/newinflib/infget.c b/reactos/lib/newinflib/infget.c index 4238f1ce0b5..25177e1f975 100644 --- a/reactos/lib/newinflib/infget.c +++ b/reactos/lib/newinflib/infget.c @@ -41,7 +41,7 @@ InfpGetSubstitutionString(PINFCACHE Inf, return &percent; } - wcsncpy(ValueName, str, *len); + strncpyW(ValueName, str, *len); ValueName[*len] = 0; DPRINT("Value name: %S\n", ValueName); @@ -94,7 +94,7 @@ InfpGetSubstitutionString(PINFCACHE Inf, if (Status == STATUS_SUCCESS) { - *len = wcslen(Data); + *len = strlenW(Data); DPRINT("Substitute: %S Length: %ul\n", Data, *len); return Data; } @@ -253,7 +253,7 @@ InfpFindFirstMatchLine(PINFCONTEXT ContextIn, CacheLine = ((PINFCACHESECTION)(ContextIn->Section))->FirstLine; while (CacheLine != NULL) { - if (CacheLine->Key != NULL && _wcsicmp (CacheLine->Key, Key) == 0) + if (CacheLine->Key != NULL && strcmpiW (CacheLine->Key, Key) == 0) { if (ContextIn != ContextOut) @@ -289,7 +289,7 @@ InfpFindNextMatchLine(PINFCONTEXT ContextIn, CacheLine = (PINFCACHELINE)ContextIn->Line; while (CacheLine != NULL) { - if (CacheLine->Key != NULL && _wcsicmp (CacheLine->Key, Key) == 0) + if (CacheLine->Key != NULL && strcmpiW (CacheLine->Key, Key) == 0) { if (ContextIn != ContextOut) @@ -329,7 +329,7 @@ InfpGetLineCount(HINF InfHandle, while (CacheSection != NULL) { /* Are the section names the same? */ - if (_wcsicmp(CacheSection->Name, Section) == 0) + if (strcmpiW(CacheSection->Name, Section) == 0) { return CacheSection->LineCount; } @@ -402,7 +402,7 @@ InfpGetBinaryField(PINFCONTEXT Context, Ptr = ReturnBuffer; while (CacheField != NULL) { - *Ptr = (UCHAR)wcstoul(CacheField->Data, NULL, 16); + *Ptr = (UCHAR)strtoulW(CacheField->Data, NULL, 16); Ptr++; CacheField = CacheField->Next; @@ -450,7 +450,7 @@ InfpGetIntField(PINFCONTEXT Context, Ptr = CacheField->Data; } - *IntegerValue = (LONG)wcstol(Ptr, NULL, 0); + *IntegerValue = (LONG)strtolW(Ptr, NULL, 0); return INF_STATUS_SUCCESS; } @@ -493,7 +493,7 @@ InfpGetMultiSzField(PINFCONTEXT Context, Size = 0; while (FieldPtr != NULL) { - Size += ((ULONG)wcslen (FieldPtr->Data) + 1); + Size += ((ULONG)strlenW(FieldPtr->Data) + 1); FieldPtr = FieldPtr->Next; } Size++; @@ -511,9 +511,9 @@ InfpGetMultiSzField(PINFCONTEXT Context, FieldPtr = CacheField; while (FieldPtr != NULL) { - Size = (ULONG)wcslen (FieldPtr->Data) + 1; + Size = (ULONG)strlenW(FieldPtr->Data) + 1; - wcscpy (Ptr, FieldPtr->Data); + strcpyW(Ptr, FieldPtr->Data); Ptr = Ptr + Size; FieldPtr = FieldPtr->Next; @@ -565,7 +565,7 @@ InfpGetStringField(PINFCONTEXT Context, Ptr = CacheField->Data; } -// Size = (ULONG)wcslen (Ptr) + 1; +// Size = (ULONG)strlenW(Ptr) + 1; Size = InfpSubstituteString(Context->Inf, Ptr, NULL, @@ -579,7 +579,7 @@ InfpGetStringField(PINFCONTEXT Context, if (ReturnBufferSize <= Size) return INF_STATUS_BUFFER_OVERFLOW; -// wcscpy (ReturnBuffer, Ptr); +// strcpyW(ReturnBuffer, Ptr); InfpSubstituteString(Context->Inf, Ptr, ReturnBuffer, diff --git a/reactos/lib/newinflib/infhost.h b/reactos/lib/newinflib/infhost.h index 62403da83d8..b1dfaaf8a86 100644 --- a/reactos/lib/newinflib/infhost.h +++ b/reactos/lib/newinflib/infhost.h @@ -14,12 +14,6 @@ extern "C" { #include "infcommon.h" -extern NTSTATUS NTAPI RtlMultiByteToUnicodeN(IN PWCHAR UnicodeString, - IN ULONG UnicodeSize, IN PULONG ResultSize, IN PCSTR MbString, IN ULONG MbSize); - -extern BOOLEAN NTAPI RtlIsTextUnicode( PVOID buf, INT len, INT *pf ); - - extern int InfHostOpenBufferedFile(PHINF InfHandle, void *Buffer, ULONG BufferSize, diff --git a/reactos/lib/newinflib/infhostrtl.c b/reactos/lib/newinflib/infhostrtl.c index c9a522149df..c62d40a8d56 100644 --- a/reactos/lib/newinflib/infhostrtl.c +++ b/reactos/lib/newinflib/infhostrtl.c @@ -115,7 +115,7 @@ RtlIsTextUnicode( PVOID buf, INT len, INT *pf ) { for (i = 0; i < len; i++) { - if (wcschr(std_control_chars, s[i])) + if (strchrW(std_control_chars, s[i])) { out_flags |= IS_TEXT_UNICODE_CONTROLS; break; @@ -127,7 +127,7 @@ RtlIsTextUnicode( PVOID buf, INT len, INT *pf ) { for (i = 0; i < len; i++) { - if (wcschr(byterev_control_chars, s[i])) + if (strchrW(byterev_control_chars, s[i])) { out_flags |= IS_TEXT_UNICODE_REVERSE_CONTROLS; break; diff --git a/reactos/lib/newinflib/inflib.rbuild b/reactos/lib/newinflib/inflib.rbuild index fc7c2cdd7bb..b8c85cf50c2 100644 --- a/reactos/lib/newinflib/inflib.rbuild +++ b/reactos/lib/newinflib/inflib.rbuild @@ -9,6 +9,7 @@ infrosgen.c infrosget.c infrosput.c + infrosrtl.c . diff --git a/reactos/lib/newinflib/infput.c b/reactos/lib/newinflib/infput.c index 2d60af0fb9f..c049f3fdcf5 100644 --- a/reactos/lib/newinflib/infput.c +++ b/reactos/lib/newinflib/infput.c @@ -37,7 +37,7 @@ Output(POUTPUTBUFFER OutBuf, PCWSTR Text) } /* Doesn't fit? */ - Length = (ULONG)wcslen(Text) * sizeof(WCHAR); + Length = (ULONG)strlenW(Text) * sizeof(WCHAR); if (OutBuf->FreeSize < Length + 1 && INF_SUCCESS(OutBuf->Status)) { DPRINT("Out of free space. TotalSize %u FreeSize %u Length %u\n", diff --git a/reactos/lib/newinflib/infrosput.c b/reactos/lib/newinflib/infrosput.c index 4c6ca5a3bca..f5d3df9399e 100644 --- a/reactos/lib/newinflib/infrosput.c +++ b/reactos/lib/newinflib/infrosput.c @@ -64,13 +64,13 @@ InfWriteFile(HINF InfHandle, HeaderBuffer = MALLOC(HeaderBufferSize); if (NULL != HeaderBuffer) { - wcscpy(HeaderBuffer, L"; "); + strcpyW(HeaderBuffer, L"; "); for (Index = 0; Index < HeaderComment->Length / sizeof(WCHAR); Index++) { HeaderBuffer[2 + Index] = HeaderComment->Buffer[Index]; } - wcscpy(HeaderBuffer + (2 + HeaderComment->Length / sizeof(WCHAR)), - L"\r\n\r\n"); + strcpyW(HeaderBuffer + (2 + HeaderComment->Length / sizeof(WCHAR)), + L"\r\n\r\n"); NtWriteFile(FileHandle, NULL, NULL, diff --git a/reactos/lib/newinflib/infrosrtl.c b/reactos/lib/newinflib/infrosrtl.c new file mode 100644 index 00000000000..42a5a5e3aef --- /dev/null +++ b/reactos/lib/newinflib/infrosrtl.c @@ -0,0 +1,51 @@ +/* + * PROJECT: .inf file parser + * LICENSE: GPL - See COPYING in the top level directory + * PROGRAMMER: Eric Kohl + */ + +/* INCLUDES *****************************************************************/ + +#include "inflib.h" +#include "infhost.h" + +#define NDEBUG +#include + + +/* FUNCTIONS ****************************************************************/ + +INT isspaceW(WCHAR c) +{ + return iswspace(c); +} + +INT strlenW(PCWSTR s) +{ + return wcslen(s); +} + +PWSTR strcpyW(PWSTR d, PCWSTR s) +{ + return wcscpy(d, s); +} + +PWSTR strncpyW(PWSTR d, PCWSTR s, SIZE_T c) +{ + return wcsncpy(d, s, c); +} + +INT strcmpiW(PCWSTR s1, PCWSTR s2) +{ + return wcsicmp(s1, s2); +} + +LONG strtolW(PCWSTR s, PWSTR *e, INT r) +{ + return wcstol(s, e, r); +} + +ULONG strtoulW(PCWSTR s, PWSTR *e, INT r) +{ + return wcstoul(s, e, r); +} From daff774a1acdf07a8e061a322e968d172995f62c Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Sat, 1 May 2010 10:47:23 +0000 Subject: [PATCH 099/131] - Partly revert 470470 svn path=/trunk/; revision=47072 --- reactos/subsystems/win32/win32k/ntuser/timer.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/reactos/subsystems/win32/win32k/ntuser/timer.c b/reactos/subsystems/win32/win32k/ntuser/timer.c index 1c34ab751d5..6ad4ddeb8ca 100644 --- a/reactos/subsystems/win32/win32k/ntuser/timer.c +++ b/reactos/subsystems/win32/win32k/ntuser/timer.c @@ -279,8 +279,6 @@ PostTimerMessages(PWINDOW_OBJECT Window) if (!pTmr) return FALSE; - ASSERT(Window); - if (Window && ((ULONG_PTR)Window != 1)) { if (!Window->Wnd) return FALSE; From 18af76559c7d830268d70cf1c974ebe1a89077da Mon Sep 17 00:00:00 2001 From: Michael Martin Date: Sat, 1 May 2010 12:02:23 +0000 Subject: [PATCH 100/131] [win32k] - Revert the hack done in 47059 to apply a better solution. - co_IntCreateWindowEx: Add the WNDS2_WMCREATEMSGPROCESSED flag to state2 member of WND after sending the WM_CREATE message. - By setting this flag it can be examined elsewhere to determine if the window was created successfully. - co_UserDestroyWindow: Examine above mentioned flag to make sure the windows was created before calling hook procedure to inform of destroying window. svn path=/trunk/; revision=47073 --- .../subsystems/win32/win32k/ntuser/window.c | 25 ++++++------------- 1 file changed, 7 insertions(+), 18 deletions(-) diff --git a/reactos/subsystems/win32/win32k/ntuser/window.c b/reactos/subsystems/win32/win32k/ntuser/window.c index aa1cbc0188e..603e36fcb34 100644 --- a/reactos/subsystems/win32/win32k/ntuser/window.c +++ b/reactos/subsystems/win32/win32k/ntuser/window.c @@ -2333,6 +2333,11 @@ AllocErr: IntNotifyWinEvent(EVENT_OBJECT_CREATE, Window->Wnd, OBJID_WINDOW, 0); + /* By setting the flag below it can be examined to determine if the window + was created successfully and a valid pwnd was passed back to caller since + from here the function has to succeed. */ + Window->Wnd->state2 |= WNDS2_WMCREATEMSGPROCESSED; + /* Send move and size messages. */ if (!(Window->state & WINDOWOBJECT_NEED_SIZE)) { @@ -2468,23 +2473,7 @@ AllocErr: CLEANUP: if (!_ret_ && Window && Window->Wnd && ti) - { - ULONG SavedHooks; - /* HACK: co_UserDestroyWindow will call CBT proc with code HCBT_DESTROYWND. - Applications can choke on this as a hwnd was never returned from this call */ - /* Save the flags */ - SavedHooks = ((PTHREADINFO)PsGetCurrentThreadWin32Thread())->fsHooks; - - /* Temporary remove the flag */ - ((PTHREADINFO)PsGetCurrentThreadWin32Thread())->fsHooks &= ~HOOKID_TO_FLAG(WH_CBT); - - /* Destroy the window */ co_UserDestroyWindow(Window); - - /* Restore the flag */ - ((PTHREADINFO)PsGetCurrentThreadWin32Thread())->fsHooks = SavedHooks; - } - // UserFreeWindowInfo(ti, Window); if (Window) { @@ -2649,8 +2638,8 @@ BOOLEAN FASTCALL co_UserDestroyWindow(PWINDOW_OBJECT Window) return FALSE; } - /* Call hooks */ - if (ISITHOOKED(WH_CBT)) + /* If window was created successfully and it is hooked */ + if ((Wnd->state2 & WNDS2_WMCREATEMSGPROCESSED) && (ISITHOOKED(WH_CBT))) { if (co_HOOK_CallHooks(WH_CBT, HCBT_DESTROYWND, (WPARAM) hWnd, 0)) return FALSE; } From f4fd1abac0c5ba778bfa2c7c815fa4e67c6a0a50 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Sat, 1 May 2010 13:02:46 +0000 Subject: [PATCH 101/131] [GDI32] - Fix pointer arithmetics in the gdi batch code (&pTeb->GdiTebBatch.Buffer[0] is a PULONG, but pTeb->GdiTebBatch.Offset is a byte offset) - To prevent this from happening again, refactor the code to use one common routine GdiAllocBatchCommand to do most of the stuff. - Reenable gdi batch for SelectObject - Fixes gdi handle leak, causes some drawing problems in Acrobat reader, but those are less critical and I'll investigate those. svn path=/trunk/; revision=47074 --- reactos/dll/win32/gdi32/include/gdi32p.h | 87 ++++++++++++++++++++++++ reactos/dll/win32/gdi32/objects/dc.c | 31 ++++----- reactos/dll/win32/gdi32/objects/region.c | 25 +++---- 3 files changed, 107 insertions(+), 36 deletions(-) diff --git a/reactos/dll/win32/gdi32/include/gdi32p.h b/reactos/dll/win32/gdi32/include/gdi32p.h index f45a0ddd171..5cc09870a94 100644 --- a/reactos/dll/win32/gdi32/include/gdi32p.h +++ b/reactos/dll/win32/gdi32/include/gdi32p.h @@ -292,4 +292,91 @@ int FASTCALL DocumentEventEx(PVOID,HANDLE,HDC,int,ULONG,PVOID,ULONG,PVOID); BOOL FASTCALL EndPagePrinterEx(PVOID,HANDLE); BOOL FASTCALL LoadTheSpoolerDrv(VOID); + +FORCEINLINE +PVOID +GdiAllocBatchCommand( + HDC hdc, + USHORT Cmd) +{ + PTEB pTeb; + ULONG ulSize; + PGDIBATCHHDR pHdr; + + /* Get a pointer to the TEB */ + pTeb = NtCurrentTeb(); + + /* Check if we have a valid environment */ + if (!pTeb || !pTeb->Win32ThreadInfo) return NULL; + + /* Do we use a DC? */ + if (hdc) + { + /* If the batch DC is NULL, we set this one as the new one */ + if (!pTeb->GdiTebBatch.HDC) pTeb->GdiTebBatch.HDC = hdc; + + /* If not, check if the batch DC equal to our DC */ + else if (pTeb->GdiTebBatch.HDC != hdc) return NULL; + } + + /* Get the size of the entry */ + switch(Cmd) + { + case GdiBCPatBlt: + ulSize = 0; + break; + case GdiBCPolyPatBlt: + ulSize = 0; + break; + case GdiBCTextOut: + ulSize = 0; + break; + case GdiBCExtTextOut: + ulSize = 0; + break; + case GdiBCSetBrushOrg: + ulSize = 0; + break; + case GdiBCExtSelClipRgn: + ulSize = 0; + break; + case GdiBCSelObj: + ulSize = sizeof(GDIBSOBJECT); + break; + case GdiBCDelRgn: + ulSize = sizeof(GDIBSOBJECT); + break; + case GdiBCDelObj: + ulSize = sizeof(GDIBSOBJECT); + break; + default: + return NULL; + } + + /* Unsupported operation */ + if (ulSize == 0) return NULL; + + /* Check if the buffer is full */ + if ((pTeb->GdiBatchCount >= GDI_BatchLimit) || + ((pTeb->GdiTebBatch.Offset + ulSize) > GDIBATCHBUFSIZE)) + { + /* Call win32k, the kernel will call NtGdiFlushUserBatch to flush + the current batch */ + NtGdiFlush(); + } + + /* Get the head of the entry */ + pHdr = (PVOID)((PUCHAR)pTeb->GdiTebBatch.Buffer + pTeb->GdiTebBatch.Offset); + + /* Update Offset and batch count */ + pTeb->GdiTebBatch.Offset += ulSize; + pTeb->GdiBatchCount++; + + /* Fill in the core fields */ + pHdr->Cmd = Cmd; + pHdr->Size = ulSize; + + return pHdr; +} + /* EOF */ diff --git a/reactos/dll/win32/gdi32/objects/dc.c b/reactos/dll/win32/gdi32/objects/dc.c index 2d90f60cdac..ddc33e501f1 100644 --- a/reactos/dll/win32/gdi32/objects/dc.c +++ b/reactos/dll/win32/gdi32/objects/dc.c @@ -1540,7 +1540,6 @@ SelectObject(HDC hDC, PDC_ATTR pDc_Attr; HGDIOBJ hOldObj = NULL; UINT uType; -// PTEB pTeb; if(!GdiGetHandleUserData(hDC, GDI_OBJECT_TYPE_DC, (PVOID)&pDc_Attr)) { @@ -1582,29 +1581,23 @@ SelectObject(HDC hDC, case GDI_OBJECT_TYPE_FONT: hOldObj = pDc_Attr->hlfntNew; if (hOldObj == hGdiObj) return hOldObj; -#if 0 + pDc_Attr->ulDirty_ &= ~SLOW_WIDTHS; pDc_Attr->ulDirty_ |= DIRTY_CHARSET; pDc_Attr->hlfntNew = hGdiObj; - pTeb = NtCurrentTeb(); - if (((pTeb->GdiTebBatch.HDC == 0) || - (pTeb->GdiTebBatch.HDC == hDC)) && - ((pTeb->GdiTebBatch.Offset + sizeof(GDIBSOBJECT)) <= GDIBATCHBUFSIZE) && - (!(pDc_Attr->ulDirty_ & DC_DIBSECTION))) - { - PGDIBSOBJECT pgO = (PGDIBSOBJECT)(&pTeb->GdiTebBatch.Buffer[0] + - pTeb->GdiTebBatch.Offset); - pgO->gbHdr.Cmd = GdiBCSelObj; - pgO->gbHdr.Size = sizeof(GDIBSOBJECT); - pgO->hgdiobj = hGdiObj; - pTeb->GdiTebBatch.Offset += sizeof(GDIBSOBJECT); - pTeb->GdiTebBatch.HDC = hDC; - pTeb->GdiBatchCount++; - if (pTeb->GdiBatchCount >= GDI_BatchLimit) NtGdiFlush(); - return hOldObj; + if (!(pDc_Attr->ulDirty_ & DC_DIBSECTION)) + { + PGDIBSOBJECT pgO; + + pgO = GdiAllocBatchCommand(hDC, GdiBCSelObj); + if (pgO) + { + pgO->hgdiobj = hGdiObj; + return hOldObj; + } } -#endif + // default for select object font return NtGdiSelectFont(hDC, hGdiObj); diff --git a/reactos/dll/win32/gdi32/objects/region.c b/reactos/dll/win32/gdi32/objects/region.c index 3e2b7fe5b65..b8d70772dcf 100644 --- a/reactos/dll/win32/gdi32/objects/region.c +++ b/reactos/dll/win32/gdi32/objects/region.c @@ -109,23 +109,14 @@ DeleteRegion( HRGN hRgn ) if ((GdiGetHandleUserData((HGDIOBJ) hRgn, GDI_OBJECT_TYPE_REGION, (PVOID) &Rgn_Attr)) && ( Rgn_Attr != NULL )) { - PTEB pTeb = NtCurrentTeb(); - if (pTeb->Win32ThreadInfo != NULL) - { - if ((pTeb->GdiTebBatch.Offset + sizeof(GDIBSOBJECT)) <= GDIBATCHBUFSIZE) - { - PGDIBSOBJECT pgO = (PGDIBSOBJECT)(&pTeb->GdiTebBatch.Buffer[0] + - pTeb->GdiTebBatch.Offset); - pgO->gbHdr.Cmd = GdiBCDelRgn; - pgO->gbHdr.Size = sizeof(GDIBSOBJECT); - pgO->hgdiobj = (HGDIOBJ)hRgn; - - pTeb->GdiTebBatch.Offset += sizeof(GDIBSOBJECT); - pTeb->GdiBatchCount++; - if (pTeb->GdiBatchCount >= GDI_BatchLimit) NtGdiFlush(); - return TRUE; - } - } + PGDIBSOBJECT pgO; + + pgO = GdiAllocBatchCommand(NULL, GdiBCDelRgn); + if (pgO) + { + pgO->hgdiobj = (HGDIOBJ)hRgn; + return TRUE; + } } return NtGdiDeleteObjectApp((HGDIOBJ) hRgn); } From 35ff67b13e71b0f149435eac1019de00807354e8 Mon Sep 17 00:00:00 2001 From: Michael Martin Date: Sat, 1 May 2010 13:32:38 +0000 Subject: [PATCH 102/131] [win32k] - Only call ExFreePool.. if Buffer is not NULL, which can occur if the Unicode String MessageNameUnsafe coming from user mode is incorrect. Fixes a bugcheck when using OllyDbg V2.0. svn path=/trunk/; revision=47075 --- reactos/subsystems/win32/win32k/ntuser/window.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/subsystems/win32/win32k/ntuser/window.c b/reactos/subsystems/win32/win32k/ntuser/window.c index 603e36fcb34..822c8c55285 100644 --- a/reactos/subsystems/win32/win32k/ntuser/window.c +++ b/reactos/subsystems/win32/win32k/ntuser/window.c @@ -4268,8 +4268,8 @@ NtUserRegisterWindowMessage(PUNICODE_STRING MessageNameUnsafe) } Ret = (UINT)IntAddAtom(SafeMessageName.Buffer); - - ExFreePoolWithTag(SafeMessageName.Buffer, TAG_STRING); + if (SafeMessageName.Buffer) + ExFreePoolWithTag(SafeMessageName.Buffer, TAG_STRING); RETURN( Ret); CLEANUP: From 4f7643e5b3ad7528431803453b36cc97bb2d90bc Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sat, 1 May 2010 20:17:11 +0000 Subject: [PATCH 103/131] [CMLIB/NEWINFLIB/MKHIVE] - Make cmlib, newinflib and mkhive use the Wine unicode lib instead of the host_wcsfuncs lib. - Only the header file include/host/wcsfuncs.h is still used to map str*W functions to wcs* functions in WIN32 builds. - Remove obsolete rtl functions. - Make mkhive use the newinflib instead of inflib. ATTENTION: This might break the build bot although it has been tested on Windows and Linux!!! svn path=/trunk/; revision=47076 --- reactos/include/host/wcsfuncs.h | 19 +++-- reactos/lib/cmlib/cminit.c | 2 +- reactos/lib/cmlib/cmlib.h | 1 + reactos/lib/cmlib/cmlib.rbuild | 2 + reactos/lib/newinflib/builddep.h | 12 +-- reactos/lib/newinflib/infget.c | 2 +- reactos/lib/newinflib/inflib.rbuild | 8 +- reactos/lib/newinflib/infrosrtl.c | 51 ------------ reactos/tools/mkhive/mkhive.rbuild | 8 +- reactos/tools/mkhive/reginf.c | 120 ++++++++++++++++------------ reactos/tools/mkhive/registry.c | 8 +- reactos/tools/mkhive/rtl.c | 2 +- 12 files changed, 101 insertions(+), 134 deletions(-) delete mode 100644 reactos/lib/newinflib/infrosrtl.c diff --git a/reactos/include/host/wcsfuncs.h b/reactos/include/host/wcsfuncs.h index bf2c12771f2..c07679aa34a 100644 --- a/reactos/include/host/wcsfuncs.h +++ b/reactos/include/host/wcsfuncs.h @@ -11,14 +11,19 @@ #ifdef USE_HOST_WCSFUNCS /* Function prototypes */ - SIZE_T utf16_wcslen(PCWSTR str); - PWSTR utf16_wcschr(PWSTR str, WCHAR c); - INT utf16_wcsncmp(PCWSTR string1, PCWSTR string2, size_t count); + #else - /* Define the utf16_ functions to the CRT functions */ - #define utf16_wcslen wcslen - #define utf16_wcschr wcschr - #define utf16_wcsncmp wcsncmp + /* Map str*W functions to wcs* function */ + + #define isspaceW iswspace + #define strchrW wcschr + #define strcmpiW _wcsicmp + #define strcpyW wcscpy + #define strlenW wcslen + #define strncmpW wcsncmp + #define strtolW wcstol + #define strtoulW wcstoul + #endif #endif diff --git a/reactos/lib/cmlib/cminit.c b/reactos/lib/cmlib/cminit.c index 59b3843432f..1be9b656a80 100644 --- a/reactos/lib/cmlib/cminit.c +++ b/reactos/lib/cmlib/cminit.c @@ -21,7 +21,7 @@ CmCreateRootNode( SIZE_T NameSize; /* Allocate the cell */ - NameSize = utf16_wcslen(Name) * sizeof(WCHAR); + NameSize = strlenW(Name) * sizeof(WCHAR); RootCellIndex = HvAllocateCell(Hive, FIELD_OFFSET(CM_KEY_NODE, Name) + NameSize, Stable, diff --git a/reactos/lib/cmlib/cmlib.h b/reactos/lib/cmlib/cmlib.h index c6823b06a47..e472fd35c4f 100644 --- a/reactos/lib/cmlib/cmlib.h +++ b/reactos/lib/cmlib/cmlib.h @@ -13,6 +13,7 @@ #define _CMLIB_DEBUG_ 1 #ifdef CMLIB_HOST + #include #include #include #include diff --git a/reactos/lib/cmlib/cmlib.rbuild b/reactos/lib/cmlib/cmlib.rbuild index 506eef92334..ab81a0256a2 100644 --- a/reactos/lib/cmlib/cmlib.rbuild +++ b/reactos/lib/cmlib/cmlib.rbuild @@ -14,6 +14,8 @@ hivewrt.c + " " + . diff --git a/reactos/lib/newinflib/builddep.h b/reactos/lib/newinflib/builddep.h index 873ab39915f..51b4d4850d7 100644 --- a/reactos/lib/newinflib/builddep.h +++ b/reactos/lib/newinflib/builddep.h @@ -8,6 +8,7 @@ /* Definitions native to the host on which we're building */ +#include #include #include @@ -65,15 +66,6 @@ BOOLEAN NTAPI RtlIsTextUnicode( PVOID buf, INT len, INT *pf ); extern PVOID InfpHeap; -INT isspaceW(WCHAR c); -INT strlenW(PCWSTR s); -PWSTR strcpyW(PWSTR d, PCWSTR s); -PWSTR strncpyW(PWSTR d, PCWSTR s, SIZE_T c); -INT strcmpiW(PCWSTR s1, PCWSTR s2); -LONG strtolW(PCWSTR s, PWSTR *e, INT r); -ULONG strtoulW(PCWSTR s, PWSTR *e, INT r); - - #define FREE(Area) RtlFreeHeap(InfpHeap, 0, (Area)) #define MALLOC(Size) RtlAllocateHeap(InfpHeap, 0, (Size)) #define ZEROMEMORY(Area, Size) RtlZeroMemory((Area), (Size)) @@ -90,4 +82,6 @@ ULONG strtoulW(PCWSTR s, PWSTR *e, INT r); #endif /* INFLIB_HOST */ +#include + /* EOF */ diff --git a/reactos/lib/newinflib/infget.c b/reactos/lib/newinflib/infget.c index 25177e1f975..e2b360ab22d 100644 --- a/reactos/lib/newinflib/infget.c +++ b/reactos/lib/newinflib/infget.c @@ -41,7 +41,7 @@ InfpGetSubstitutionString(PINFCACHE Inf, return &percent; } - strncpyW(ValueName, str, *len); + memcpy(ValueName, str, *len * sizeof(WCHAR)); ValueName[*len] = 0; DPRINT("Value name: %S\n", ValueName); diff --git a/reactos/lib/newinflib/inflib.rbuild b/reactos/lib/newinflib/inflib.rbuild index b8c85cf50c2..7c758a7c332 100644 --- a/reactos/lib/newinflib/inflib.rbuild +++ b/reactos/lib/newinflib/inflib.rbuild @@ -9,16 +9,16 @@ infrosgen.c infrosget.c infrosput.c - infrosrtl.c + " " + . + + -Wwrite-strings -Wpointer-arith - -Wconversion - -Wstrict-prototypes - -Wmissing-prototypes infcore.c diff --git a/reactos/lib/newinflib/infrosrtl.c b/reactos/lib/newinflib/infrosrtl.c deleted file mode 100644 index 42a5a5e3aef..00000000000 --- a/reactos/lib/newinflib/infrosrtl.c +++ /dev/null @@ -1,51 +0,0 @@ -/* - * PROJECT: .inf file parser - * LICENSE: GPL - See COPYING in the top level directory - * PROGRAMMER: Eric Kohl - */ - -/* INCLUDES *****************************************************************/ - -#include "inflib.h" -#include "infhost.h" - -#define NDEBUG -#include - - -/* FUNCTIONS ****************************************************************/ - -INT isspaceW(WCHAR c) -{ - return iswspace(c); -} - -INT strlenW(PCWSTR s) -{ - return wcslen(s); -} - -PWSTR strcpyW(PWSTR d, PCWSTR s) -{ - return wcscpy(d, s); -} - -PWSTR strncpyW(PWSTR d, PCWSTR s, SIZE_T c) -{ - return wcsncpy(d, s, c); -} - -INT strcmpiW(PCWSTR s1, PCWSTR s2) -{ - return wcsicmp(s1, s2); -} - -LONG strtolW(PCWSTR s, PWSTR *e, INT r) -{ - return wcstol(s, e, r); -} - -ULONG strtoulW(PCWSTR s, PWSTR *e, INT r) -{ - return wcstoul(s, e, r); -} diff --git a/reactos/tools/mkhive/mkhive.rbuild b/reactos/tools/mkhive/mkhive.rbuild index c5d22dc1fbc..3b78e806f2c 100644 --- a/reactos/tools/mkhive/mkhive.rbuild +++ b/reactos/tools/mkhive/mkhive.rbuild @@ -1,15 +1,17 @@ - . + " " + + . . . . -fshort-wchar - inflibhost + newinflibhost cmlibhost - host_wcsfuncs + unicode binhive.c cmi.c mkhive.c diff --git a/reactos/tools/mkhive/reginf.c b/reactos/tools/mkhive/reginf.c index dd8ac4596e0..330afc0a4ae 100644 --- a/reactos/tools/mkhive/reginf.c +++ b/reactos/tools/mkhive/reginf.c @@ -48,37 +48,51 @@ #define FLG_ADDREG_TYPE_MASK (0xFFFF0000 | FLG_ADDREG_BINVALUETYPE) +static const WCHAR HKCR[] = {'H','K','C','R',0}; +static const WCHAR HKCU[] = {'H','K','C','U',0}; +static const WCHAR HKLM[] = {'H','K','L','M',0}; +static const WCHAR HKU[] = {'H','K','U',0}; +static const WCHAR HKR[] = {'H','K','R',0}; + +static const WCHAR HKCRPath[] = {'\\','R','e','g','i','s','t','r','y','\\','M','a','c','h','i','n','e','\\','S','O','F','T','W','A','R','E','\\','C','l','a','s','s','e','s','\\',0}; +static const WCHAR HKCUPath[] = {'\\','R','e','g','i','s','t','r','y','\\','U','s','e','r','\\','.','D','E','F','A','U','L','T','\\',0}; +static const WCHAR HKLMPath[] = {'\\','R','e','g','i','s','t','r','y','\\','M','a','c','h','i','n','e','\\',0}; +static const WCHAR HKUPath[] = {'\\','R','e','g','i','s','t','r','y','\\','U','s','e','r','\\',0}; + +static const WCHAR AddReg[] = {'A','d','d','R','e','g',0}; +static const WCHAR DelReg[] = {'D','e','l','R','e','g',0}; + /* FUNCTIONS ****************************************************************/ static BOOL -GetRootKey (PCHAR Name) +GetRootKey (PWCHAR Name) { - if (!strcasecmp (Name, "HKCR")) + if (!strcmpiW (Name, HKCR)) { - strcpy (Name, "\\Registry\\Machine\\SOFTWARE\\Classes\\"); + strcpyW (Name, HKCRPath); return TRUE; } - if (!strcasecmp (Name, "HKCU")) + if (!strcmpiW (Name, HKCU)) { - strcpy (Name, "\\Registry\\User\\.DEFAULT\\"); + strcpyW (Name, HKCUPath); return TRUE; } - if (!strcasecmp (Name, "HKLM")) + if (!strcmpiW (Name, HKLM)) { - strcpy (Name, "\\Registry\\Machine\\"); + strcpyW (Name, HKLMPath); return TRUE; } - if (!strcasecmp (Name, "HKU")) + if (!strcmpiW (Name, HKU)) { - strcpy (Name, "\\Registry\\User\\"); + strcpyW (Name, HKUPath); return TRUE; } #if 0 - if (!strcasecmp (Name, "HKR")) + if (!strcmpiW (Name, HKR)) return FALSE; #endif @@ -94,19 +108,19 @@ GetRootKey (PCHAR Name) static VOID AppendMultiSzValue ( IN HKEY KeyHandle, - IN PCHAR ValueName, - IN PCHAR Strings, + IN PWCHAR ValueName, + IN PWCHAR Strings, IN SIZE_T StringSize) { SIZE_T Size; ULONG Type; size_t Total; - PCHAR Buffer; - PCHAR p; + PWCHAR Buffer; + PWCHAR p; size_t len; LONG Error; - Error = RegQueryValueExA ( + Error = RegQueryValueExW ( KeyHandle, ValueName, NULL, @@ -117,11 +131,11 @@ AppendMultiSzValue ( (Type != REG_MULTI_SZ)) return; - Buffer = malloc (Size + StringSize); + Buffer = malloc ((Size + StringSize) * sizeof(WCHAR)); if (Buffer == NULL) return; - Error = RegQueryValueExA ( + Error = RegQueryValueExW ( KeyHandle, ValueName, NULL, @@ -135,10 +149,10 @@ AppendMultiSzValue ( Total = Size; while (*Strings != 0) { - len = strlen (Strings) + 1; + len = strlenW(Strings) + 1; - for (p = Buffer; *p != 0; p += strlen (p) + 1) - if (!strcasecmp (p, Strings)) + for (p = Buffer; *p != 0; p += strlenW(p) + 1) + if (!strcmpiW(p, Strings)) break; if (*p == 0) /* not found, need to append it */ @@ -152,14 +166,14 @@ AppendMultiSzValue ( if (Total != Size) { - DPRINT ("setting value %s to %s\n", ValueName, Buffer); - RegSetValueExA ( + DPRINT ("setting value %S to %S\n", ValueName, Buffer); + RegSetValueExW ( KeyHandle, ValueName, 0, REG_MULTI_SZ, (PUCHAR)Buffer, - (ULONG)Total); + (ULONG)Total * sizeof(WCHAR)); } done: @@ -175,11 +189,11 @@ done: static BOOL do_reg_operation( IN HKEY KeyHandle, - IN PCHAR ValueName, + IN PWCHAR ValueName, IN PINFCONTEXT Context, IN ULONG Flags) { - CHAR EmptyStr = (CHAR)0; + WCHAR EmptyStr = (CHAR)0; ULONG Type; ULONG Size; LONG Error; @@ -188,11 +202,11 @@ do_reg_operation( { if (ValueName) { - RegDeleteValueA (KeyHandle, ValueName); + RegDeleteValueW (KeyHandle, ValueName); } else { - RegDeleteKeyA (KeyHandle, NULL); + RegDeleteKeyW (KeyHandle, NULL); } return TRUE; @@ -203,7 +217,7 @@ do_reg_operation( if (Flags & (FLG_ADDREG_NOCLOBBER | FLG_ADDREG_OVERWRITEONLY)) { - Error = RegQueryValueExA ( + Error = RegQueryValueExW ( KeyHandle, ValueName, NULL, @@ -253,7 +267,7 @@ do_reg_operation( if (!(Flags & FLG_ADDREG_BINVALUETYPE) || (Type == REG_DWORD && InfHostGetFieldCount (Context) == 5)) { - PCHAR Str = NULL; + PWCHAR Str = NULL; if (Type == REG_MULTI_SZ) { @@ -262,7 +276,7 @@ do_reg_operation( if (Size) { - Str = malloc (Size); + Str = malloc (Size * sizeof(WCHAR)); if (Str == NULL) return FALSE; @@ -292,7 +306,7 @@ do_reg_operation( if (Size) { - Str = malloc (Size); + Str = malloc (Size * sizeof(WCHAR)); if (Str == NULL) return FALSE; @@ -302,11 +316,11 @@ do_reg_operation( if (Type == REG_DWORD) { - ULONG dw = Str ? strtoul (Str, NULL, 0) : 0; + ULONG dw = Str ? strtoulW (Str, NULL, 0) : 0; - DPRINT("setting dword %s to %x\n", ValueName, dw); + DPRINT("setting dword %S to %x\n", ValueName, dw); - RegSetValueExA ( + RegSetValueExW ( KeyHandle, ValueName, 0, @@ -316,27 +330,27 @@ do_reg_operation( } else { - DPRINT("setting value %s to %s\n", ValueName, Str); + DPRINT("setting value %S to %S\n", ValueName, Str); if (Str) { - RegSetValueExA ( + RegSetValueExW ( KeyHandle, ValueName, 0, Type, (PVOID)Str, - (ULONG)Size); + (ULONG)Size * sizeof(WCHAR)); } else { - RegSetValueExA ( + RegSetValueExW ( KeyHandle, ValueName, 0, Type, (PVOID)&EmptyStr, - (ULONG)sizeof(CHAR)); + (ULONG)sizeof(WCHAR)); } } free (Str); @@ -354,11 +368,11 @@ do_reg_operation( if (Data == NULL) return FALSE; - DPRINT("setting binary data %s len %d\n", ValueName, Size); + DPRINT("setting binary data %S len %d\n", ValueName, Size); InfHostGetBinaryField (Context, 5, Data, Size, NULL); } - RegSetValueExA ( + RegSetValueExW ( KeyHandle, ValueName, 0, @@ -378,10 +392,10 @@ do_reg_operation( * Called once for each AddReg and DelReg entry in a given section. */ static BOOL -registry_callback (HINF hInf, PCHAR Section, BOOL Delete) +registry_callback (HINF hInf, PWCHAR Section, BOOL Delete) { - CHAR Buffer[MAX_INF_STRING_LENGTH]; - PCHAR ValuePtr; + WCHAR Buffer[MAX_INF_STRING_LENGTH]; + PWCHAR ValuePtr; ULONG Flags; size_t Length; @@ -403,11 +417,11 @@ registry_callback (HINF hInf, PCHAR Section, BOOL Delete) continue; /* get key */ - Length = strlen (Buffer); + Length = strlenW (Buffer); if (InfHostGetStringField (Context, 2, Buffer + Length, MAX_INF_STRING_LENGTH - (ULONG)Length, NULL) != 0) *Buffer = 0; - DPRINT("KeyName: <%s>\n", Buffer); + DPRINT("KeyName: <%S>\n", Buffer); if (Delete) { @@ -424,17 +438,17 @@ registry_callback (HINF hInf, PCHAR Section, BOOL Delete) if (Delete || (Flags & FLG_ADDREG_OVERWRITEONLY)) { - if (RegOpenKeyA (NULL, Buffer, &KeyHandle) != ERROR_SUCCESS) + if (RegOpenKeyW (NULL, Buffer, &KeyHandle) != ERROR_SUCCESS) { - DPRINT("RegOpenKey(%s) failed\n", Buffer); + DPRINT("RegOpenKey(%S) failed\n", Buffer); continue; /* ignore if it doesn't exist */ } } else { - if (RegCreateKeyA (NULL, Buffer, &KeyHandle) != ERROR_SUCCESS) + if (RegCreateKeyW (NULL, Buffer, &KeyHandle) != ERROR_SUCCESS) { - DPRINT("RegCreateKey(%s) failed\n", Buffer); + DPRINT("RegCreateKey(%S) failed\n", Buffer); continue; } } @@ -469,18 +483,18 @@ ImportRegistryFile(PCHAR FileName) ULONG ErrorLine; /* Load inf file from install media. */ - if (InfHostOpenFile(&hInf, FileName, &ErrorLine) != 0) + if (InfHostOpenFile(&hInf, FileName, 0, &ErrorLine) != 0) { DPRINT1 ("InfHostOpenFile(%s) failed\n", FileName); return FALSE; } - if (!registry_callback (hInf, "DelReg", TRUE)) + if (!registry_callback (hInf, (PWCHAR)DelReg, TRUE)) { DPRINT1 ("registry_callback() for DelReg failed\n"); } - if (!registry_callback (hInf, "AddReg", FALSE)) + if (!registry_callback (hInf, (PWCHAR)AddReg, FALSE)) { DPRINT1 ("registry_callback() for AddReg failed\n"); } diff --git a/reactos/tools/mkhive/registry.c b/reactos/tools/mkhive/registry.c index a6d7d4b248f..6813a67d195 100644 --- a/reactos/tools/mkhive/registry.c +++ b/reactos/tools/mkhive/registry.c @@ -127,7 +127,7 @@ RegpOpenOrCreateKey( LocalKeyName = (PWSTR)KeyName; for (;;) { - End = (PWSTR) utf16_wcschr(LocalKeyName, '\\'); + End = (PWSTR)strchrW(LocalKeyName, '\\'); if (End) { KeyString.Buffer = LocalKeyName; @@ -138,9 +138,9 @@ RegpOpenOrCreateKey( RtlInitUnicodeString(&KeyString, LocalKeyName); /* Redirect from 'CurrentControlSet' to 'ControlSet001' */ - if (!utf16_wcsncmp(LocalKeyName, L"CurrentControlSet", 17) && - ParentKey->NameSize == 12 && - !memcmp(ParentKey->Name, L"SYSTEM", 12)) + if (!strncmpW(LocalKeyName, L"CurrentControlSet", 17) && + ParentKey->NameSize == 12 && + !memcmp(ParentKey->Name, L"SYSTEM", 12)) RtlInitUnicodeString(&KeyString, L"ControlSet001"); /* Check subkey in memory structure */ diff --git a/reactos/tools/mkhive/rtl.c b/reactos/tools/mkhive/rtl.c index e9ed22b66e0..4a186e253f6 100644 --- a/reactos/tools/mkhive/rtl.c +++ b/reactos/tools/mkhive/rtl.c @@ -59,7 +59,7 @@ RtlInitUnicodeString( if(SourceString) { - DestSize = utf16_wcslen(SourceString) * sizeof(WCHAR); + DestSize = strlenW(SourceString) * sizeof(WCHAR); DestinationString->Length = (USHORT)DestSize; DestinationString->MaximumLength = (USHORT)DestSize + sizeof(WCHAR); } From f6cb22d04e630c71286330ede59494e8f4fd2966 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sat, 1 May 2010 22:00:09 +0000 Subject: [PATCH 104/131] Remove duplicate line. WRC complains about the control id already being in use. svn path=/trunk/; revision=47077 --- reactos/dll/cpl/sysdm/lang/uk-UA.rc | 1 - 1 file changed, 1 deletion(-) diff --git a/reactos/dll/cpl/sysdm/lang/uk-UA.rc b/reactos/dll/cpl/sysdm/lang/uk-UA.rc index 408f6511dc6..651a167d1ea 100644 --- a/reactos/dll/cpl/sysdm/lang/uk-UA.rc +++ b/reactos/dll/cpl/sysdm/lang/uk-UA.rc @@ -58,7 +58,6 @@ FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN GROUPBOX " ",IDC_STATIC,6,3,210,73 CONTROL " ",IDC_REPORTASWORKSTATION,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,57,88,10 - CONTROL " ",IDC_REPORTASWORKSTATION,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,57,88,10 LTEXT "ReactOS . , .",IDC_STATIC,15,15,183,41 PUSHBUTTON "OK",IDOK,166,83,50,14 END From 1f235be55f0700849ec325e23b9b25f2ac405a48 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sat, 1 May 2010 22:16:44 +0000 Subject: [PATCH 105/131] Delete ANSI version. svn path=/trunk/; revision=47078 --- reactos/boot/bootdata/hivedef_i386.inf | 1872 ------------------------ 1 file changed, 1872 deletions(-) delete mode 100644 reactos/boot/bootdata/hivedef_i386.inf diff --git a/reactos/boot/bootdata/hivedef_i386.inf b/reactos/boot/bootdata/hivedef_i386.inf deleted file mode 100644 index 9cf6b0c1147..00000000000 --- a/reactos/boot/bootdata/hivedef_i386.inf +++ /dev/null @@ -1,1872 +0,0 @@ -[Version] -Signature="$ReactOS$ - -[AddReg] - -HKCU,"Console","CursorSize",0x00010003,25 -HKCU,"Console","FaceName",0x00000002,"" -HKCU,"Console","FontFamily",0x00010003,0 -HKCU,"Console","FontSize",0x00010003,0 -HKCU,"Console","FontWeight",0x00010003,0 -HKCU,"Console","FullScreen",0x00010003,0 -HKCU,"Console","HistoryBufferSize",0x00010003,50 -HKCU,"Console","InsertMode",0x00010003,1 -HKCU,"Console","LoadConIme",0x00010003,1 -HKCU,"Console","NumberOfHistoryBuffers",0x00010003,4 -HKCU,"Console","PopupColors",0x00010003,245 -HKCU,"Console","QuickEdit",0x00010003,0 -HKCU,"Console","ScreenBufferSize",0x00010003,19660880 -HKCU,"Console","ScreenColors",0x00010003,7 -HKCU,"Console","WindowSize",0x00010003,1638480 -HKCU,"Console","ColorTable00",0x00010003,0 -HKCU,"Console","ColorTable01",0x00010003,8388608 -HKCU,"Console","ColorTable02",0x00010003,32768 -HKCU,"Console","ColorTable03",0x00010003,8421376 -HKCU,"Console","ColorTable04",0x00010003,128 -HKCU,"Console","ColorTable05",0x00010003,8388736 -HKCU,"Console","ColorTable06",0x00010003,32896 -HKCU,"Console","ColorTable07",0x00010003,12632256 -HKCU,"Console","ColorTable08",0x00010003,8421504 -HKCU,"Console","ColorTable09",0x00010003,16711680 -HKCU,"Console","ColorTable10",0x00010003,65280 -HKCU,"Console","ColorTable11",0x00010003,16776960 -HKCU,"Console","ColorTable12",0x00010003,255 -HKCU,"Console","ColorTable13",0x00010003,16711935 -HKCU,"Console","ColorTable14",0x00010003,65535 -HKCU,"Console","ColorTable15",0x00010003,16777215 - -HKCU,"Control Panel",,0x00000012 - -; Accessibility -HKCU,"Control Panel\Accessibility",,0x00000012 -HKCU,"Control Panel\Accessibility\Keyboard Preference",,0x00000012 -HKCU,"Control Panel\Accessibility\Keyboard Preference","On",2,"0" -HKCU,"Control Panel\Accessibility\HighContrast","Flags",2,"126" -HKCU,"Control Panel\Accessibility\HighContrast","High Contrast Scheme",2,"High Contrast Black (large)" -HKCU,"Control Panel\Accessibility\Keyboard Response","AutoRepeatDelay",2,"1000" -HKCU,"Control Panel\Accessibility\Keyboard Response","AutoRepeatRate",2,"500" -HKCU,"Control Panel\Accessibility\Keyboard Response","BounceTime",2,"0" -HKCU,"Control Panel\Accessibility\Keyboard Response","DelayBeforeAcceptance",2,"1000" -HKCU,"Control Panel\Accessibility\Keyboard Response","Flags",2,"126" -HKCU,"Control Panel\Accessibility\MouseKeys","Flags",2,"62" -HKCU,"Control Panel\Accessibility\MouseKeys","MaximumSpeed",2,"80" -HKCU,"Control Panel\Accessibility\MouseKeys","TimeToMaximumSpeed",2,"3000" -HKCU,"Control Panel\Accessibility\ShowSounds","On",2,"0" -HKCU,"Control Panel\Accessibility\SoundSentry","Flags",2,"2" -HKCU,"Control Panel\Accessibility\SoundSentry","FSTextEffect",2,"0" -HKCU,"Control Panel\Accessibility\SoundSentry","WindowsEffect",2,"1" -HKCU,"Control Panel\Accessibility\StickyKeys","Flags",2,"510" -HKCU,"Control Panel\Accessibility\TimeOut","Flags",2,"2" -HKCU,"Control Panel\Accessibility\TimeOut","TimeToWait",2,"300000" -HKCU,"Control Panel\Accessibility\ToggleKeys","Flags",2,"62" -HKCU,"Control Panel\Accessibility\Blind Access","On",2,"0" - -HKCU,"Control Panel\Mouse","MouseTrails",0x00000002,"0" -HKCU,"Control Panel\Mouse","SnapToDefaultButton",0x00000002,"0" -HKCU,"Control Panel\Mouse","MouseSpeed",0x00000002,"1" -HKCU,"Control Panel\Mouse","MouseThreshold1",0x00000002,"6" -HKCU,"Control Panel\Mouse","MouseThreshold2",0x00000002,"10" -HKCU,"Control Panel\Mouse","DoubleClickSpeed",0x00000002,"500" -HKCU,"Control Panel\Mouse","SwapMouseButtons",0x00000002,"0" -HKCU,"Control Panel\Mouse","MouseSensitivity",0x00000002,"10" -HKCU,"Control Panel\Mouse","MouseHoverTime",0x00000002,"400" -HKCU,"Control Panel\Mouse","MouseHoverWidth",0x00000002,"4" -HKCU,"Control Panel\Mouse","MouseHoverHeight",0x00000002,"4" -HKCU,"Control Panel\Mouse","DoubleClickWidth",0x00000002,"4" -HKCU,"Control Panel\Mouse","DoubleClickHeight",0x00000002,"4" - -HKCU,"Control Panel\Keyboard","InitialKeyboardIndicators",2,"0x80000000" -HKCU,"Control Panel\Keyboard","KeyboardDelay",2,"1" -HKCU,"Control Panel\Keyboard","KeyboardSpeed",2,"31" - -HKCU,"Control Panel\Desktop","ActiveWndTrkTimeout",0x00010003,0x00000000 -HKCU,"Control Panel\Desktop","AutoEndTasks",2,"0" -HKCU,"Control Panel\Desktop","CaretWidth",0x00010003,0x00000001 -HKCU,"Control Panel\Desktop","CoolSwitch",2,"1" -HKCU,"Control Panel\Desktop","CoolSwitchColumns",2,"7" -HKCU,"Control Panel\Desktop","CoolSwitchRows",2,"3" -HKCU,"Control Panel\Desktop","CursorBlinkRate",2,"530" -HKCU,"Control Panel\Desktop","DragFullWindows",2,"0" -HKCU,"Control Panel\Desktop","DragHeight",0x00000000,"4" -HKCU,"Control Panel\Desktop","DragWidth",0x00000000,"4" -HKCU,"Control Panel\Desktop","PaintDesktopVersion",0x00010001,"0" -HKCU,"Control Panel\Desktop","HungAppTimeout",2,"5000" -HKCU,"Control Panel\Desktop","SCRNSAVE.EXE",0,"" -HKCU,"Control Panel\Desktop","ScreenSaveActive",2,"1" -HKCU,"Control Panel\Desktop","ScreenSaverIsSecure",2,"1" -HKCU,"Control Panel\Desktop","ScreenSaveTimeOut",0,"600" -HKCU,"Control Panel\Desktop","WaitToKillAppTimeout",2,"20000" -HKCU,"Control Panel\Desktop","Wallpaper",0x00000000,"" -HKCU,"Control Panel\Desktop","FontSmoothing",2,"0" -HKCU,"Control Panel\Desktop","FontSmoothingOrientation",0x00010003,0x00000001 -HKCU,"Control Panel\Desktop","FontSmoothingType",0x00010003,0x00000001 -HKCU,"Control Panel\Desktop","ForegroundFlashCount",0x00010003,0x00000003 -HKCU,"Control Panel\Desktop","ForegroundLockTimeout",0x00010003,0x00030d40 -HKCU,"Control Panel\Desktop","GridGranularity",2,"0" -HKCU,"Control Panel\Desktop","SmoothScroll",3,00,00,00,00 -HKCU,"Control Panel\Desktop","UserPreferencesMask",3,10,00,00,80 -HKCU,"Control Panel\Desktop","LowPowerActive",2,"0" -HKCU,"Control Panel\Desktop","LowPowerTimeOut",2,"0" -HKCU,"Control Panel\Desktop","PowerOffActive",2,"0" -HKCU,"Control Panel\Desktop","PowerOffTimeOut",2,"0" -HKCU,"Control Panel\Desktop","MenuShowDelay",2,"400" -HKCU,"Control Panel\Desktop","WheelScrollLines",2,"3" -HKCU,"Control Panel\Desktop","WheelScrollChars",2,"3" -HKCU,"Control Panel\Desktop","TileWallpaper",2,"0" -HKCU,"Control Panel\Desktop","Pattern",2,"(None)" - -HKCU,"Control Panel\Desktop\WindowMetrics","ScrollWidth",2,"16" -HKCU,"Control Panel\Desktop\WindowMetrics","ScrollHeight",2,"16" -HKCU,"Control Panel\Desktop\WindowMetrics","CaptionWidth",2,"18" -HKCU,"Control Panel\Desktop\WindowMetrics","CaptionHeight",2,"18" -HKCU,"Control Panel\Desktop\WindowMetrics","SmCaptionWidth",2,"13" -HKCU,"Control Panel\Desktop\WindowMetrics","SmCaptionHeight",2,"15" -HKCU,"Control Panel\Desktop\WindowMetrics","MenuWidth",2,"18" -HKCU,"Control Panel\Desktop\WindowMetrics","MenuHeight",2,"18" -HKCU,"Control Panel\Desktop\WindowMetrics","BorderWidth",2,"1" -HKCU,"Control Panel\Desktop\WindowMetrics","Shell Icon Size",2,"32" -HKCU, "Control Panel\Desktop\WindowMetrics","CaptionFont",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,01,00,00,00,00,54,00,61,00,68,00,6f,00,6d,\ -00,61,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU, "Control Panel\Desktop\WindowMetrics","IconFont",0x00000001,f5,ff,ff,ff,00,00,00,00,\ -00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,01,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,\ -61,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU, "Control Panel\Desktop\WindowMetrics","MenuFont",0x00000001,f5,ff,ff,ff,00,00,00,00,\ -00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,01,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,\ -61,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU, "Control Panel\Desktop\WindowMetrics","MessageFont",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,01,00,00,00,00,54,00,61,00,68,00,6f,00,6d,\ -00,61,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU, "Control Panel\Desktop\WindowMetrics","SmCaptionFont",0x00000001,f5,ff,ff,ff,00,00,\ -00,00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,01,00,00,00,00,54,00,61,00,68,00,6f,00,\ -6d,00,61,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU, "Control Panel\Desktop\WindowMetrics","StatusFont",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,01,00,00,00,00,54,00,61,00,68,00,6f,00,6d,\ -00,61,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 - -; Input Methods -HKCU,"Control Panel\Input Method\Hot Keys",,0x00000012 -HKCU,"Control Panel\Input Method\Hot Keys\00000010","Key Modifiers",0x00030003,02,c0,00,00 -HKCU,"Control Panel\Input Method\Hot Keys\00000010","Target IME",0x00030003,00,00,00,00 -HKCU,"Control Panel\Input Method\Hot Keys\00000010","Virtual Key",0x00030003,20,00,00,00 -HKCU,"Control Panel\Input Method\Hot Keys\00000011","Key Modifiers",0x00030003,04,c0,00,00 -HKCU,"Control Panel\Input Method\Hot Keys\00000011","Target IME",0x00030003,00,00,00,00 -HKCU,"Control Panel\Input Method\Hot Keys\00000011","Virtual Key",0x00030003,20,00,00,00 -HKCU,"Control Panel\Input Method\Hot Keys\00000012","Key Modifiers",0x00030003,02,c0,00,00 -HKCU,"Control Panel\Input Method\Hot Keys\00000012","Target IME",0x00030003,00,00,00,00 -HKCU,"Control Panel\Input Method\Hot Keys\00000012","Virtual Key",0x00030003,be,00,00,00 -HKCU,"Control Panel\Input Method\Hot Keys\00000070","Key Modifiers",0x00030003,02,c0,00,00 -HKCU,"Control Panel\Input Method\Hot Keys\00000070","Target IME",0x00030003,00,00,00,00 -HKCU,"Control Panel\Input Method\Hot Keys\00000070","Virtual Key",0x00030003,20,00,00,00 -HKCU,"Control Panel\Input Method\Hot Keys\00000071","Key Modifiers",0x00030003,04,c0,00,00 -HKCU,"Control Panel\Input Method\Hot Keys\00000071","Target IME",0x00030003,00,00,00,00 -HKCU,"Control Panel\Input Method\Hot Keys\00000071","Virtual Key",0x00030003,20,00,00,00 -HKCU,"Control Panel\Input Method\Hot Keys\00000072","Key Modifiers",0x00030003,03,c0,00,00 -HKCU,"Control Panel\Input Method\Hot Keys\00000072","Target IME",0x00030003,00,00,00,00 -HKCU,"Control Panel\Input Method\Hot Keys\00000072","Virtual Key",0x00030003,bc,00,00,00 -HKCU,"Control Panel\Input Method\Hot Keys\00000200","Key Modifiers",0x00030003,03,C0,00,00 -HKCU,"Control Panel\Input Method\Hot Keys\00000200","Target IME",0x00030003,00,00,00,00 -HKCU,"Control Panel\Input Method\Hot Keys\00000200","Virtual Key",0x00030003,47,00,00,00 -HKCU,"Control Panel\Input Method\Hot Keys\00000201","Key Modifiers",0x00030003,03,c0,00,00 -HKCU,"Control Panel\Input Method\Hot Keys\00000201","Target IME",0x00030003,00,00,00,00 -HKCU,"Control Panel\Input Method\Hot Keys\00000201","Virtual Key",0x00030003,4b,00,00,00 -HKCU,"Control Panel\Input Method\Hot Keys\00000202","Key Modifiers",0x00030003,03,c0,00,00 -HKCU,"Control Panel\Input Method\Hot Keys\00000202","Target IME",0x00030003,00,00,00,00 -HKCU,"Control Panel\Input Method\Hot Keys\00000202","Virtual Key",0x00030003,4c,00,00,00 - -; International keys -HKCU,"Control Panel\International",,0x00000012 -HKCU,"Control Panel\International","Locale",0x00000000,"0409" -HKCU,"Control Panel\International","iCountry",2,"1" -HKCU,"Control Panel\International","iCurrDigits",2,"2" -HKCU,"Control Panel\International","iCurrency",2,"0" -HKCU,"Control Panel\International","iDate",2,"0" -HKCU,"Control Panel\International","iDigits",2,"2" -HKCU,"Control Panel\International","iLZero",2,"1" -HKCU,"Control Panel\International","iMeasure",2,"1" -HKCU,"Control Panel\International","iNegCurr",2,"0" -HKCU,"Control Panel\International","iTime",2,"0" -HKCU,"Control Panel\International","iTLZero",2,"0" -HKCU,"Control Panel\International","s1159",2,"AM" -HKCU,"Control Panel\International","s2359",2,"PM" -HKCU,"Control Panel\International","sCountry",2,"United States" -HKCU,"Control Panel\International","sCurrency",2,"$" -HKCU,"Control Panel\International","sDate",2,"/" -HKCU,"Control Panel\International","sDecimal",2,"." -;HKCU,"Control Panel\International","sLanguage",2,"ENU" -HKCU,"Control Panel\International","sList",2,"," -HKCU,"Control Panel\International","sLongDate",2,"dddd, MMMM dd, yyyy" -HKCU,"Control Panel\International","sShortDate",2,"M/d/yyyy" -HKCU,"Control Panel\International","sThousand",2,"," -HKCU,"Control Panel\International","sTime",2,":" -HKCU,"Control Panel\International\Geo","Nation",0x00000000,"1" - -; Cursors Schemes -HKCU,"Control Panel\Cursors",,,"ReactOS Default" -HKCU,"Control Panel\Cursors","Scheme Source",0x00010001,0x00000002 - -; PowerCfg -HKCU,"Control Panel\PowerCfg","CurrentPowerPolicy",2,"0" -HKCU,"Control Panel\PowerCfg\GlobalPowerPolicy","Policies",0x00030003,01,00,00,00,00,\ -00,00,00,03,00,00,00,10,00,00,00,00,00,00,00,03,00,00,00,10,00,00,00,02,00,00,00,03,\ -00,00,00,00,00,00,00,02,00,00,00,03,00,00,00,00,00,00,00,02,00,00,00,01,00,00,00,00,\ -00,00,00,02,00,00,00,01,00,00,00,00,00,00,00,01,00,00,00,03,00,00,00,03,00,00,00,00,\ -00,00,C0,01,00,00,00,05,00,00,00,01,00,00,00,0A,00,00,00,00,00,00,00,03,00,00,00,01,\ -00,00,00,01,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,16,\ -00,00,00 - -HKCU,"Control Panel\PowerCfg\PowerPolicies\0","Name",2,"Home/Office Desk" -HKCU,"Control Panel\PowerCfg\PowerPolicies\0","Description",2,"This scheme is suited to most home or desktop computers that are left plugged in all the time." -HKCU,"Control Panel\PowerCfg\PowerPolicies\0","Policies",0x00030003,01,00,00,00,02,00,\ -00,00,01,00,00,00,00,00,00,00,02,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,2C,01,\ -00,00,32,32,00,03,04,00,00,00,04,00,00,00,00,00,00,00,00,00,00,00,B0,04,00,00,2C,01,\ -00,00,00,00,00,00,58,02,00,00,01,01,64,50,64,64,00,00 - -HKCU,"Control Panel\PowerCfg\PowerPolicies\1","Name",2,"Portable/Laptop" -HKCU,"Control Panel\PowerCfg\PowerPolicies\1","Description",2,"This scheme is designed for extended battery life for portable computers on the road." -HKCU,"Control Panel\PowerCfg\PowerPolicies\1","Policies",0x00030003,01,00,00,00,02,00,\ -00,00,01,00,00,00,00,00,00,00,02,00,00,00,01,00,00,00,00,00,00,00,B0,04,00,00,2C,01,\ -00,00,32,32,03,03,04,00,00,00,04,00,00,00,00,00,00,00,00,00,00,00,84,03,00,00,2C,01,\ -00,00,08,07,00,00,2C,01,00,00,01,01,64,50,64,64,00,00 - -HKCU,"Control Panel\PowerCfg\PowerPolicies\2","Name",2,"Presentation" -HKCU,"Control Panel\PowerCfg\PowerPolicies\2","Description",2,"This scheme keeps the monitor on for doing presentations." -HKCU,"Control Panel\PowerCfg\PowerPolicies\2","Policies",0x00030003,01,00,00,00,02,00,\ -00,00,01,00,00,00,00,00,00,00,02,00,00,00,01,00,00,00,00,00,00,00,00,00,00,00,84,03,\ -00,00,32,32,03,02,04,00,00,00,04,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,2C,01,00,00,01,01,50,50,64,64,00,00 - -HKCU,"Control Panel\PowerCfg\PowerPolicies\3","Name",2,"Always On" -HKCU,"Control Panel\PowerCfg\PowerPolicies\3","Description",2,"This scheme keeps the computer running so that it can be accessed from the network. Use this scheme if you do not have network wakeup hardware." -HKCU,"Control Panel\PowerCfg\PowerPolicies\3","Policies",0x00030003,01,00,00,00,02,00,\ -00,00,01,00,00,00,00,00,00,00,02,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,32,32,00,00,04,00,00,00,04,00,00,00,00,00,00,00,00,00,00,00,B0,04,00,00,84,03,\ -00,00,00,00,00,00,08,07,00,00,00,01,64,64,64,64,00,00 - -HKCU,"Control Panel\PowerCfg\PowerPolicies\4","Name",2,"Minimal Power Management" -HKCU,"Control Panel\PowerCfg\PowerPolicies\4","Description",2,"This scheme keeps the computer on and optimizes it for high performance." -HKCU,"Control Panel\PowerCfg\PowerPolicies\4","Policies",0x00030003,01,00,00,00,02,00,\ -00,00,01,00,00,00,00,00,00,00,02,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,2C,01,\ -00,00,32,32,03,03,04,00,00,00,04,00,00,00,00,00,00,00,00,00,00,00,84,03,00,00,2C,01,\ -00,00,00,00,00,00,84,03,00,00,00,01,64,64,64,64,00,00 - -HKCU,"Control Panel\PowerCfg\PowerPolicies\5","Name",2,"Max Battery" -HKCU,"Control Panel\PowerCfg\PowerPolicies\5","Description",2,"This scheme is extremely aggressive for saving power." -HKCU,"Control Panel\PowerCfg\PowerPolicies\5","Policies",0x00030003,01,00,00,00,02,00,\ -00,00,01,00,00,00,00,00,00,00,02,00,00,00,05,00,00,00,00,00,00,00,B0,04,00,00,78,00,\ -00,00,32,32,03,02,04,00,00,00,04,00,00,00,00,00,00,00,00,00,00,00,84,03,00,00,3C,00,\ -00,00,00,00,00,00,B4,00,00,00,01,01,64,32,64,64,00,00 - -; Color schemes -HKCU,"Control Panel\Current","Color Schemes",0x00020000,"ReactOS Standard" -HKCU,"Control Panel\Appearance","Current",0x00020000,"ReactOS Standard" -HKCU,"Control Panel\Appearance","NewCurrent",0x00020000,"ReactOS Standard" -HKCU,"Control Panel\Appearance\New Schemes","SelectedSize",0x00020000,"0" -HKCU,"Control Panel\Appearance\New Schemes","SelectedStyle",0x00020000,"0" -; ReactOS Standard -HKCU,"Control Panel\Appearance\New Schemes\0","DisplayName",0x00020000,"@themeui.dll,-883" -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019" -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Flat Menus",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Color #0",0x00010001,0x00c8d0d4 -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Color #1",0x00010001,0x00a56e3a -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Color #2",0x00010001,0x006a240a -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Color #3",0x00010001,0x00808080 -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Color #4",0x00010001,0x00c8d0d4 -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Color #5",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Color #6",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Color #7",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Color #8",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Color #9",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Color #10",0x00010001,0x00c8d0d4 -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Color #11",0x00010001,0x00c8d0d4 -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Color #12",0x00010001,0x00808080 -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Color #13",0x00010001,0x006a240a -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Color #14",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Color #15",0x00010001,0x00c8d0d4 -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Color #16",0x00010001,0x00808080 -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Color #17",0x00010001,0x00808080 -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Color #18",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Color #19",0x00010001,0x00c8d0d4 -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Color #20",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Color #21",0x00010001,0x00404040 -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Color #22",0x00010001,0x00c8d0d4 -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Color #23",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Color #24",0x00010001,0x00e1ffff -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Color #25",0x00010001,0x00b5b5b5 -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Color #26",0x00010001,0x00800000 -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Color #27",0x00010001,0x00f0caa6 -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Color #28",0x00010001,0x00c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Color #29",0x00010001,0x006a240a -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Color #30",0x00010001,0x00c8d0d4 -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","Contrast",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\0\Sizes\0","LegacyName",0x00020000,"ReactOS Standard" -; Brick -HKCU,"Control Panel\Appearance\New Schemes\1","DisplayName",0x00020000,"@themeui.dll,-851" -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019" -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Flat Menus",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #0",0x00010001,0x02d2e0e1 -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #1",0x00010001,0x00000042 -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #2",0x00010001,0x00000080 -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #3",0x00010001,0x0061898d -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #4",0x00010001,0x00a5bfc2 -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #5",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #6",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #7",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #8",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #9",0x00010001,0x00d2e0e1 -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #10",0x00010001,0x00a5bfc2 -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #11",0x00010001,0x00a5bfc2 -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #12",0x00010001,0x00d2e0e1 -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #13",0x00010001,0x0061898d -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #14",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #15",0x00010001,0x00a5bfc2 -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #16",0x00010001,0x0261898d -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #17",0x00010001,0x0261898d -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #18",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #19",0x00010001,0x00d2e0e1 -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #20",0x00010001,0x02d2e0e1 -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #21",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #22",0x00010001,0x02a5bfc2 -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #23",0x00010001,0x00000080 -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #24",0x00010001,0x00d2e0e1 -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #25",0x00010001,0x00c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #26",0x00010001,0x02000080 -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #27",0x00010001,0x004074b0 -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #28",0x00010001,0x0070b8c8 -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #29",0x00010001,0x00808000 -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Color #30",0x00010001,0x00a5bfc2 -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","Contrast",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\1\Sizes\0","LegacyName",0x00020000,"Brick" -; Eggplant -HKCU,"Control Panel\Appearance\New Schemes\2","DisplayName",0x00020000,"@themeui.dll,-851" -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019" -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Flat Menus",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #0",0x00010001,0x02a8b090 -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #1",0x00010001,0x00400040 -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #2",0x00010001,0x00788058 -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #3",0x00010001,0x00a8b090 -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #4",0x00010001,0x00a8b090 -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #5",0x00010001,0x02ffffff -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #6",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #7",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #8",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #9",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #10",0x00010001,0x02a8b090 -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #11",0x00010001,0x02a8b090 -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #12",0x00010001,0x02808080 -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #13",0x00010001,0x00788058 -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #14",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #15",0x00010001,0x02a8b090 -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #16",0x00010001,0x02788058 -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #17",0x00010001,0x02788058 -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #18",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #19",0x00010001,0x00788058 -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #20",0x00010001,0x02d8d8c8 -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #21",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #22",0x00010001,0x02a8b090 -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #23",0x00010001,0x00800080 -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #24",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #25",0x00010001,0x00c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #26",0x00010001,0x02788058 -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #27",0x00010001,0x00834b83 -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #28",0x00010001,0x00d2bdcb -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #29",0x00010001,0x00788058 -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Color #30",0x00010001,0x00a8b090 -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","Contrast",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\2\Sizes\0","LegacyName",0x00020000,"Eggplant" -; Green Olive -HKCU,"Control Panel\Appearance\New Schemes\3","DisplayName",0x00020000,"@themeui.dll,-877" -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019" -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Flat Menus",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #0",0x00010001,0x02d3e3d0 -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #1",0x00010001,0x00213f21 -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #2",0x00010001,0x00649759 -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #3",0x00010001,0x00808080 -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #4",0x00010001,0x00a9c8a2 -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #5",0x00010001,0x02ffffff -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #6",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #7",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #8",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #9",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #10",0x00010001,0x02a9c8a2 -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #11",0x00010001,0x02a9c8a2 -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #12",0x00010001,0x02d3e3d0 -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #13",0x00010001,0x00649759 -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #14",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #15",0x00010001,0x02a9c8a2 -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #16",0x00010001,0x02649759 -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #17",0x00010001,0x02649759 -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #18",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #19",0x00010001,0x00d3e3d0 -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #20",0x00010001,0x02d3e3d0 -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #21",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #22",0x00010001,0x02a9c8a2 -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #23",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #24",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #25",0x00010001,0x00c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #26",0x00010001,0x02649759 -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #27",0x00010001,0x00e8c898 -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #28",0x00010001,0x00b0cca8 -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #29",0x00010001,0x00649759 -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Color #30",0x00010001,0x00a9c8a2 -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","Contrast",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\3\Sizes\0","LegacyName",0x00020000,"Green Olive" -; High Contrast 1 -HKCU,"Control Panel\Appearance\New Schemes\4","DisplayName",0x00020000,"@themeui.dll,-851" -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019" -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Flat Menus",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #0",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #1",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #2",0x00010001,0x00ff0000 -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #3",0x00010001,0x00ffff00 -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #4",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #5",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #6",0x00010001,0x02ffffff -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #7",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #8",0x00010001,0x0000ffff -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #9",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #10",0x00010001,0x00ff0000 -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #11",0x00010001,0x00ffff00 -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #12",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #13",0x00010001,0x00008000 -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #14",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #15",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #16",0x00010001,0x02808080 -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #17",0x00010001,0x0200ff00 -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #18",0x00010001,0x02ffffff -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #19",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #20",0x00010001,0x02c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #21",0x00010001,0x02ffffff -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #22",0x00010001,0x02ffffff -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #23",0x00010001,0x0000ffff -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #24",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #25",0x00010001,0x00c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #26",0x00010001,0x02800080 -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #27",0x00010001,0x00ff0000 -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #28",0x00010001,0x00ffff00 -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #29",0x00010001,0x00008000 -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Color #30",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","Contrast",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\4\Sizes\0","LegacyName",0x00020000,"High Contrast 1" -; High Contrast 2 -HKCU,"Control Panel\Appearance\New Schemes\5","DisplayName",0x00020000,"@themeui.dll,-851" -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019" -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Flat Menus",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #0",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #1",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #2",0x00010001,0x00ffff00 -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #3",0x00010001,0x00ff0000 -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #4",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #5",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #6",0x00010001,0x02ffffff -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #7",0x00010001,0x0000ff00 -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #8",0x00010001,0x0000ff00 -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #9",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #10",0x00010001,0x00ffff00 -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #11",0x00010001,0x00ff0000 -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #12",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #13",0x00010001,0x00ff0000 -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #14",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #15",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #16",0x00010001,0x02808080 -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #17",0x00010001,0x0200ff00 -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #18",0x00010001,0x0000ff00 -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #19",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #20",0x00010001,0x02c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #21",0x00010001,0x02ffffff -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #22",0x00010001,0x02ffffff -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #23",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #24",0x00010001,0x0000ffff -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #25",0x00010001,0x00c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #26",0x00010001,0x02800080 -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #27",0x00010001,0x00ffff00 -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #28",0x00010001,0x00ff0000 -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #29",0x00010001,0x00ff0000 -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Color #30",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","Contrast",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\5\Sizes\0","LegacyName",0x00020000,"High Contrast 2" -; High Contrast Black -HKCU,"Control Panel\Appearance\New Schemes\6","DisplayName",0x00020000,"@themeui.dll,-851" -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019" -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Flat Menus",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #0",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #1",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #2",0x00010001,0x00800080 -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #3",0x00010001,0x00008000 -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #4",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #5",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #6",0x00010001,0x02ffffff -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #7",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #8",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #9",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #10",0x00010001,0x0200ffff -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #11",0x00010001,0x02008000 -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #12",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #13",0x00010001,0x00800080 -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #14",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #15",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #16",0x00010001,0x02808080 -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #17",0x00010001,0x0200ff00 -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #18",0x00010001,0x02ffffff -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #19",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #20",0x00010001,0x02c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #21",0x00010001,0x02ffffff -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #22",0x00010001,0x02ffffff -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #23",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #24",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #25",0x00010001,0x00c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #26",0x00010001,0x02800080 -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #27",0x00010001,0x00800080 -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #28",0x00010001,0x00008000 -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #29",0x00010001,0x00800080 -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Color #30",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","Contrast",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\6\Sizes\0","LegacyName",0x00020000,"High Contrast Black" -; High Contrast White -HKCU,"Control Panel\Appearance\New Schemes\7","DisplayName",0x00020000,"@themeui.dll,-851" -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019" -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Flat Menus",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #0",0x00010001,0x02ffffff -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #1",0x00010001,0x02ffffff -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #2",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #3",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #4",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #5",0x00010001,0x02ffffff -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #6",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #7",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #8",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #9",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #10",0x00010001,0x02808080 -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #11",0x00010001,0x02c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #12",0x00010001,0x02808080 -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #13",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #14",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #15",0x00010001,0x02ffffff -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #16",0x00010001,0x02808080 -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #17",0x00010001,0x0200ff00 -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #18",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #19",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #20",0x00010001,0x02c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #21",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #22",0x00010001,0x02c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #23",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #24",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #25",0x00010001,0x00c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #26",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #27",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #28",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #29",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Color #30",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","Contrast",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\7\Sizes\0","LegacyName",0x00020000,"High Contrast White" -; Lilac -HKCU,"Control Panel\Appearance\New Schemes\8","DisplayName",0x00020000,"@themeui.dll,-851" -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019" -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Flat Menus",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #0",0x00010001,0x02d9a8ae -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #1",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #2",0x00010001,0x00b14e5a -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #3",0x00010001,0x00808080 -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #4",0x00010001,0x00d9a8ae -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #5",0x00010001,0x02ffffff -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #6",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #7",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #8",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #9",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #10",0x00010001,0x02d9a8ae -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #11",0x00010001,0x02d9a8ae -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #12",0x00010001,0x02b14e5a -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #13",0x00010001,0x00b14e5a -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #14",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #15",0x00010001,0x02d9a8ae -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #16",0x00010001,0x02b14e5a -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #17",0x00010001,0x02b14e5a -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #18",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #19",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #20",0x00010001,0x02ecd5d8 -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #21",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #22",0x00010001,0x02d9a8ae -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #23",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #24",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #25",0x00010001,0x00c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #26",0x00010001,0x02b14e5a -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #27",0x00010001,0x00cb8fb6 -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #28",0x00010001,0x00d0b4b8 -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #29",0x00010001,0x00b14e5a -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Color #30",0x00010001,0x00d9a8ae -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","Contrast",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\8\Sizes\0","LegacyName",0x00020000,"Lilac" -; Maple -HKCU,"Control Panel\Appearance\New Schemes\9","DisplayName",0x00020000,"@themeui.dll,-851" -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019" -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Flat Menus",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #0",0x00010001,0x02d7ecf2 -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #1",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #2",0x00010001,0x00000080 -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #3",0x00010001,0x0046a6c6 -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #4",0x00010001,0x00aed8e6 -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #5",0x00010001,0x02ffffff -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #6",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #7",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #8",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #9",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #10",0x00010001,0x02aed8e6 -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #11",0x00010001,0x02aed8e6 -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #12",0x00010001,0x0246a6c6 -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #13",0x00010001,0x0046a6c6 -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #14",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #15",0x00010001,0x02aed8e6 -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #16",0x00010001,0x0246a6c6 -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #17",0x00010001,0x0246a6c6 -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #18",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #19",0x00010001,0x00d7ecf2 -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #20",0x00010001,0x02d7ecf2 -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #21",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #22",0x00010001,0x02aed8e6 -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #23",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #24",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #25",0x00010001,0x02c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #26",0x00010001,0x0246a6c6 -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #27",0x00010001,0x00389cc0 -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #28",0x00010001,0x0088c8e0 -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #29",0x00010001,0x0046a6c6 -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Color #30",0x00010001,0x00aed8e6 -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","Contrast",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\9\Sizes\0","LegacyName",0x00020000,"Maple" -; Marine -HKCU,"Control Panel\Appearance\New Schemes\10","DisplayName",0x00020000,"@themeui.dll,-851" -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019" -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Flat Menus",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #0",0x00010001,0x02d8e0c8 -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #1",0x00010001,0x00474e2c -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #2",0x00010001,0x00800000 -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #3",0x00010001,0x00889048 -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #4",0x00010001,0x00b8c088 -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #5",0x00010001,0x02d8e0c8 -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #6",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #7",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #8",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #9",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #10",0x00010001,0x02b8c088 -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #11",0x00010001,0x02b8c088 -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #12",0x00010001,0x00848d4b -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #13",0x00010001,0x00800000 -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #14",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #15",0x00010001,0x02b8c088 -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #16",0x00010001,0x02889048 -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #17",0x00010001,0x02889048 -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #18",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #19",0x00010001,0x00c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #20",0x00010001,0x02d8e0c8 -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #21",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #22",0x00010001,0x02b8c088 -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #23",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #24",0x00010001,0x00d8e0c8 -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #25",0x00010001,0x00c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #26",0x00010001,0x02800000 -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #27",0x00010001,0x00c0b418 -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #28",0x00010001,0x00d8cc78 -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #29",0x00010001,0x00800000 -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Color #30",0x00010001,0x00b8c088 -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","Contrast",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\10\Sizes\0","LegacyName",0x00020000,"Marine" -; Plum -HKCU,"Control Panel\Appearance\New Schemes\11","DisplayName",0x00020000,"@themeui.dll,-869" -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019" -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Flat Menus",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #0",0x00010001,0x00c8d0d8 -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #1",0x00010001,0x00402840 -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #2",0x00010001,0x00604048 -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #3",0x00010001,0x00586078 -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #4",0x00010001,0x009098a8 -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #5",0x00010001,0x00c8d0d8 -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #6",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #7",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #8",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #9",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #10",0x00010001,0x009098a8 -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #11",0x00010001,0x009098a8 -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #12",0x00010001,0x005a6374 -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #13",0x00010001,0x00808000 -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #14",0x00010001,0x00c8d0d8 -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #15",0x00010001,0x009098a8 -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #16",0x00010001,0x00586078 -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #17",0x00010001,0x00586078 -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #18",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #19",0x00010001,0x009098a8 -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #20",0x00010001,0x00c8d0d8 -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #21",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #22",0x00010001,0x009098a8 -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #23",0x00010001,0x00580030 -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #24",0x00010001,0x00c8ccd5 -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #25",0x00010001,0x00c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #26",0x00010001,0x00604048 -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #27",0x00010001,0x00b884a0 -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #28",0x00010001,0x007898a8 -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #29",0x00010001,0x00808000 -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Color #30",0x00010001,0x009098a8 -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","Contrast",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\11\Sizes\0","LegacyName",0x00020000,"Plum" -; Pumpkin -HKCU,"Control Panel\Appearance\New Schemes\12","DisplayName",0x00020000,"@themeui.dll,-851" -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019" -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Flat Menus",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #0",0x00010001,0x02cfeaf5 -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #1",0x00010001,0x00420042 -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #2",0x00010001,0x002fa5d7 -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #3",0x00010001,0x00a4a0a0 -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #4",0x00010001,0x009dd5ec -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #5",0x00010001,0x02ffffff -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #6",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #7",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #8",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #9",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #10",0x00010001,0x029dd5ec -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #11",0x00010001,0x029dd5ec -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #12",0x00010001,0x02cfeaf5 -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #13",0x00010001,0x00800080 -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #14",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #15",0x00010001,0x029dd5ec -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #16",0x00010001,0x022fa5d7 -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #17",0x00010001,0x022fa5d7 -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #18",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #19",0x00010001,0x00cfeaf5 -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #20",0x00010001,0x02cfeaf5 -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #21",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #22",0x00010001,0x029dd5ec -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #23",0x00010001,0x00800080 -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #24",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #25",0x00010001,0x00c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #26",0x00010001,0x022fa5d7 -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #27",0x00010001,0x0088cce0 -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #28",0x00010001,0x0090ccd0 -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #29",0x00010001,0x00800080 -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Color #30",0x00010001,0x009dd5ec -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","Contrast",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\12\Sizes\0","LegacyName",0x00020000,"Pumpkin" -; Rainy Day -HKCU,"Control Panel\Appearance\New Schemes\13","DisplayName",0x00020000,"@themeui.dll,-851" -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019" -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Flat Menus",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #0",0x00010001,0x02d9ccc1 -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #1",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #2",0x00010001,0x007d654f -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #3",0x00010001,0x00808080 -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #4",0x00010001,0x00b19983 -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #5",0x00010001,0x02ffffff -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #6",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #7",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #8",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #9",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #10",0x00010001,0x02b19983 -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #11",0x00010001,0x02b19983 -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #12",0x00010001,0x02808080 -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #13",0x00010001,0x007d654f -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #14",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #15",0x00010001,0x02b19983 -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #16",0x00010001,0x027d654f -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #17",0x00010001,0x027d654f -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #18",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #19",0x00010001,0x00d9ccc1 -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #20",0x00010001,0x02d9ccc1 -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #21",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #22",0x00010001,0x02b19983 -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #23",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #24",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #25",0x00010001,0x00c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #26",0x00010001,0x027d654f -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #27",0x00010001,0x00d0b480 -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #28",0x00010001,0x00d0bcb0 -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #29",0x00010001,0x007d654f -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Color #30",0x00010001,0x00b19983 -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","Contrast",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\13\Sizes\0","LegacyName",0x00020000,"Rainy Day" -; ReactOS Classic -HKCU,"Control Panel\Appearance\New Schemes\14","DisplayName",0x00020000,"@themeui.dll,-880" -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019" -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Flat Menus",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #0",0x00010001,0x00c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #1",0x00010001,0x00a56e3a -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #2",0x00010001,0x00800000 -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #3",0x00010001,0x00808080 -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #4",0x00010001,0x00c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #5",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #6",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #7",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #8",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #9",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #10",0x00010001,0x00c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #11",0x00010001,0x00c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #12",0x00010001,0x00808080 -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #13",0x00010001,0x00800000 -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #14",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #15",0x00010001,0x00c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #16",0x00010001,0x00808080 -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #17",0x00010001,0x00808080 -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #18",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #19",0x00010001,0x00c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #20",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #21",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #22",0x00010001,0x00c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #23",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #24",0x00010001,0x00e1ffff -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #25",0x00010001,0x00c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #26",0x00010001,0x00800000 -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #27",0x00010001,0x00d08410 -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #28",0x00010001,0x00b5b5b5 -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #29",0x00010001,0x00800000 -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Color #30",0x00010001,0x00c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","Contrast",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\14\Sizes\0","LegacyName",0x00020000,"ReactOS Classic" -; Rose -HKCU,"Control Panel\Appearance\New Schemes\15","DisplayName",0x00020000,"@themeui.dll,-851" -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019" -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Flat Menus",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #0",0x00010001,0x02b7afcf -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #1",0x00010001,0x02808080 -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #2",0x00010001,0x0070609f -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #3",0x00010001,0x00a4a0a0 -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #4",0x00010001,0x00b7afcf -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #5",0x00010001,0x02ffffff -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #6",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #7",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #8",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #9",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #10",0x00010001,0x02b7afcf -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #11",0x00010001,0x02b7afcf -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #12",0x00010001,0x0270609f -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #13",0x00010001,0x0070609f -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #14",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #15",0x00010001,0x02b7afcf -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #16",0x00010001,0x0270609f -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #17",0x00010001,0x0270609f -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #18",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #19",0x00010001,0x007d7d7d -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #20",0x00010001,0x02dcd8e7 -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #21",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #22",0x00010001,0x02b7afcf -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #23",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #24",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #25",0x00010001,0x00c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #26",0x00010001,0x0270609f -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #27",0x00010001,0x00d0ccd8 -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #28",0x00010001,0x00d0d4d0 -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #29",0x00010001,0x0070609f -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Color #30",0x00010001,0x00b7afcf -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","Contrast",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\15\Sizes\0","LegacyName",0x00020000,"Rose" -; Sand -HKCU,"Control Panel\Appearance\New Schemes\16","DisplayName",0x00020000,"@themeui.dll,-851" -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019" -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Flat Menus",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #0",0x00010001,0x02dde6ea -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #1",0x00010001,0x02688da2 -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #2",0x00010001,0x00808000 -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #3",0x00010001,0x00688da2 -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #4",0x00010001,0x00bbccd5 -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #5",0x00010001,0x02ffffff -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #6",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #7",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #8",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #9",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #10",0x00010001,0x02bbccd5 -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #11",0x00010001,0x02bbccd5 -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #12",0x00010001,0x02688da2 -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #13",0x00010001,0x00808000 -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #14",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #15",0x00010001,0x02bbccd5 -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #16",0x00010001,0x02688da2 -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #17",0x00010001,0x02688da2 -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #18",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #19",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #20",0x00010001,0x02dde6ea -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #21",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #22",0x00010001,0x02bbccd5 -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #23",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #24",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #25",0x00010001,0x00c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #26",0x00010001,0x02808000 -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #27",0x00010001,0x00aabd84 -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #28",0x00010001,0x0080d0e8 -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #29",0x00010001,0x00808000 -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Color #30",0x00010001,0x00bbccd5 -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","Contrast",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\16\Sizes\0","LegacyName",0x00020000,"Sand" -; Sky (WinXP-like) -HKCU,"Control Panel\Appearance\New Schemes\17","DisplayName",0x00020000,"@themeui.dll,-851" -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019" -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Flat Menus",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #0",0x00010001,0x00c8d0d4 -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #1",0x00010001,0x00984e00 -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #2",0x00010001,0x00e35400 -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #3",0x00010001,0x00df967a -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #4",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #5",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #6",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #7",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #8",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #9",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #10",0x00010001,0x00c8d0d4 -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #11",0x00010001,0x00c8d0d4 -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #12",0x00010001,0x00808080 -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #13",0x00010001,0x00c56a31 -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #14",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #15",0x00010001,0x00d8e9ec -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #16",0x00010001,0x0099a8ac -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #17",0x00010001,0x0099a8ac -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #18",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #19",0x00010001,0x00f8e4d8 -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #20",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #21",0x00010001,0x00646f71 -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #22",0x00010001,0x00e2eff1 -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #23",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #24",0x00010001,0x00e1ffff -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #25",0x00010001,0x00b5b5b5 -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #26",0x00010001,0x00800000 -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #27",0x00010001,0x00ff953d -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #28",0x00010001,0x00ebb99d -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #29",0x00010001,0x00c56a31 -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Color #30",0x00010001,0x00d8e9ec -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","Contrast",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\17\Sizes\0","LegacyName",0x00020000,"Sky" -; Slate -HKCU,"Control Panel\Appearance\New Schemes\18","DisplayName",0x00020000,"@themeui.dll,-851" -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019" -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Flat Menus",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #0",0x00010001,0x02e3dcce -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #1",0x00010001,0x00414141 -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #2",0x00010001,0x00978055 -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #3",0x00010001,0x00808080 -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #4",0x00010001,0x00c8b99d -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #5",0x00010001,0x02ffffff -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #6",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #7",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #8",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #9",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #10",0x00010001,0x02c8b99d -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #11",0x00010001,0x02c8b99d -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #12",0x00010001,0x00424242 -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #13",0x00010001,0x00978055 -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #14",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #15",0x00010001,0x02c8b99d -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #16",0x00010001,0x02978055 -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #17",0x00010001,0x02978055 -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #18",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #19",0x00010001,0x00c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #20",0x00010001,0x02e3dcce -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #21",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #22",0x00010001,0x02c8b99d -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #23",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #24",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #25",0x00010001,0x00c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #26",0x00010001,0x02978055 -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #27",0x00010001,0x00d8b888 -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #28",0x00010001,0x00c8bca0 -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #29",0x00010001,0x00978055 -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Color #30",0x00010001,0x00c8b99d -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","Contrast",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\18\Sizes\0","LegacyName",0x00020000,"Slate" -; Storm -HKCU,"Control Panel\Appearance\New Schemes\19","DisplayName",0x00020000,"@themeui.dll,-851" -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019" -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Flat Menus",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #0",0x00010001,0x02c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #1",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #2",0x00010001,0x00800080 -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #3",0x00010001,0x00808080 -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #4",0x00010001,0x00c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #5",0x00010001,0x02ffffff -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #6",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #7",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #8",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #9",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #10",0x00010001,0x02c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #11",0x00010001,0x02c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #12",0x00010001,0x02808080 -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #13",0x00010001,0x00800080 -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #14",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #15",0x00010001,0x02c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #16",0x00010001,0x02808080 -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #17",0x00010001,0x02808080 -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #18",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #19",0x00010001,0x00c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #20",0x00010001,0x02ffffff -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #21",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #22",0x00010001,0x02c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #23",0x00010001,0x00800080 -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #24",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #25",0x00010001,0x00c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #26",0x00010001,0x02800080 -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #27",0x00010001,0x00b08c38 -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #28",0x00010001,0x00a8aca8 -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #29",0x00010001,0x00800080 -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Color #30",0x00010001,0x00c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","Contrast",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\19\Sizes\0","LegacyName",0x00020000,"Storm" -; Teal -HKCU,"Control Panel\Appearance\New Schemes\20","DisplayName",0x00020000,"@themeui.dll,-851" -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019" -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Flat Menus",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #0",0x00010001,0x02c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #1",0x00010001,0x00404000 -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #2",0x00010001,0x00808000 -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #3",0x00010001,0x00808080 -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #4",0x00010001,0x00c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #5",0x00010001,0x02ffffff -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #6",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #7",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #8",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #9",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #10",0x00010001,0x02c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #11",0x00010001,0x02c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #12",0x00010001,0x02808080 -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #13",0x00010001,0x00808000 -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #14",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #15",0x00010001,0x02c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #16",0x00010001,0x02808080 -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #17",0x00010001,0x02808080 -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #18",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #19",0x00010001,0x00f0fbff -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #20",0x00010001,0x02ffffff -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #21",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #22",0x00010001,0x02c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #23",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #24",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #25",0x00010001,0x00c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #26",0x00010001,0x02808000 -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #27",0x00010001,0x00d8cc00 -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #28",0x00010001,0x00b8c898 -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #29",0x00010001,0x00808000 -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Color #30",0x00010001,0x00c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","Contrast",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\20\Sizes\0","LegacyName",0x00020000,"Teal" -; Wheat -HKCU,"Control Panel\Appearance\New Schemes\21","DisplayName",0x00020000,"@themeui.dll,-851" -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","DisplayName",0x00020000,"@themeui.dll,-2019" -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Flat Menus",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Font #0",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Font #1",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,bc,02,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Font #2",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Font #3",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Font #4",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Font #5",0x00000001,f5,ff,ff,ff,00,00,00,\ -00,00,00,00,00,00,00,00,00,90,01,00,00,00,00,00,00,00,00,00,00,54,00,61,00,68,00,6f,00,6d,00,61,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ -00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #0",0x00010001,0x02d0eeee -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #1",0x00010001,0x021d4000 -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #2",0x00010001,0x00008080 -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #3",0x00010001,0x0041bcbc -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #4",0x00010001,0x00a0dede -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #5",0x00010001,0x02ffffff -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #6",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #7",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #8",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #9",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #10",0x00010001,0x02a0dede -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #11",0x00010001,0x02a0dede -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #12",0x00010001,0x0241bcbc -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #13",0x00010001,0x00008080 -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #14",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #15",0x00010001,0x02a0dede -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #16",0x00010001,0x0241bcbc -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #17",0x00010001,0x0241bcbc -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #18",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #19",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #20",0x00010001,0x02d0eeee -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #21",0x00010001,0x02000000 -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #22",0x00010001,0x02a0dede -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #23",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #24",0x00010001,0x00ffffff -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #25",0x00010001,0x02c0c0c0 -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #26",0x00010001,0x02008080 -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #27",0x00010001,0x0048b0c8 -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #28",0x00010001,0x0080b8b8 -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #29",0x00010001,0x00008080 -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Color #30",0x00010001,0x00a0dede -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","Contrast",0x00010001,0x00000000 -HKCU,"Control Panel\Appearance\New Schemes\21\Sizes\0","LegacyName",0x00020000,"Wheat" - -HKCU,"Control Panel\Sound","Beep",2,"yes" -HKCU,"Control Panel\Sound","ExtendedSounds",2,"yes" - -HKCU,"Environment",,0x00000012 -HKCU,"Environment","TEMP",0x00020000,"%USERPROFILE%\Local Settings\Temp" -HKCU,"Environment","TMP",0x00020000,"%USERPROFILE%\Local Settings\Temp" - -HKCU,"SOFTWARE",,0x00000012 -HKCU,"SOFTWARE\Policies",,0x00000012 -HKCU,"SOFTWARE\Microsoft",,0x00000012 - -; DirectX version report as DirectX 9.0 -HKCU,"SOFTWARE\Microsoft\DirectX","Debug",0x00010001,0x00000000 -HKCU,"SOFTWARE\Microsoft\DirectX","InstalledVersion",0x00000001,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x00 -HKCU,"SOFTWARE\Microsoft\DirectX","InstallMDX",0x00010001,0x00000001 -HKCU,"SOFTWARE\Microsoft\DirectX","RC",0x00010001,0x00000000 -HKCU,"SOFTWARE\Microsoft\DirectX","Version",0x00000000,"5.03.2600.2180" - -; Open With settings -HKCU,"SOFTWARE\Classes",,0x00000012 -HKCU,"SOFTWARE\Classes\Applications",,0x00000012 - -; Current user shell folder settings -HKCU,"SOFTWARE\Microsoft\Windows",,0x00000012 -HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion",,0x00000012 -HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer",,0x00000012 -HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders",,0x00000012 -HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders",,0x00000012 -HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FileExts",,0x00000012 -HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\HideDesktopIcons",,0x00000012 -HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\HideDesktopIcons\ClassicStartMenu",,0x00000012 -HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\HideDesktopIcons\ClassicStartMenu","{208D2C60-3AEA-1069-A2D7-08002B30309D}",0x00010001,0x00000000 -HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}",,0x00000012 - -; default shell -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon",,0x00000012 -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon","Shell",0x00020000,"%SystemRoot%\explorer.exe" - -HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion\Policies",,0x00000012 -HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion\Run",,0x00000012 -HKCU,"Software\Microsoft\Windows\CurrentVersion\Telephony",,0x00000012 -HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall",,0x00000012 - -HKCU,"SOFTWARE\Microsoft\Windows NT",,0x00000012 -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion",,0x00000012 -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Devices",,0x00000012 -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Network",,0x00000012 -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\PrinterPorts",,0x00000012 -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Program Manager",,0x00000012 - -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows","DebugOptions",2,"2048" -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows","device",2,"" -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows","Documents",2,"" -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows","DosPrint",2,"no" -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows","load",2,"" -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows","NetMessage",2,"no" -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows","NullPort",2,"None" -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows","Programs",2,"com exe bat pif cmd" - -; Application compatibility settings for Windows 95 -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\WIN95","MajorVersion",0x00010001,0x00000004 -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\WIN95","MinorVersion",0x00010001,0x0000000A -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\WIN95","BuildNumber",0x00010001,0x000003B6 -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\WIN95","PlatformId",0x00010001,0x00000001 -; Application compatibility settings for Windows 98/ME -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\WIN98","MajorVersion",0x00010001,0x00000004 -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\WIN98","MinorVersion",0x00010001,0x00000000 -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\WIN98","BuildNumber",0x00010001,0x000008AE -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\WIN98","PlatformId",0x00010001,0x00000001 -; Application compatibility settings for Windows NT 4 Service Pack 5 -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\NT4SP5","MajorVersion",0x00010001,0x00000004 -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\NT4SP5","MinorVersion",0x00010001,0x00000000 -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\NT4SP5","BuildNumber",0x00010001,0x00000565 -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\NT4SP5","PlatformId",0x00010001,0x00000002 -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\NT4SP5","SPMajorVersion",0x00010001,0x00000005 -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\NT4SP5","SPMinorVersion",0x00010001,0x00000000 -; Application compatibility settings for Windows 2000 -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\WIN2000","MajorVersion",0x00010001,0x00000005 -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\WIN2000","MinorVersion",0x00010001,0x00000000 -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\WIN2000","BuildNumber",0x00010001,0x00000893 -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\WIN2000","PlatformId",0x00010001,0x00000002 -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\WIN2000","SPMajorVersion",0x00010001,0x00000003 -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\WIN2000","SPMinorVersion",0x00010001,0x00000000 -; Application compatibility settings for Windows XP -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\WINXP","MajorVersion",0x00010001,0x00000005 -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\WINXP","MinorVersion",0x00010001,0x00000001 -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\WINXP","BuildNumber",0x00010001,0x00000A28 -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\WINXP","PlatformId",0x00010001,0x00000002 -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\WINXP","SPMajorVersion",0x00010001,0x00000001 -HKCU,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers\WINXP","SPMinorVersion",0x00010001,0x00000000 - -; DEBUG: Windows Messages SPY configuration -HKCU,"SOFTWARE\ReactOS\Debug","SpyInclude",0x00020000,"INCLUDEALL" -;HKCU,"SOFTWARE\ReactOS\Debug","SpyExclude",0x00020000,"" -;HKCU,"SOFTWARE\ReactOS\Debug","SpyExcludeDWP",0x00020000,"" - -; Internet Explorer - -HKCU,Software\Wine\MSHTML,"GeckoUrl",,"http://source.winehq.org/winegecko.php" -;HKCU,Software\Wine\MSHTML,"GeckoCabDir",0x00020000,"%SystemRoot%\" -HKCU,Software\Wine\MSHTML,"GeckoCabDir",,"C:\ReactOS\" - -; Sound Schemes -HKCU,"AppEvents",,0x00000012 -HKCU,"AppEvents\Schemes","",0x00000000,".Default" -HKCU,"AppEvents\Schemes\Apps",,0x00000012 -HKCU,"AppEvents\Schemes\Apps\.Default","",0x00000000,"ReactOS" -HKCU,"AppEvents\Schemes\Apps\.Default","DispFileName",0x00000000,"@mmsys.cpl,-5856" -HKCU,"AppEvents\Schemes\Apps\.Default\.Default",,0x00000012 -HKCU,"AppEvents\Schemes\Apps\.Default\.Default\.Current","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\.Default\.Default","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\AppGPFault",,0x00000012 -HKCU,"AppEvents\Schemes\Apps\.Default\AppGPFault\.Current","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\AppGPFault\.Default","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\Close",,0x00000012 -HKCU,"AppEvents\Schemes\Apps\.Default\Close\.Current","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\Close\.Default","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\CriticalBatteryAlarm",,0x00000012 -HKCU,"AppEvents\Schemes\Apps\.Default\CriticalBatteryAlarm\.Current","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\CriticalBatteryAlarm\.Default","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\DeviceConnect",,0x00000012 -HKCU,"AppEvents\Schemes\Apps\.Default\DeviceConnect\.Current","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\DeviceConnect\.Default","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\DeviceDisconnect",,0x00000012 -HKCU,"AppEvents\Schemes\Apps\.Default\DeviceDisconnect\.Current","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\DeviceDisconnect\.Default","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\DeviceFail",,0x00000012 -HKCU,"AppEvents\Schemes\Apps\.Default\DeviceFail\.Current","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\DeviceFail\.Default","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\LowBatteryAlarm",,0x00000012 -HKCU,"AppEvents\Schemes\Apps\.Default\LowBatteryAlarm\.Current","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\LowBatteryAlarm\.Default","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\MailBeep",,0x00000012 -HKCU,"AppEvents\Schemes\Apps\.Default\MailBeep\.Current","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\MailBeep\.Default","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\Maximize",,0x00000012 -HKCU,"AppEvents\Schemes\Apps\.Default\Maximize\.Current","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\Maximize\.Default","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\MenuCommand",,0x00000012 -HKCU,"AppEvents\Schemes\Apps\.Default\MenuCommand\.Current","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\MenuCommand\.Default","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\MenuPopup",,0x00000012 -HKCU,"AppEvents\Schemes\Apps\.Default\MenuPopup\.Current","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\MenuPopup\.Default","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\Minimize",,0x00000012 -HKCU,"AppEvents\Schemes\Apps\.Default\Minimize\.Current","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\Minimize\.Default","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\Open",,0x00000012 -HKCU,"AppEvents\Schemes\Apps\.Default\Open\.Current","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\Open\.Default","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\PrintComplete",,0x00000012 -HKCU,"AppEvents\Schemes\Apps\.Default\PrintComplete\.Current","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\PrintComplete\.Default","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\RestoreDown",,0x00000012 -HKCU,"AppEvents\Schemes\Apps\.Default\RestoreDown\.Current","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\RestoreDown\.Default","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\RestoreUp",,0x00000012 -HKCU,"AppEvents\Schemes\Apps\.Default\RestoreUp\.Current","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\RestoreUp\.Default","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\SystemAsterisk",,0x00000012 -HKCU,"AppEvents\Schemes\Apps\.Default\SystemAsterisk\.Current","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\SystemAsterisk\.Default","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\SystemExclamation",,0x00000012 -HKCU,"AppEvents\Schemes\Apps\.Default\SystemExclamation\.Current","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\SystemExclamation\.Default","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\SystemExit",,0x00000012 -HKCU,"AppEvents\Schemes\Apps\.Default\SystemExit\.Current","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\SystemExit\.Default","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\SystemHand",,0x00000012 -HKCU,"AppEvents\Schemes\Apps\.Default\SystemHand\.Current","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\SystemHand\.Default","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\SystemNotification",,0x00000012 -HKCU,"AppEvents\Schemes\Apps\.Default\SystemNotification\.Current","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\SystemNotification\.Default","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\SystemQuestion",,0x00000012 -HKCU,"AppEvents\Schemes\Apps\.Default\SystemQuestion\.Current","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\SystemQuestion\.Default","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\SystemStart",,0x00000012 -HKCU,"AppEvents\Schemes\Apps\.Default\SystemStart\.Current","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\SystemStart\.Default","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\WindowsLogoff",,0x00000012 -HKCU,"AppEvents\Schemes\Apps\.Default\WindowsLogoff\.Current","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\WindowsLogoff\.Default","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\.Default\WindowsLogon",,0x00000012 -HKCU,"AppEvents\Schemes\Apps\.Default\WindowsLogon\.Current","",0x00020000,"%SystemRoot%\media\ReactOS_LogOn.wav" -HKCU,"AppEvents\Schemes\Apps\.Default\WindowsLogon\.Default","",0x00020000,"%SystemRoot%\media\ReactOS_LogOn.wav" -HKCU,"AppEvents\Schemes\Apps\Explorer","",0x00000002,"ReactOS Explorer" -HKCU,"AppEvents\Schemes\Apps\Explorer","DispFileName",0x00000000,"@mmsys.cpl,-5854" -HKCU,"AppEvents\Schemes\Apps\Explorer\EmptyRecycleBin",,0x00000012 -HKCU,"AppEvents\Schemes\Apps\Explorer\EmptyRecycleBin\.Current","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\Explorer\EmptyRecycleBin\.Default","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\Explorer\Navigating",,0x00000012 -HKCU,"AppEvents\Schemes\Apps\Explorer\Navigating\.Current","",0x00020000,"" -HKCU,"AppEvents\Schemes\Apps\Explorer\Navigating\.Default","",0x00020000,"" -HKCU,"AppEvents\Schemes\Names",,0x00000012 -HKCU,"AppEvents\Schemes\Names\.Default","",0x00000002,"ReactOS Default" -HKCU,"AppEvents\Schemes\Names\.None","",0x00000002,"No sounds" - -HKCU,"AppEvents\EventLabels",,0x00000012 -HKCU,"AppEvents\EventLabels\.Default","",0x00000000,"Default Beep" -HKCU,"AppEvents\EventLabels\.Default","DispFileName",0x00000000,"@mmsys.cpl,-5824" -HKCU,"AppEvents\EventLabels\AppGPFault","",0x00000000,"Program error" -HKCU,"AppEvents\EventLabels\AppGPFault","DispFileName",0x00000000,"@mmsys.cpl,-5825" -HKCU,"AppEvents\EventLabels\Close","",0x00000000,"Close program" -HKCU,"AppEvents\EventLabels\Close","DispFileName",0x00000000,"@mmsys.cpl,-5826" -HKCU,"AppEvents\EventLabels\CriticalBatteryAlarm","",0x00000000,"Critical Battery Alarm" -HKCU,"AppEvents\EventLabels\CriticalBatteryAlarm","DispFileName",0x00000000,"@mmsys.cpl,-5827" -HKCU,"AppEvents\EventLabels\DeviceConnect","",0x00000000,"Device Connect" -HKCU,"AppEvents\EventLabels\DeviceConnect","DispFileName",0x00000000,"@mmsys.cpl,-5828" -HKCU,"AppEvents\EventLabels\DeviceDisconnect","",0x00000000,"Device Disconnect" -HKCU,"AppEvents\EventLabels\DeviceDisconnect","DispFileName",0x00000000,"@mmsys.cpl,-5829" -HKCU,"AppEvents\EventLabels\DeviceFail","",0x00000000,"Device Failed to Connect" -HKCU,"AppEvents\EventLabels\DeviceFail","DispFileName",0x00000000,"@mmsys.cpl,-5830" -HKCU,"AppEvents\EventLabels\EmptyRecycleBin","",0x00000000,"Empty Recycle Bin" -HKCU,"AppEvents\EventLabels\EmptyRecycleBin","DispFileName",0x00000000,"@mmsys.cpl,-5831" -HKCU,"AppEvents\EventLabels\LowBatteryAlarm","",0x00000000,"Low Battery Alarm" -HKCU,"AppEvents\EventLabels\LowBatteryAlarm","DispFileName",0x00000000,"@mmsys.cpl,-5832" -HKCU,"AppEvents\EventLabels\Maximize","",0x00000000,"Maximize" -HKCU,"AppEvents\EventLabels\Maximize","DispFileName",0x00000000,"@mmsys.cpl,-5833" -HKCU,"AppEvents\EventLabels\MenuCommand","",0x00000000,"Menu command" -HKCU,"AppEvents\EventLabels\MenuCommand","DispFileName",0x00000000,"@mmsys.cpl,-5834" -HKCU,"AppEvents\EventLabels\MenuPopup","",0x00000000,"Menu popup" -HKCU,"AppEvents\EventLabels\MenuPopup","DispFileName",0x00000000,"@mmsys.cpl,-5835" -HKCU,"AppEvents\EventLabels\Minimize","",0x00000000,"Minimize" -HKCU,"AppEvents\EventLabels\Minimize","DispFileName",0x00000000,"@mmsys.cpl,-5836" -HKCU,"AppEvents\EventLabels\MailBeep","",0x00000000,"New Mail Notification" -HKCU,"AppEvents\EventLabels\MailBeep","DispFileName",0x00000000,"@mmsys.cpl,-5837" -HKCU,"AppEvents\EventLabels\Navigating","",0x00000000,"Start Navigation" -HKCU,"AppEvents\EventLabels\Navigating","DispFileName",0x00000000,"@mmsys.cpl,-5838" -HKCU,"AppEvents\EventLabels\Open","",0x00000000,"Open program" -HKCU,"AppEvents\EventLabels\Open","DispFileName",0x00000000,"@mmsys.cpl,-5839" -HKCU,"AppEvents\EventLabels\PrintComplete","",0x00000000,"Print Complete" -HKCU,"AppEvents\EventLabels\PrintComplete","DispFileName",0x00000000,"@mmsys.cpl,-5840" -HKCU,"AppEvents\EventLabels\RestoreDown","",0x00000000,"Restore Down" -HKCU,"AppEvents\EventLabels\RestoreDown","DispFileName",0x00000000,"@mmsys.cpl,-5841" -HKCU,"AppEvents\EventLabels\RestoreUp","",0x00000000,"Restore Up" -HKCU,"AppEvents\EventLabels\RestoreUp","DispFileName",0x00000000,"@mmsys.cpl,-5842" -HKCU,"AppEvents\EventLabels\SystemAsterisk","",0x00000000,"Asterisk" -HKCU,"AppEvents\EventLabels\SystemAsterisk","DispFileName",0x00000000,"@mmsys.cpl,-5843" -HKCU,"AppEvents\EventLabels\SystemExclamation","",0x00000000,"Exclamation" -HKCU,"AppEvents\EventLabels\SystemExclamation","DispFileName",0x00000000,"@mmsys.cpl,-5845" -HKCU,"AppEvents\EventLabels\SystemExit","",0x00000000,"Exit ReactOS" -HKCU,"AppEvents\EventLabels\SystemExit","DispFileName",0x00000000,"@mmsys.cpl,-5846" -HKCU,"AppEvents\EventLabels\SystemHand","",0x00000000,"Critical Stop" -HKCU,"AppEvents\EventLabels\SystemHand","DispFileName",0x00000000,"@mmsys.cpl,-5847" -HKCU,"AppEvents\EventLabels\SystemNotification","",0x00000000,"System Notification" -HKCU,"AppEvents\EventLabels\SystemNotification","DispFileName",0x00000000,"@mmsys.cpl,-5848" -HKCU,"AppEvents\EventLabels\SystemQuestion","",0x00000000,"Question" -HKCU,"AppEvents\EventLabels\SystemQuestion","DispFileName",0x00000000,"@mmsys.cpl,-5849" -HKCU,"AppEvents\EventLabels\SystemStart","",0x00000000,"Start ReactOS" -HKCU,"AppEvents\EventLabels\SystemStart","DispFileName",0x00000000,"@mmsys.cpl,-5850" -HKCU,"AppEvents\EventLabels\WindowsLogoff","",0x00000000,"ReactOS Logoff" -HKCU,"AppEvents\EventLabels\WindowsLogoff","DispFileName",0x00000000,"@mmsys.cpl,-5852" -HKCU,"AppEvents\EventLabels\WindowsLogon","",0x00000000,"ReactOS Logon" -HKCU,"AppEvents\EventLabels\WindowsLogon","DispFileName",0x00000000,"@mmsys.cpl,-5853" - -; EOF From 2d25ad0d850d513361bdad84719bc2c77f14d743 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sat, 1 May 2010 22:17:34 +0000 Subject: [PATCH 106/131] - Convert hivedef_i386.inf to Unicode. - Add Strings-Sections for several languages and add TEMP_DIR string. Please translate the TEMP_DIR string as this is the sollution for bug #2482. svn path=/trunk/; revision=47079 --- reactos/boot/bootdata/hivedef_i386.inf | Bin 0 -> 314598 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 reactos/boot/bootdata/hivedef_i386.inf diff --git a/reactos/boot/bootdata/hivedef_i386.inf b/reactos/boot/bootdata/hivedef_i386.inf new file mode 100644 index 0000000000000000000000000000000000000000..33d3a0a09fd5f587ec5563f5779360935f8abce7 GIT binary patch literal 314598 zcmeHw{cqezk|lpW;Qj|eI}OYNZnspDY-t(`j6b`5({}e-_VnD27Xy9S)>{5J$!@pj zaR2(-xzyJI9;;+R?ab8>$r^Wl?UGbmA ze=q)9v5&uA;je?@WAO?9Jt_XJSTFuiJjHJZ#Sz~98K3z>`B{Gc@5PzD8G=zQcbM_N$~`)ZyQH6$KAluh-zJUMB3(K!6UzgZO)1>WeeJIZVWmmZQb4OVaNLwEoSe% z23}fu9L7&*>lymysARzjtT6VNKLXtau(8j-6nDX|mw1qa{g&84Yb3mS1e_P;F+UcM zai-%23#z=@6dm&?9OnQ>GCY3N!mQ!Pe1g`$Ee=bhKf?-P+gx!^!jTR7hS9Y;L{L*5h*V4u?nysPqU7(+ITz2X)g8^tajGPYFD#@_9>&25pz ze}ygH!6NUA&jN050`(R!Z;Np|tk1yAL*PC^i#Ix$BC|*PaW^}TyIUgPy|lYzgtnh! z(Q%F~c-8o?Z@BhI6f`EC^pd&p5^Lo*zP#TCeAPh|4zrTZ6Dl53&!BT)o~8? z!EQOiu5O>(9ml7AI0_bc?2Kx~ZpT?{Pcxdxd}lkG_BzhN(R>?h;;YmTwVj1AB^+^Y z!Ak6rtB-3U3?JXLg5!Z+bVT(ci`MjpRwY}4zTw1?CzjKzoSxAHWL7r42ZDG1(<^SGG?Rj&;nVOh#>H zBOL4Ue(kdMi!ztwEP!K%bC+{ig?TsIzmA#A8UB8SclftCyYaqrAz-dcd}|GaYvp|7 zHTufV-VDC3Z`>{0!yI(2_+$C|IgWl({A)yuHu=T*?gcVxTA1?K zS@eCp(&A>`XzguAVmynFLHM-9Y1&}$F+Rp*q!is<*zVKiXnh8j)LD=Mk?Xy?=*O49 zN55h{<_GjIeXaE_se5;hvCUcar;_ugSB)QO_ba#HU*d5*bmqtCgWpTGa8A8nj=U2@ z0q5VCCryvTGWHoP)Q@Sa9AhzY?Zc;<8K)UV$Co~S%2=~svVn8meT)keZH%XDXGBas zbf0^_cm_njV}w4yxMe25)l0{TxR$pTZ(53!c06?^xsD-&6>=Y%e<&-gzg}# zjA;ow27WFhp^1uZUMVII+Rka;<5>I^{=u$I84qp8Ufd|hbG^cYt1)x?MrJ`~&8eQx zn;vM-HHR?H`CfBG_xH0hzvP_3@XW0`n;gfkw-05RJA*mnKD^5Td^@eosQeOtagF+8 zxsv=5ugt~x*{KjXMD-XGI^WPy?T+8H@#`}0xF|jR8N97Ocdy%;D><=x*FUpApRb>J zxHs`zeINb!>2gi;Udd|a_A-lKC2#f5zmGLr^31)@b!f}4X*urBY2payAt}#8+}53-HMt0_?F!VSGY#{u*@*eO3v7NZqMTsF33<-HuA`#_MB5n2^Fi?gxJ;8FXCml{Fcz4Ke34m2BscV(_>+PK-xn9&}dn!?cgyh|H}1 z9Gh=FhnJ-<_yteDwtZ1n92i&GQevRJt7pH_p%#%_nLYg(2>6p&+9OR28~bOn+;Se@ z&H=~gd#*jyV!oWPRsNZ#Y}I4*5XXV73o)MimFTOi-L&NezrrJ(l*g}*ho8zQ!g;70 ze=+6*?Pt3O3>@*X&&EFDnm%)aW>k*JLPkE$XwK1Z&SHN=2FdvBG!0kxBrj@n88U=p zpX)2eYU^MN72n36)#nFxraE+Wxz3ki2>e;mTo|}s!0NuqL)z^?rQwu4QO6Ln#MCGl z>*`3_tuby~OIYFK2w8-Bx+(j``qg$jOx+*$?4j0AeST_msIjA$YPZ0&)@L+h9HY|l z5quRrBXwi$S{macs3rE1tl=Hz&CHscYRMO6UD2&g^mDR4F6{h)p4;WUZhmqDnZ*wN z#|)$X)6W!d6fa5!H{X}Ma|o*t0qxNDd9JO5KC^?o-2V3#@=5pmZsm8j#T?-lSW!n_ z{Z{BKdfp#n^J!aA_hzwKY)4T{{u+B+&7ynY6FKD=7q)KKXRgNID)QyxZxwmiV*adf zj!#a@UmFoKf9Zd#EXe$g!|v(%%WE%KaXP^YpUF>BXAx<=a5Zu)7mKUN9I$f zmc`9^VjL!qw`VFQ8{{S{Hhs4&OdfCZv0Uxu{M1Y~H7H)?5QoFY8e^=Qio~+}w4+TxCeBJ_3HL>97{9 zBd%jLxaURuS6KEO9Qah$Ff0@5Ic60z)eKep&WYJ*+po$Fu34pFhsC`-?68QJi5=$p zgR8P5o$s)?mxmn|@lbYfSEDq(@qUJF2*shaJ|^!`X3|j2+hBEgL&5?&V>JMLe7xMl;ilEcDWL zjm~N_-4zN{gswq#&HcxQuhz96k8y^6%&sNbRkPu%bK&E!7e=#B{Qh+fcAbv4SO*Sj zgt_D4(0J8#_S4Gs3)~HuZ8o|sj_=rK;#EoKP!VuRhU((E zqT6l7`&iH8C!GDJILAD8`>FU3w1m1m*P8fj;QBhRF&=xRT7Ta>!I@rx=Z1Z*P4Rok zUPUnNIokRsc3UoxNpYV``Wx#J?qGdA?ijs*ui>7c)wBFE!CBljT6G`y9OIgPh`W?g zyZZ5R6w@!o^hFn6+1K<%e~5mrrZ4(#f^+aHQ(m{r$mKY4^YTpJx7>N4UF+L7elHLq zc^%oSvSvbMjyu}}T#@lSdfRxljNPZx#6rg3xO`yLXPcUR#k)B0aRZEeeEC@W`py@` zF+O7BG1n%sGSx)%xcCm||L*e4@z4DXN^)MQNaYo;t#thx-|kHh{ikTQe1U5oPcEb8 zdU@{)d)*3K+C+m-?)d{xQx*q&)_9D&T!^CR)1!8afNFj%hnu=<|01pRd}v`g^DqJbn|cMG`uD^~iJo9!5Ji z5^JUQ^K$?CkZrA>mF`F4yqEQD?j7gPjQ67A$oSjpy`VTs)=M?iTll!|um?M@#iGwW zLBzAysSb-o4#N;s=3Kne_Ox=HDG?it%uSdLuHot8@Y>h+c;6j6f8Y*ZYvs-z%pTXu ztcLAd!~5s>$!qo8Rc&iH-g|u7=*^7UY7O7xwbT5z*(YnQTo-y-zViXUe?shI4$S$= zDY7Mg&Rm1XZ}MEsIe1o^iBH?Bet*+)L!*`RnQfzK=%{x`>mCtT`|kpI16$bcsd%j; zcYUa0Fuu-R!B;7IlT>q~7%v~TND*tHRXhTQa!44HXTD2AC_@*!T^HzB-?$Bg^ zH}AM(PU}@{^`Yri$Vkp(?ERR&E9Z~AhTQDGM_kj435#i*PcdGCD}CH)faCn-rT;Ly zXft2sXZRmxlXj>&;mRNHvo@^HUXU2RO( zJ&5rgb9fNmk%?p8&&>Kfi18GDy|?-;=Mk*mG~P3{2eB2ZHV?vmeYnSuzYErMzQdxq zs_$Usi}yNVreeo2_YgDdn<@k8&sGuls%eW!^wbYzJSF!@8eEP{Kba3<390e28fx&Jt;$!nMQ zh?;KnTO2V*zdyTJ!x-m2b@T{k)N_roI^*C>hWPOp@)6demw5w^v4%Bye%c(nefIPc|NVk*e8MX|5szZ7jp6)cDr1Z4e)W7%BK&NTtEOXc(^r}bkd zk1@3(uC18;!FX42-o=~#+ITXX>2L+d+~>~h;cDJz<YQUc@F*a zoOYj7^*7EFaGqm6ufcPeyPCG;IOg7HYq)PubroUCRacAUs{X;`5@sEQF`qu|40#0e z6t0V!Sq$&iVloKp0a#i74e#37j`fh!j(pqN*x=%a%Ls9tl<@zDNB^&v3%x*$s zb?b6Pw;in=$-V{dHr870C(SC68~G+j>dqNV-Jf-5GgGhD8m?0F=QuF2-c-8Xk-4j= zt;Ik0$RP<|oXa?Nt1kU7@WSz^}vC>j!BNQ7`z}(+8x*^#U_g zVyfSl*YqFt7W9JVzKWcqRrg?YwV1jshw25}`fn&I-pRVDa&E`P5%Cmls_ImH1`f$% zhv0WLODdHwkYAeJnyae>A-n$ha`laoiM7F-=nvNCZWQ0bEAC=_b^N#q*`2sweC_=U z{BCQnaofQj+Z?P!AKC-$EiwDUf#a9Kq?i;O3rPW4C*3 zrEf)AMw_ZsN=6UaWvr{8vyV1RUv)+^>!fG!HP-WG9huSHK6mJUSDn#jRXsC0XB}Pf zZ`i0xn{}Ag;>_sG=w)U!ue7zR*v-|BwzZiftco2YH{sm}=O2M}y#8Fa4etT2SH6X{ zr!A~arpD{fRNC;~0?q|&yP*KDpNF>L-33znOl@C3%V@)^iNAgfX~WAaZR{hpeR&7F z>b#^4FJriUq{hp;wJ#H1-h*tJ@S1%fTn^O62g_Z)rsf0j^;=kzhv2Rr%Z6AI@ zYkF2l;+&?qyovmvpB1`Bo+Q@k8hMgvr;Epuc&7{TvPC>oNAHW#nt06W|8n_?g(&86 zhGd_qBgg_XwtgGyVud8;**u=F>1`~Dc_-kGjeF@4OJd$3)+g*UJz{Chv&=}3SQ7JI zg1@{@>HsT2=@Cm}-cgB|s5Oi{$vjU}e#~8$mcbuWWk!9i-My}RCT+)D8gKj))=*yo zEBD!wC@cHaphj0o-RND|fP2ZjnQ&~{-3#I>D|g|$dF1JQ%I39Eh=y9CSs@z6?DTZL zr?I1SKCOnmyF+vTmtmEutUhAjX;1~u?@u104rn#c{)%H}wBg0_{=ClWBZ-gpXXo=X zI_v4;j-FL#w7+_j86B5j^B-;18SSs`Wk%1>!MJB!bw>NEznRf-`8EI1R*}(l#ihU6 z(Nz2_pbTALt#AX+%>*lBb-eyuwu#q{N>&qx-6?F?)yAQDN*%91Q|ZDxt#(F+*Uv-S z@bc>6U0i=o-SGS?8+H5oSw~-;2 z674i)KbyGIcb|T0x?8_!uRPH(@0Te=(`TC+6`~qw+U(%Twok`wGY4JA z-3#OH89KEhba8DIp`n&&R)mHzJN=x$f@J3>SrIx+k4n4oO1tzwuXEi`!f3yWmKm*q zm18ihI-~s+==m9)6`^DJ+x+gTGumIR$&7AtWVzm1bw>NEd7076#os2{RcExn+M5~O zNgC#Jl*q1J1OHP#GVF)C)Q0Qja%DwU9XN zBQ;(<`WP7>B#O{^6wNZc9AEtvZ%rOeq6pO%ll!9_tKxI)G%aO?B+hAy%bFCSQX5NR zovx85iFUeJ(I4*?P>t%zFC~glr$Ew>QOFdbnrtjpgz}26sTD{vU!h46Dn%@bd78YN zOcBZ`%?Dpo=f*NcsHSXlA-W1;9!02>$IBM;7|;4Ldh&Ox)PwRhJ&z@`JSv+H;gOH< zGd*I-JWo^1lPW?}uViXegoZrDP(`S({&c#~AFxO02_EmTU+B-cW7TQ#8~&P(&FauF=By6Afh$Ljzv?;j9p#xL$5OY>?@#i6 zq3pfP=$I_7j)t_1_Gjj1M$4FY1GTlC^5;wMXVVg6v;kQi+O+4GcgFO^nDe^tre(BW ztspKwGNa=~;i~_d{`Xa9w6EL9jHU&q=iPK?S#?JH)y~Z5>9{t}kynw?bv2+wJ9CT` zcHWG7uc`6+GnJ+qa09c{ZS2o*8}pXEe(I-k&5 zU7ZhpmeGdy0Cwdr90!x`7b?T+$B-u8xzwRDypr0Xje~qmJ>DdhLrr)kbwf>fB~`h&`Ia(wmGlBu=S;~}K#P)&&Yqa63A)09O>;+&?qtVtaz9eI*ir)%U%qMa^Q^v65y z2&X5%)T9oT@>mk{G~ZNqQSgW_jG%^au|s%F`p3#5_%`kg7vd`(usj(2#E%st#?} zfI5xnk5GlaDqce&$~C;ICDtZgsWoea@wK8;?Nu;;XkW#V8J&uWvCg~djP}=oGoxcME7fsU zk*t{%ywrnf;DeuKwBfb3 z)qvNJAx*qW5qE@ZO*Yt=b^Eyr5O{Nvqg;*N%Eb8>E zki)Mi1`?k_7vES=+7W~AqFf6UXB(aY{FPy1SCq_(k4D{2|R z*EEQ$3dz1)vx+ta-l1C2ZY`)xGrE|tUyN^FKF#RPwb6`*TB2Dq8pfP8qggX*m4@`y zaetpKK1mqu&&O;m%9_#G{T!Dy;iFyWTDOGJ{u=fCjLw?TxL$JA8SSsN^eVNhob1?21SDn%RdT?fRTz<`ev{htuT@%)?sF_Rc5z71Pc>TF-I?bI7uRl|1 z;+?BnAj9kDp&`81_szeuQRjo7Wwhb7SoxY7uOCC2cy*08iHgS7nE9I8zLI((c|fch z_#mk!YQn2WKO^&J9AEvlIm=)TjF4+aiB<>VAyH0)myl^jt&h-QV@ag5Jl0|3Ws7y1 zG^0}Q)*tUoK4H0>IzCJG7d2i@4`NBo(=_rlX+~u{mhCU9%f|gNZ!Yb#)W(vzof&)P zXKG&|+h3GeEi=+1?vHtMX-1{2kj(I`GH_bWs1$L3%yWz&JJPd4GRw2^P6uLX%rl-M zy^S?#M!R^dQ8OCC8&fmNXvuN-J$4uE(w5%Ez3C6I!`zz*N3HRA%cmW^b#1hxp_XXY zj)pO3?P%7HhP8T(kYoNkUG^ejv|n$t@jh!u$MxzMMvVLJb*_0!812v7=Vx@*j*j(- z^%1b@jP}=cGNa@2YyP9HI-~tsS7!A59E^L$RcExnE}R)1mtXTAZ50_^*WUFjYv$6j zh4TJ7UVko|PJ1WA>(5l0c-@{2(^h6=c>O%I4KK&3ttQRCvQg)QpJjybT3?+SuOCC2 zcy*08NoCPiZuy$pzC-GY8t_W1iq^)d?JKP*YQf9#)u$bG>M9M4kZ4B@Vl6&c(|)6} zC@0g7TKj5<%bM;@FSYTq#X3#eQK^ml*D-*yH^%Z=U@| zWj5BN9hD;PpV{f+vFzUTHgD6A3CXpiT4r~PqCe)%r5%;>STe)YlnKf1O|J{FWR|CC zRYkVns3se0(vEhGJdN7X5Z;*DQKt!&X-I#?J?u}5kHyJ^8LP>imrp}_``TzoLoLy) zAq`{B8q%yGt*e?C(__6e-OOFWXus}eGw!S*jn~7mm?AsQb*_C&812vB=Vx@*kjC_n zH;@(4N5(zou%o5*(SGedGkRF>$^7P=$6R$r`|6I&=sDRp#kp3U(f;~yX7m&+oAa2f z$mqHTPf~51r>+#r`|Ei9xon#TPZM5$rqaY~y@+|8KMSqf*Uv-S@M^NJpJiyr>&K8L z-nlBzvhgOVFjg6yn!o*;nkw2UH8nE(N~?<&b!z+S(bLH6%kkB(r(reJK2uv*rXih2 z0VK6?f0Uc+Uf)v0k~n9_9ADG3V%Z|yra(`lE7ob!kV<*nAMfVUkV+BvM?8brj=uCG zPZIMiS`EHJlZI5r3YmsfmyIPcPg9hZX-IY1c-dl}CJm`{NKQ3K_zN-8=Wr4Gb3;LbfUZ0Mkg9-iDsQ> z7<1N%W}WDCT9YaL;EQ4({`Q|x$*URisrc3!@Yxc@tpF??@*Rh$Lr5!+jMqzT=I4Pc}g9xKT~Pq-6#$V?j&{sUBy9i zynY_qhSw^p_?p_jewNXOR}+8z7}CT$mv%-r-t<%vWqA8_Gga@9p1+a`Vij@f@g}Js z&Qpz(@qy#3Uni=`L&$WZx)AqAxrM4IC);aOQ(V@x*Qj*lNn)KY9!sK~E>`r%J8dJc zKjO`$6P5CK*a0SOPE^Kg9QvTb$Qw^3g?!1HL*I*SaipJlY+rG}Xm?-K=h{TR~3 zJC_zzW?xCA&@njucC(@Bi>wEP-z5_#5_%NB$*ae7vklc z*GXcYChw+63o09Vvir_!$~Glh&;{nr?%wmM^Z5m`vi|&7Q_PcTLANm9--D%T>-0A6 zk9oXj!7k8pl|lnzNzBv43Yiu(y+78d1r2%Qp;}O<`>bn0&#_nCJMenCacF1x%cln= z^7h^Q?!#&qrH=NX_)BXsgNTy5iDb z`QY4=53YP{6u;xSxK!7%sxjrhGT~Wm9kD;JZ6e-)8s&Dm|0b(3DOSYli2Yeh8)B+M z?IS&6KPPQR%o+@Bt$`JO#?gkD`-iY%#9B;x8~gF3iCEjnlhhI|hxwY`#{K%4DqanU zCAGvV=JYm})Dq{Z;&TMGS19WKn4haxTH3~*E^i^zjcUUzi+qeA$A}|`3Ot5PJE|*M zYuZUvJ_aT6PaB^l5s=x1p1f!inQ*_a(}uY}3cA|3j!eT;-|d`B6SfElJ0q zR7q-7OFCwMn)Vfy+qpjua!+4PvlC5vQn{Tavp{pLpqAAPiKbMa-;l*YH&01FOOfeH z>6f`<=cbAkf(20Y#cu90O22W0IIm$Py4k`6>!it0r|C z(_f%*`~=nGls?3)DaY5B-kMyKxfxjTSVnzms4cqnrD4>0*U@|j`gn>~W>eLpP3sTa z*HNpQX}=C5&vgHOz3br;Kkd)c=jU|Rm->Eg+?dIn_G|f>({UL#|Isq1 z{dK;~>G@e0_l%j-emyjEIxfTJKiXVt_ZF*3w{JZVGBn!cWq*I!jMBhmg$Kl1vuH5RLRO^;YoQLJK4k64qwR5tQB()#PR zy1a!%UrO($$-`|T2KU=}r`*kYtGps4J)7nFQd=X}fLRj#bj1?M{-pZ&EQx@+@*;`8 zbOZM!*Obdq-P7+kbVWg#zEqcgmgq~h&Hg0%(ke5iy=F+3Z%FQ3ug%xV^riG0v^Eu5 z>Eobm$5O^Y>hX@@^)z6X%>$jrR0C#79MrXr3_I z&oX_fhS;rBUmA*nL-nOrNm|vGQd#<;cvJ3SI;H0`Gu8MC(;ci!PrK{qBCu+{j0)3G zTXZW-!>F^uG%HNU>7$rkhmJ6C+`&A?e#UUrFyj{H3-0}wmESX`uWs$GQJ0$2el4zDlrVPWvmtnbQ*9X#UJM>Qd6{<2Vc|kSd+q3 zW@C=DJ_QpirJB5jL}98AbARO1mt9C=pRJDbHT?+GwS%d23`*jkwlOG)fVwg{iNcf$ zI8E87L}98e(~v1lbW-)LoO;;m~!^2BY&1EOw-Q?bt+6lUSqhzw5lg{ zI@70E89goD;ZE;s#eMw#Wzsp9ng1=L)^sbdinokf(@GBSd1JS;VuZlTh7;f>b%QJSn-nDTFr~S3-`8l1nrdJ!op>JhQ`?ZbC z=@3_z<^9ZQU-^+ay)4`f;mn-&YonRdA+9XT`>V<6x_(Tex;cjKhO5~}xWX#MthSEW zpVzi&^z7K=YkI`~tfh&Vdx9S08cEJ{Un)TC=cH|jStqd1^fvZ0jyA-H;O}0!^T(C~ z8~gF3iFiJ(X=v_UA9<1rqpp#sNoy*zu_mpl46!DysSGhkTEEs*m$#5IqjWt{&> z;-D^HC)1kh%Jy|>O=W&Vm)2B@dHLd?Ol!(Jha6%JW@-(j)XtLGpuv0u+&b2}Bymtz zz9G|^YVglGwWc9957nABHKkR(DR(2M_^^KHquruB#I`%>h6PT4nkpHnGEB|NTvCN-!1 zIlP_w&Zno&+S9n)y59N^N$%m-`7@{EGHm{%WlsA_kj&}%Ss3?>nbUr)G;=yG!{$HQ zYI3@+C+k1UPtWDTAC_DqrR~o zCB-bOj@ZvhLx`JhGA3UvabyHm~Vz+^@UQhFDT< ztYS`YV@a)17mqp8`n0FcQ)r2LlDKERn-`SI8xt_Gj+%b2=+dGpCsspX2!s_3IPl zcTe#1Gp@ke$KS8<`&&FO@IF`7+Z74bD+B!Me&%#shRuJp?5BPGN9OeWER1``%xQmR zICDBK!{$HQYI3@+E$r9cEU=z^8`;iFWH;09#2Lz#>WKY$ZBwZ?-wtXr#Qvx+7lxTnj*@eZQ>cGea7WQtR5m?hCq z+ZdF@KW%)LL_lra=#PO^<7mo0b?tU4%QR$)Q||I+pXuYEL~*(R;v+nFv8H`nLF`_X ziVfD(e#euKw!B$ahO`jHL0!I1m*P}524#vUUN6I>~I1 zyPY0mErzceVv1xws4L%)DNZ%`XPt`Ekk=TlI5kRAr!CzttL(><^4j>aWz?453aAV2 zV+Yua;zPL~>=&pL4oXEreJ1W!>TY0;{%7nWYn2P1@a>!MCTDouD85DR!W@gEdP?sS zYKv}dX&80ZmS$~fJmnwfGu5M|8HtY5{#vA+Z)I(1y`QRmru+BnT??1^X@9MHeokj? zsqg2;jhW18zmA_d9hYJAA1!m*uXSZk&(FfRXUv@TYoVFbaTzxM(N>ewbxoc`Wpj*` zrjv4a&}sJu4b1@Ri2ZqOTW#?cYN5M8eSnp*6!Y*pVt>}sMC|S*%u$dYv7eK+A=YJM zKjUaaduRcaHHhN;9b~BZZK}r16#%DdHlRX-lPcmc&6_ zIg(6UdVm$9L#!KdN7M8(D_$erH%~DuN7R*`;L{o~OX8p|Zb-GI>HV`#ZE47B4Aque zC23V#`lk4TU7P+`{0hb6yW(%fFHk$4;rBP-`@c@gcat|SqvrJXHPW1h+M-)?8b92e=)i=E7BlVkR*Mt`qzwy^vCwi3jCPTGd}7<&`$K{3R=Zqu{E z&p6r;&sA-dvBHlh`Vse68f{E8ujyIQueZ^LSW;!IVoq;kNsUq0$m2-sujOisdXl)O z4YMTj+4?hI)3aHoIXyzGzJ<8A1tqWs%*z-3c(0%SF=+Nt+(Ui&NQIpx5pWM#(E;+$ z10|RxF;E-k<%@!{{Y+ni7boT3bJOaBWErSLbGm^n-#ya%I*I0#d-HDN`4V#z4gOi8 zIi+T7fhTRP1G8ifs4Ekd?Pq!d`&ve8;IkwS+B>B4RRd;89ArLc9~v-A;vjjk2ODo; zy-NdTNgOks?y!R)U^+B`4orI%GU3ks+ht6KSW-{4ah$K|eTAf&s0*>A zmS}7Fd`)j-j~K0@9QMmQf;$8iMCW*7Anz}YV&ov_A`~m z6q&YES1zh+KU1llmoE;=_A{k^@DNWvH2CNKIB2f?=1!XjD(0`uCHi9bhO&G^rY+Sl zx6-LC4S9{>+ES|}t?ElZ7VnF5-0gkJ@n|@^jQY~OYosp?wMDnSG>kgyOS8T-o>GeQ z-RjY%^@r`1xQFn?j6rL~zo5cakMnjup7o{meyaAF?%%I>JzV0a{q^ekIi2;TzMmU6 zW-_P!dPe4ST!zhmw9IK=?U6Y>KMUiYF>~7217%LfW!U^jTTM>am4q^-%{*1n&GJH@KlXoQE)yDp){sQ;-D@* z%k-tX{Dv-lsf-&^eW|9{Ez_6kii5iJrBZJ6$3e#n9W&Pj_66?GpS5wLKMrm{Tgsg7 z2-j0jt1p#uqdyLAeBCFV`=zI!4a)STy0{_Lm%4G7%Fa6Vr6D#C*Oyu?sneG}!=45Q z#o2_+wpq~fsY{8xT?cl*I4v%U53t(-c7uI_pKoEuy3ckQ^bP#y&rprM#%K7sPx$st z>?m=D$Bp7!T>rTNH5v2U>3AP*i)M9c7iy=(^H-bf`dwDyWhLHKEs$m;I!^mlxXfu< zV4M~%?GdhXHC*PW{nhIEIi1y|amPUBv|q{3oQ}(|`Hz-4?N_@pr{`y3+%slQ`>Vj2 z({UL#|It>H({<&ezw(hzXA_Qp`#EVB zVj@p(V?X0)Lp)DyU&>=Yo-`59r7o2smedrXnwZv8T&hXi}HT?c5*v=2EuFF%OA-I(&wv-AmE9FWSVu zr2W258|MBfNS?Vz`nWCIz4Rq8zl4T~@i0AR+OVG+x?;B`b*a?XX;PQUF-zj08-W^f zXHDu-xt;stpi{L?t1gve9ufz2#&JD?Y(B>OD z?5s&$+HGfz>e4Xcq3TkrBz4--UrWW~0hEtZW=m#8c^TEEo7YHP8fuGfb!iy2Q{wqq zw#}Ndx^!9fc-OmfDB-kUh0C0#1+uzyj0L8R@$J`PRQKccSF7jebXJ$f9Yxts`>Qya z({UL#|Isq1eXU34^!zN0d&bOZe-$`$IxfTJKiXsv2G1 zLZ&X&hPglTQ4yjkj>z^dQWa8(_^L$`{SUl*`F?Tsm#~O)TO$7oow$?Hv%=}&brj4Qf^4%;9OT(NHI&|pspNA zrY_w^R>%EIsn*ospZnvW$wR3yM@$$U^3H)QHk4gOiDx-{f9hN?@QmelA=hp>4c zcWwTJ`!*k!8O?few_LCOQ2w=m>SrB$c%EQC&tdy-`bT|G{0^n-NqHWwBf9_d$TzUd zr++5D4G-|$->^66d3l#9)zg|2m9u$v@U&^DoW4TP3 z*uMGtsecsri$}#%ywkKv_gSuf4&NI4#m~h@ck zX{k+{$9h~IhkbN`=gZz6V!OV_9mBb2>^aVUgm3%}fB%Nx&vA^?vbWdD|9!yk=lK5` zc9gwn`OY5pjcsOA5{xgr^OIH7OrIb&d@5d*)^)sSt~Xb+xtItZf#VlwG4~)o1DfOF zuQj{W=O7jZwYL^+*Kd2m&rR2&$FT9=23dErF|M!PzfX&MgU%h(4w8PP=5oE*DOtUR zpWOMLeazoBk+X0P%JE~z(9hU&nO<=XUf~q1d5zyL@Xkj(PVxRL{MF}2Uce^YxA~&{ zrt!^=Lyloh|Jv+_`jKA1Q++6Rg{G(Bbq{82_npJG?jAOC&MA*LO^fs&o%XM`v&oaI_Qu$Azd)4vz3e}F zVcIvPC7Nicfpt8f_SNzrZJ)Iveg2iZ%Y*qL#w%lx$>j9e^he<1xM$S9DBi$Fya!t! z!PoF=mF2@*^~Cg;`)JVtM%_nbs`T=o)Q!Ks9+0(Yz4+gVZ=9Xq$LqZ^=6#EMqTB)V z?%;j^%)V~niqLQI*8-opjo-{%egl8s#V0q)=N|s|e@YwKT!`}m6Tzw(l8tG6?T?P} zy(q2n6MFX%@V>Zg`+Z>9Mt=VQuU&25?QMHFTG+VCG4m44`h?NVxO(x`i^j0V8t(t_ z4DITQYBs{2VWhq)N9(ka0^?d;4?6eaxDfx$~YDPtm6L`28E$;lzufH_LZ; zcMMuPhQ<4AJ?(7I_NC31`p`TD@7@jaWM)?Rx%7o6u;};^$!l{N**<{zj1^x7;i=EV zW8irX49wTv%&&Vq#9)mX6W! zhjJeC8SFeqW~0GIzW@n2N)LBlt{^cp(P1rOV)=E~z#BhvTiwBLG}X>&D}V}$P*bg5C@N53B-qS)18 z!$&>XE-+H;xN%l{2h^!8$K2}xz3Nb*=Q>=AGNad_(_phFWzKx|)%!VgPhib= z<;Y0uPwJkqIvO}Drf+0EdV<$OSeV)W2aM^Lcs;^@$p+%*lWX+t>v#MtkM*HE!YPi# zbpozGe!+MA^+&Tp$F;e-|69Y1ZYN6qD~qV6EmUb+v_8bG7^&Eq!$9`6cb-I*F;m%;6Jui|;Vr9w@h~QJbuWXK-yD?-}B(xJ~Er zZCl5AhTU@Qa=uL9DzVMBbXhzDR~6SV6I#QH9OJZ|i>x6VJ3vPA2LI8TPZ0YyaQ^~? z*FU3ZYwh**9L?5_^Bp_LDVB%FW4(t&RnWiQ8$TX2dzGV?>q=wi0n5|3rp2*F?)15% zt;lGOyB1@-D4>;3W)AJQHx`@bs7zS>(vUTSdV9x30`7vmrFtGzZ|!xB1#L`@6%CfD zf0r#D{0$LXb1WdfRfz-DwvLYhSJedjE6~jH`l@!r=hm*RPR;9-rmOmmY3cR$ z{jNu2`Tb>Ka9p2n>q_^rzIzwCk{^mcwbX^`6+mA1K@|TJudF-0!y5J}D*Mz-J571N zpMQ!~Bd!yD#C0_L81>YA9O5YES`X^HKA-~h2**FdTKOlekDEHTTOqgEj#25eLPQsn)wA!5?(9^CgsNK^lIhNRAC<7~YozM+LR!!0Ls$!Cb&;+30DH3Pz*Rf; zQ@yWvT^O$#a{4agrH#^SAGUmkdG}9c9qtDlgDZXSVfAwymC=*+x!3sqN1W$Rs2zNV z3LdX-JI5zaaOK2ju!U$|7yk=?5yvZh#=c91h&kd-eE&6`O>15a;XSbJ5ZvHZPQ)4F z(KldTyK>MVaa@XngZ8=yOTBaU*7WJq-jIt4FVbF&=FPSNVytqq}n7CYCAi`^adMGHz|?`l`Qf5x>c zbbj*l0<5=M|0iHAd$|kOpYe&e_!e1v6Me<;eFM7W9b_w9y^M{t9eZ^|89uaK1KQ88 zu0Cp>neWt<&29XwM~dm~(Zrbom9g~?h!_vSBBL%Rj(K{j?d&>wD};<0NY!gK{lU~c z;`MsGZr6IJC;_CuZ}H!ztyjkVXct6wDNvz^YvXA zgO2{|#;3Ip=UkU*x6r#Q<)mSiJk`p_i2nx-Mf*Q+)c~3MGghN`9l!yUR`IpCU9B9- z0xhlduiD_K4{6oSUW;7MaaY$gulpEl_jW`^Jrq;D&U>TxU*8bEdZ2CZ{|A`eb8pWt zlmDE*OzofY-6+fPO;n< zmiJm>4NvAVL%kP96W?;&O>KJY=bhxo;HO6mUl$U}#ho{_-(ADiiuJ2XrbHFr zj@+d(7Gi_0d2PlJYqlR_dW7*U%X<&U!fmeu==T6sUaytciBjRs8T=Y@Y33(W@wJXI zwmr>#k;mAxdv?}uS@-=lZ=OjnYi62LAUzGldhzN zvQBFQr}CDt%(Rdhy3@2CtXWH1gN!vPK|JZajPTH@&g31}nI8W;z(XPqHpWAJ< z-ixbESsC(dR)ODdGyBQ7D-QOkQ+fWeGmEg^z29Q)yJjZAiif+RV9e-rM>f&CdfX{I z-8Oa%8#gBE8tbYqzuVu{zqf|f5v%AQW54=Q-7%-J-Pn0U9j(>I53`&3Ry>{V%aiu{Aot;*nHTx zsMTWk+mN3$YbZ|95N~wQiVjPBCXUUIt9G->-~PDk*9f?0B-iuoewuC<%l6$EL%C8I zO?=CZ&5Ns8!!rbq7TVM82Wl(EX7#>$l&NMK)pK+sjc?_#EBaOJzUsA~r_FD~@{Y|T zPvaNIX4h5wxj9+C<=khd^NsEt22X7E?TpT;+tq$n8QVRwnNzxmvUaIXw7S|cJnTai z-;QJR#dgF-4Rk${ciVl2cQ{WsIhH*$?-%tG^Z;znKTyGXj=z4u-)tk_<&mD_efOCsINS5m z3fzs|*wx2>6CQw%#bryr$LEK&H}I5Pw^>7Pvu1KpGUg2L875M#BxBAG=!>UdtCTaL{}U zd7HS)_|@7oo?G|J%wgQv*o0mn75*p4xSrx}Ee|k0#`9`>L_1vMW~6>sa*XxXdgNxc z`WWvqjx!fL#*ZnEwmid(;SNwrVn7(7jm%TM@vL4Xj9AaX=BK5# snN5$I-7LP&hlkFF$8(!LoxFKowqblr#>~@(%x$MESjMdX57T~in*aa+ literal 0 HcmV?d00001 From d94aa6cafdee5a123d5a25cea9ad4d9c0a2144e1 Mon Sep 17 00:00:00 2001 From: Michael Martin Date: Sun, 2 May 2010 11:34:13 +0000 Subject: [PATCH 107/131] [win32k] - IntMouseInput: Add the state of virtual keys to wParam before calling MsqInsertSystemMessage. Fixes bug #5066. - Add and Remove MK_XBUTTON1/2 flags to CurInfo->ButtonsDown vice XBUTTON1/2. - Code based on patches in bug #5066. svn path=/trunk/; revision=47080 --- reactos/subsystems/win32/win32k/ntuser/input.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/reactos/subsystems/win32/win32k/ntuser/input.c b/reactos/subsystems/win32/win32k/ntuser/input.c index f51395ee607..e86d14a33bc 100644 --- a/reactos/subsystems/win32/win32k/ntuser/input.c +++ b/reactos/subsystems/win32/win32k/ntuser/input.c @@ -1111,7 +1111,7 @@ IntMouseInput(MOUSEINPUT *mi) /* * Insert the messages into the system queue */ - Msg.wParam = CurInfo->ButtonsDown; + Msg.wParam = 0; Msg.lParam = MAKELPARAM(MousePos.x, MousePos.y); Msg.pt = MousePos; @@ -1134,6 +1134,7 @@ IntMouseInput(MOUSEINPUT *mi) gQueueKeyStateTable[VK_LBUTTON] |= 0xc0; Msg.message = SwapBtnMsg[0][SwapButtons]; CurInfo->ButtonsDown |= SwapBtn[SwapButtons]; + Msg.wParam |= CurInfo->ButtonsDown; MsqInsertSystemMessage(&Msg); } else if(mi->dwFlags & MOUSEEVENTF_LEFTUP) @@ -1141,6 +1142,7 @@ IntMouseInput(MOUSEINPUT *mi) gQueueKeyStateTable[VK_LBUTTON] &= ~0x80; Msg.message = SwapBtnMsg[1][SwapButtons]; CurInfo->ButtonsDown &= ~SwapBtn[SwapButtons]; + Msg.wParam |= CurInfo->ButtonsDown; MsqInsertSystemMessage(&Msg); } if(mi->dwFlags & MOUSEEVENTF_MIDDLEDOWN) @@ -1148,6 +1150,7 @@ IntMouseInput(MOUSEINPUT *mi) gQueueKeyStateTable[VK_MBUTTON] |= 0xc0; Msg.message = WM_MBUTTONDOWN; CurInfo->ButtonsDown |= MK_MBUTTON; + Msg.wParam |= CurInfo->ButtonsDown; MsqInsertSystemMessage(&Msg); } else if(mi->dwFlags & MOUSEEVENTF_MIDDLEUP) @@ -1155,6 +1158,7 @@ IntMouseInput(MOUSEINPUT *mi) gQueueKeyStateTable[VK_MBUTTON] &= ~0x80; Msg.message = WM_MBUTTONUP; CurInfo->ButtonsDown &= ~MK_MBUTTON; + Msg.wParam |= CurInfo->ButtonsDown; MsqInsertSystemMessage(&Msg); } if(mi->dwFlags & MOUSEEVENTF_RIGHTDOWN) @@ -1162,6 +1166,7 @@ IntMouseInput(MOUSEINPUT *mi) gQueueKeyStateTable[VK_RBUTTON] |= 0xc0; Msg.message = SwapBtnMsg[0][!SwapButtons]; CurInfo->ButtonsDown |= SwapBtn[!SwapButtons]; + Msg.wParam |= CurInfo->ButtonsDown; MsqInsertSystemMessage(&Msg); } else if(mi->dwFlags & MOUSEEVENTF_RIGHTUP) @@ -1169,6 +1174,7 @@ IntMouseInput(MOUSEINPUT *mi) gQueueKeyStateTable[VK_RBUTTON] &= ~0x80; Msg.message = SwapBtnMsg[1][!SwapButtons]; CurInfo->ButtonsDown &= ~SwapBtn[!SwapButtons]; + Msg.wParam |= CurInfo->ButtonsDown; MsqInsertSystemMessage(&Msg); } @@ -1185,15 +1191,15 @@ IntMouseInput(MOUSEINPUT *mi) if(mi->mouseData & XBUTTON1) { gQueueKeyStateTable[VK_XBUTTON1] |= 0xc0; + CurInfo->ButtonsDown |= MK_XBUTTON1; Msg.wParam = MAKEWPARAM(CurInfo->ButtonsDown, XBUTTON1); - CurInfo->ButtonsDown |= XBUTTON1; MsqInsertSystemMessage(&Msg); } if(mi->mouseData & XBUTTON2) { gQueueKeyStateTable[VK_XBUTTON2] |= 0xc0; + CurInfo->ButtonsDown |= MK_XBUTTON2; Msg.wParam = MAKEWPARAM(CurInfo->ButtonsDown, XBUTTON2); - CurInfo->ButtonsDown |= XBUTTON2; MsqInsertSystemMessage(&Msg); } } @@ -1203,15 +1209,15 @@ IntMouseInput(MOUSEINPUT *mi) if(mi->mouseData & XBUTTON1) { gQueueKeyStateTable[VK_XBUTTON1] &= ~0x80; + CurInfo->ButtonsDown &= ~MK_XBUTTON1; Msg.wParam = MAKEWPARAM(CurInfo->ButtonsDown, XBUTTON1); - CurInfo->ButtonsDown &= ~XBUTTON1; MsqInsertSystemMessage(&Msg); } if(mi->mouseData & XBUTTON2) { gQueueKeyStateTable[VK_XBUTTON2] &= ~0x80; + CurInfo->ButtonsDown &= ~MK_XBUTTON2; Msg.wParam = MAKEWPARAM(CurInfo->ButtonsDown, XBUTTON2); - CurInfo->ButtonsDown &= ~XBUTTON2; MsqInsertSystemMessage(&Msg); } } From 2b896af1284cc480673f499d4f9b755f8c071594 Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Sun, 2 May 2010 11:47:19 +0000 Subject: [PATCH 108/131] Gabriel Ilardi: - Update spanish %temp% path, part of bug 2482. svn path=/trunk/; revision=47081 --- reactos/boot/bootdata/hivedef_i386.inf | Bin 314598 -> 314636 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/reactos/boot/bootdata/hivedef_i386.inf b/reactos/boot/bootdata/hivedef_i386.inf index 33d3a0a09fd5f587ec5563f5779360935f8abce7..905f5ef3daff1b1d91a02000819e52a8f03b898b 100644 GIT binary patch delta 78 zcmaDhQ@CfAa6=1Y3sVd878ZvC(-rozNH981XFSMauIkK?&ydHE#*oR7&QQuw#E{64 e3}k->iYYMo0OgW_B019&53*=(-*JFNj|Tvt9~Mdg delta 37 tcmeB~CH!ora6=1Y3sVd878ZvC)ANqANH7~PI8N_8&Jw--&H)w!9smwf4a)!k From 91e196a64f92334e9db3a82f52130b34cf56f90a Mon Sep 17 00:00:00 2001 From: Michael Martin Date: Sun, 2 May 2010 16:40:05 +0000 Subject: [PATCH 109/131] [win32k] - co_UserDestroyWindow: ThreadInfo->pDeskInfo->hShell holds the hWnd of the Shells Desktop Window. Set it to NULL if that windows is being destroyed. Fixes bug #4902. svn path=/trunk/; revision=47082 --- reactos/subsystems/win32/win32k/ntuser/window.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/reactos/subsystems/win32/win32k/ntuser/window.c b/reactos/subsystems/win32/win32k/ntuser/window.c index 822c8c55285..f22c6dce047 100644 --- a/reactos/subsystems/win32/win32k/ntuser/window.c +++ b/reactos/subsystems/win32/win32k/ntuser/window.c @@ -2619,6 +2619,7 @@ BOOLEAN FASTCALL co_UserDestroyWindow(PWINDOW_OBJECT Window) BOOLEAN isChild; PWND Wnd; HWND hWnd; + PTHREADINFO ti; ASSERT_REFS_CO(Window); // FIXME: temp hack? @@ -2662,6 +2663,21 @@ BOOLEAN FASTCALL co_UserDestroyWindow(PWINDOW_OBJECT Window) if (Window->pti->MessageQueue->CaptureWindow == Window->hSelf) Window->pti->MessageQueue->CaptureWindow = NULL; + /* + * Check if this window is the Shell's Desktop Window. If so set hShellWindow to NULL + */ + + ti = PsGetCurrentThreadWin32Thread(); + + if ((ti != NULL) & (ti->pDeskInfo != NULL)) + { + if (ti->pDeskInfo->hShellWindow == hWnd) + { + DPRINT1("Destroying the ShellWindow!\n"); + ti->pDeskInfo->hShellWindow = NULL; + } + } + IntDereferenceMessageQueue(Window->pti->MessageQueue); IntEngWindowChanged(Window, WOC_DELETE); From dc3a34f70bcda28effae841f054af16bc7a3b642 Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Sun, 2 May 2010 19:19:28 +0000 Subject: [PATCH 110/131] [SETUPAPI] - Store device settings in the "Device Parameters" key, as the kernel now does it too - Fixes display of AC97 device in audio cpl svn path=/trunk/; revision=47084 --- reactos/dll/win32/setupapi/interface.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/reactos/dll/win32/setupapi/interface.c b/reactos/dll/win32/setupapi/interface.c index 1d207097d00..e7556cec75f 100644 --- a/reactos/dll/win32/setupapi/interface.c +++ b/reactos/dll/win32/setupapi/interface.c @@ -399,7 +399,13 @@ InstallOneInterface( HeapFree(GetProcessHeap(), 0, Path); } - return SetupInstallFromInfSectionW(NULL, /* FIXME */ hInf, InterfaceSection, SPINST_REGISTRY, hKey, NULL, 0, NULL, NULL, NULL, NULL); + if (RegCreateKeyExW(hKey, L"Device Parameters", 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hRefKey, NULL) != ERROR_SUCCESS) + { + RegCloseKey(hKey); + return FALSE; + } + + return SetupInstallFromInfSectionW(NULL, /* FIXME */ hInf, InterfaceSection, SPINST_REGISTRY, hRefKey, NULL, 0, NULL, NULL, NULL, NULL); } /*********************************************************************** From 31c846d674a63fff004082e0787fb9f32d00bc83 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sun, 2 May 2010 21:04:47 +0000 Subject: [PATCH 111/131] [VGA] - Return SPS_ACCEPT_NOEXCLUDE from DrvSetPointerShape because we completed the requested operation successfully - Patch by Daniel Zimmermann - Fixes bug 4347 svn path=/trunk/; revision=47087 --- reactos/drivers/video/displays/vga/objects/pointer.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/drivers/video/displays/vga/objects/pointer.c b/reactos/drivers/video/displays/vga/objects/pointer.c index 698f8790fe0..c0d365bb9a4 100644 --- a/reactos/drivers/video/displays/vga/objects/pointer.c +++ b/reactos/drivers/video/displays/vga/objects/pointer.c @@ -272,7 +272,7 @@ DrvSetPointerShape( VGADDI_ShowCursor(ppdev, prcl); } - return SPS_ACCEPT_EXCLUDE; + return SPS_ACCEPT_NOEXCLUDE; } static VOID FASTCALL From 567bf0c1881584c4bed64e35705506602e74fbe6 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Sun, 2 May 2010 23:26:06 +0000 Subject: [PATCH 112/131] [NTDLL] The harderror message for STATUS_DLL_NOT_FOUND expects an ANSI dll name. svn path=/trunk/; revision=47088 --- reactos/dll/ntdll/ldr/utils.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/dll/ntdll/ldr/utils.c b/reactos/dll/ntdll/ldr/utils.c index 9dcb99960ef..14512194832 100644 --- a/reactos/dll/ntdll/ldr/utils.c +++ b/reactos/dll/ntdll/ldr/utils.c @@ -1518,7 +1518,7 @@ LdrpGetOrLoadModule(PWCHAR SearchPath, if (!NT_SUCCESS(Status)) { ULONG ErrorResponse; - ULONG_PTR ErrorParameter = (ULONG_PTR)&DllName; + ULONG_PTR ErrorParameter = (ULONG_PTR)&AnsiDllName; DPRINT1("failed to load %wZ\n", &DllName); From 2fce2d1d8f72a8d8b3bdf4c59bea73b3c23c0af8 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Mon, 3 May 2010 00:06:31 +0000 Subject: [PATCH 113/131] [NETCFGX] - Remove the hack that set DI_NEEDRESTART for all network adapters which prevented us from starting the miniport driver - Part of the fix for bug 3716 svn path=/trunk/; revision=47089 --- reactos/dll/win32/netcfgx/netcfgx.c | 26 -------------------------- 1 file changed, 26 deletions(-) diff --git a/reactos/dll/win32/netcfgx/netcfgx.c b/reactos/dll/win32/netcfgx/netcfgx.c index c9d8a4520d8..ba89dff123a 100644 --- a/reactos/dll/win32/netcfgx/netcfgx.c +++ b/reactos/dll/win32/netcfgx/netcfgx.c @@ -325,7 +325,6 @@ InstallNetDevice( HKEY hLinkageKey = NULL; HKEY hConnectionKey = NULL; DWORD dwShowIcon, dwLength; - SP_DEVINSTALL_PARAMS_W installParams; /* Get Instance ID */ if (SetupDiGetDeviceInstanceIdW(DeviceInfoSet, DeviceInfoData, NULL, 0, &dwLength)) @@ -550,31 +549,6 @@ InstallNetDevice( goto cleanup; } - /* HACK: hpoussin, Dec 2005. TCP/IP driver is not able to manage devices - * which are installed after its startup. So, we have to reboot to take - * this new netcard into account. - */ - /* Should we reboot? */ - installParams.cbSize = sizeof(SP_DEVINSTALL_PARAMS_W); - if (!SetupDiGetDeviceInstallParamsW( - DeviceInfoSet, - DeviceInfoData, - &installParams)) - { - rc = GetLastError(); - DPRINT("SetupDiGetDeviceInstallParams() failed with error 0x%lx\n", rc); - goto cleanup; - } - installParams.Flags |= DI_NEEDRESTART; - if (!SetupDiSetDeviceInstallParamsW( - DeviceInfoSet, - DeviceInfoData, - &installParams)) - { - rc = GetLastError(); - DPRINT("SetupDiSetDeviceInstallParams() failed with error 0x%lx\n", rc); - goto cleanup; - } rc = ERROR_SUCCESS; cleanup: From c55eb25c0687e316af724faa96add97506d18205 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Mon, 3 May 2010 00:28:29 +0000 Subject: [PATCH 114/131] [NDIS] - Provide a IRP_MJ_CREATE and IRP_MJ_CLOSE handler for miniport drivers so IoGetDeviceObjectPointer doesn't fail (and consequently, IoSetDeviceInterfaceState) svn path=/trunk/; revision=47090 --- reactos/drivers/network/ndis/ndis/miniport.c | 24 ++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/reactos/drivers/network/ndis/ndis/miniport.c b/reactos/drivers/network/ndis/ndis/miniport.c index 2a9934c355e..f3347a059e0 100644 --- a/reactos/drivers/network/ndis/ndis/miniport.c +++ b/reactos/drivers/network/ndis/ndis/miniport.c @@ -1722,6 +1722,22 @@ NdisIForwardIrpAndWait(PLOGICAL_ADAPTER Adapter, PIRP Irp) return Status; } +NTSTATUS +NTAPI +NdisICreateClose( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp) +{ + Irp->IoStatus.Status = STATUS_SUCCESS; + Irp->IoStatus.Information = 0; + + DbgPrint("NdisICreateClose\n"); + + IoCompleteRequest(Irp, IO_NO_INCREMENT); + + return STATUS_SUCCESS; +} + NTSTATUS NTAPI @@ -2499,6 +2515,8 @@ NdisMRegisterMiniport( *MiniportPtr = Miniport; + Miniport->DriverObject->MajorFunction[IRP_MJ_CREATE] = NdisICreateClose; + Miniport->DriverObject->MajorFunction[IRP_MJ_CLOSE] = NdisICreateClose; Miniport->DriverObject->MajorFunction[IRP_MJ_PNP] = NdisIDispatchPnp; Miniport->DriverObject->MajorFunction[IRP_MJ_SHUTDOWN] = NdisIShutdown; Miniport->DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = NdisIDeviceIoControl; @@ -2960,6 +2978,12 @@ NdisMRegisterDevice( DriverBlock->DriverObject->MajorFunction[IRP_MJ_PNP] = NdisIDispatchPnp; + if (!DriverBlock->DriverObject->MajorFunction[IRP_MJ_CREATE]) + DriverBlock->DriverObject->MajorFunction[IRP_MJ_CREATE] = NdisICreateClose; + + if (!DriverBlock->DriverObject->MajorFunction[IRP_MJ_CLOSE]) + DriverBlock->DriverObject->MajorFunction[IRP_MJ_CLOSE] = NdisICreateClose; + DeviceBlock->DeviceObject = DeviceObject; DeviceBlock->SymbolicName = SymbolicName; From 66482fa4f3ff3f6933129358d8e83eb35bd6aa4c Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Mon, 3 May 2010 00:30:49 +0000 Subject: [PATCH 115/131] - Remove a forgotten debug print svn path=/trunk/; revision=47091 --- reactos/drivers/network/ndis/ndis/miniport.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/reactos/drivers/network/ndis/ndis/miniport.c b/reactos/drivers/network/ndis/ndis/miniport.c index f3347a059e0..daaf7cac1b1 100644 --- a/reactos/drivers/network/ndis/ndis/miniport.c +++ b/reactos/drivers/network/ndis/ndis/miniport.c @@ -1731,8 +1731,6 @@ NdisICreateClose( Irp->IoStatus.Status = STATUS_SUCCESS; Irp->IoStatus.Information = 0; - DbgPrint("NdisICreateClose\n"); - IoCompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_SUCCESS; From 4b714650f46f10b96de2fd15b8c47d3d7a24c79f Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Mon, 3 May 2010 19:26:12 +0000 Subject: [PATCH 116/131] [SHELL32] - Show icons / folders from AllUsers\Desktop directory - Fixes bug 4289 svn path=/trunk/; revision=47097 --- reactos/dll/win32/shell32/shfldr_desktop.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/reactos/dll/win32/shell32/shfldr_desktop.c b/reactos/dll/win32/shell32/shfldr_desktop.c index db810ba87c7..cdcae285023 100644 --- a/reactos/dll/win32/shell32/shfldr_desktop.c +++ b/reactos/dll/win32/shell32/shfldr_desktop.c @@ -387,6 +387,9 @@ static BOOL CreateDesktopEnumList(IEnumIDList *list, DWORD dwFlags) ret = ret && SHGetSpecialFolderPathW(0, szPath, CSIDL_DESKTOPDIRECTORY, FALSE); ret = ret && CreateFolderEnumList(list, szPath, dwFlags); + ret = ret && SHGetSpecialFolderPathW(0, szPath, CSIDL_COMMON_DESKTOPDIRECTORY, FALSE); + ret = ret && CreateFolderEnumList(list, szPath, dwFlags); + return ret; } @@ -739,6 +742,22 @@ static HRESULT WINAPI ISF_Desktop_fnGetDisplayNameOf (IShellFolder2 * iface, _ILSimpleGetTextW(pidl, pszPath + cLen, MAX_PATH - cLen); if (!_ILIsFolder(pidl)) SHELL_FS_ProcessDisplayFilename(pszPath, dwFlags); + + if (GetFileAttributes(pszPath) == INVALID_FILE_ATTRIBUTES) + { + /* file system folder or file rooted at the AllUsers desktop */ + if ((GET_SHGDN_FOR(dwFlags) == SHGDN_FORPARSING) && + (GET_SHGDN_RELATION(dwFlags) != SHGDN_INFOLDER)) + { + SHGetSpecialFolderPathW(0, pszPath, CSIDL_COMMON_DESKTOPDIRECTORY, FALSE); + PathAddBackslashW(pszPath); + cLen = wcslen(pszPath); + } + + _ILSimpleGetTextW(pidl, pszPath + cLen, MAX_PATH - cLen); + if (!_ILIsFolder(pidl)) + SHELL_FS_ProcessDisplayFilename(pszPath, dwFlags); + } } } else From c751f4300a7a22f813e48bbead6db8ef97e9e70a Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Mon, 3 May 2010 22:03:15 +0000 Subject: [PATCH 117/131] [NTOSKRNL] - Fix a typo that results in ISRs being called at an unsafe IRQL (Interrupt->Irql instead of Interrupt->SynchronizeIrql) in certain situations (when Interrupt->Irql < Interrupt->SynchronizeIrql) that can result in ISR synchronization issues svn path=/trunk/; revision=47098 --- reactos/ntoskrnl/ke/i386/irqobj.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/ntoskrnl/ke/i386/irqobj.c b/reactos/ntoskrnl/ke/i386/irqobj.c index 10170134d82..fca5bdc4cc5 100644 --- a/reactos/ntoskrnl/ke/i386/irqobj.c +++ b/reactos/ntoskrnl/ke/i386/irqobj.c @@ -251,7 +251,7 @@ KiChainedDispatch(IN PKTRAP_FRAME TrapFrame, if (Interrupt->SynchronizeIrql > Interrupt->Irql) { /* Raise to higher IRQL */ - OldIrql = KfRaiseIrql(Interrupt->Irql); + OldIrql = KfRaiseIrql(Interrupt->SynchronizeIrql); } /* Acquire interrupt lock */ From dbfa8cfb5455ce2727b85bdf50964107e67d4611 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Mon, 3 May 2010 22:15:53 +0000 Subject: [PATCH 118/131] [SETUP] - Don't call InitializeProfiles() twice. This is one part of the fix for bug 2972. Patch by Gabriel Ilardi. svn path=/trunk/; revision=47099 --- reactos/base/setup/setup/setup.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/reactos/base/setup/setup/setup.c b/reactos/base/setup/setup/setup.c index 8f9db9b6278..4db7fc46a92 100644 --- a/reactos/base/setup/setup/setup.c +++ b/reactos/base/setup/setup/setup.c @@ -60,9 +60,6 @@ RunNewSetup (HINSTANCE hInstance) HMODULE hDll; PINSTALL_REACTOS InstallReactOS; - /* some dlls (loaded by syssetup) need a valid user profile */ - InitializeProfiles(); - hDll = LoadLibrary (TEXT("syssetup")); if (hDll == NULL) { From 950bbde105850dc0ffebfa1dc3feadb90986323a Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Tue, 4 May 2010 08:28:42 +0000 Subject: [PATCH 119/131] [SHELL32] - Use target path when there is no icon path specified svn path=/trunk/; revision=47100 --- reactos/dll/win32/shell32/shelllink.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/reactos/dll/win32/shell32/shelllink.c b/reactos/dll/win32/shell32/shelllink.c index 2d9ef1c20ee..b2dd1cb6ff8 100644 --- a/reactos/dll/win32/shell32/shelllink.c +++ b/reactos/dll/win32/shell32/shelllink.c @@ -2672,6 +2672,9 @@ SH_ShellLinkDlgProc( case 14021: if (This->sIcoPath) wcscpy(szBuffer, This->sIcoPath); + else + wcscpy(szBuffer, This->sPath); + IconIndex = This->iIcoNdx; if (PickIconDlg(hwndDlg, szBuffer, MAX_PATH, &IconIndex)) { From 79121ecceaa3b9763596772e7140b89272b11681 Mon Sep 17 00:00:00 2001 From: Jeffrey Morlan Date: Tue, 4 May 2010 23:17:30 +0000 Subject: [PATCH 120/131] [NTOSKRNL] In kdbg 'thread list', don't try to read from the kernel stack if there isn't one. (Bug 5318) svn path=/trunk/; revision=47102 --- reactos/ntoskrnl/kdbg/kdb_cli.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/reactos/ntoskrnl/kdbg/kdb_cli.c b/reactos/ntoskrnl/kdbg/kdb_cli.c index 4c469fd3721..5583ecec639 100644 --- a/reactos/ntoskrnl/kdbg/kdb_cli.c +++ b/reactos/ntoskrnl/kdbg/kdb_cli.c @@ -1223,7 +1223,13 @@ KdbpCmdThread( str2 = ""; } - if (Thread->Tcb.TrapFrame) + if (!Thread->Tcb.InitialStack) + { + /* Thread has no kernel stack (probably terminated) */ + Esp = Ebp = NULL; + Eip = 0; + } + else if (Thread->Tcb.TrapFrame) { if (Thread->Tcb.TrapFrame->PreviousPreviousMode == KernelMode) Esp = (PULONG)Thread->Tcb.TrapFrame->TempEsp; From e3ce00b76bb7bd23aa722975f059a2b1299b67c8 Mon Sep 17 00:00:00 2001 From: Giannis Adamopoulos Date: Wed, 5 May 2010 10:08:23 +0000 Subject: [PATCH 121/131] [win32k] -Fix sending WM_KILLFOCUS when we give focus to a window of a different thread Fixes bugs 1546 and 1603 svn path=/trunk/; revision=47103 --- reactos/subsystems/win32/win32k/ntuser/focus.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/reactos/subsystems/win32/win32k/ntuser/focus.c b/reactos/subsystems/win32/win32k/ntuser/focus.c index 90702b41c00..9e309ac7dcd 100644 --- a/reactos/subsystems/win32/win32k/ntuser/focus.c +++ b/reactos/subsystems/win32/win32k/ntuser/focus.c @@ -227,6 +227,7 @@ co_IntSetForegroundAndFocusWindow(PWINDOW_OBJECT Window, PWINDOW_OBJECT FocusWin if (PrevForegroundQueue != 0) { hWndPrev = PrevForegroundQueue->ActiveWindow; + hWndFocusPrev = PrevForegroundQueue->FocusWindow; } if (hWndPrev == hWnd) @@ -235,9 +236,6 @@ co_IntSetForegroundAndFocusWindow(PWINDOW_OBJECT Window, PWINDOW_OBJECT FocusWin return TRUE; } - hWndFocusPrev = (PrevForegroundQueue == FocusWindow->pti->MessageQueue - ? FocusWindow->pti->MessageQueue->FocusWindow : NULL); - /* FIXME: Call hooks. */ co_IntSendDeactivateMessages(hWndPrev, hWnd); From 4b382e58467fdd3cf44d281b1d7721e056a8871e Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Wed, 5 May 2010 18:54:36 +0000 Subject: [PATCH 122/131] [FONTVIEW] - Katayama Hirofumi: Redraw the window when string is set. See issue #5357 for more details. svn path=/trunk/; revision=47104 --- reactos/base/applications/fontview/display.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/base/applications/fontview/display.c b/reactos/base/applications/fontview/display.c index 7de217d7cbe..1362e4a822a 100644 --- a/reactos/base/applications/fontview/display.c +++ b/reactos/base/applications/fontview/display.c @@ -204,7 +204,7 @@ Display_SetString(HWND hwnd, LPARAM lParam) pData = (DISPLAYDATA*)GetWindowLongPtr(hwnd, GWLP_USERDATA); _snwprintf(pData->szString, MAX_STRING, (WCHAR*)lParam); - // FIXME: redraw the window + InvalidateRect(hwnd, NULL, TRUE); return 0; } From 751c365e6e9dfad8624ab0eca279bfe9df7b5937 Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Wed, 5 May 2010 19:00:13 +0000 Subject: [PATCH 123/131] [MSTSC] - Katayama Hirofumi: Remove temporary tchar.h inclusion and usage of _tcslen (replaced with lstrlen). See issue #5360 for more details. svn path=/trunk/; revision=47105 --- reactos/base/applications/mstsc/win32.c | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/reactos/base/applications/mstsc/win32.c b/reactos/base/applications/mstsc/win32.c index 56390e09621..c7c4e63361b 100644 --- a/reactos/base/applications/mstsc/win32.c +++ b/reactos/base/applications/mstsc/win32.c @@ -21,13 +21,6 @@ #include /* winsock2.h first */ #include -//FIXME: remove eventually -#ifndef _UNICODE -#define _UNICODE -#endif -#include - - extern char g_username[]; extern char g_hostname[]; extern char g_servername[]; @@ -89,7 +82,7 @@ uni_to_str(char * sizex, TCHAR * size1) int len; int i; - len = _tcslen(size1); + len = lstrlen(size1); for (i = 0; i < len; i++) { sizex[i] = (char)size1[i]; From 51e6829b672e4a8f69a42f4b980b63fe5414ce6f Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Wed, 5 May 2010 22:30:14 +0000 Subject: [PATCH 124/131] [USERENV] - Create 'Default User' and 'All Users' directories without postfix and append a postfix only if they already exist. - Create the user account directory without a prefix and append a prefix if the directory already exists. - Acquire the restore privilege before unloading a hive and remove it after unloading the hive. Patch is based on Gabriel Ilardi's patch. Fixes bug #2972. svn path=/trunk/; revision=47106 --- reactos/dll/win32/userenv/profile.c | 60 +++++++----- reactos/dll/win32/userenv/setup.c | 146 ++++++++++++++++++---------- 2 files changed, 131 insertions(+), 75 deletions(-) diff --git a/reactos/dll/win32/userenv/profile.c b/reactos/dll/win32/userenv/profile.c index c2de4087c02..9e3f2b19114 100644 --- a/reactos/dll/win32/userenv/profile.c +++ b/reactos/dll/win32/userenv/profile.c @@ -170,10 +170,12 @@ CreateUserProfileW(PSID Sid, WCHAR szProfilesPath[MAX_PATH]; WCHAR szUserProfilePath[MAX_PATH]; WCHAR szDefaultUserPath[MAX_PATH]; + WCHAR szUserProfileName[MAX_PATH]; WCHAR szBuffer[MAX_PATH]; LPWSTR SidString; DWORD dwLength; DWORD dwDisposition; + UINT i; HKEY hKey; LONG Error; @@ -245,14 +247,11 @@ CreateUserProfileW(PSID Sid, RegCloseKey (hKey); + wcscpy(szUserProfileName, lpUserName); + wcscpy(szUserProfilePath, szProfilesPath); wcscat(szUserProfilePath, L"\\"); - wcscat(szUserProfilePath, lpUserName); - if (!AppendSystemPostfix(szUserProfilePath, MAX_PATH)) - { - DPRINT1("AppendSystemPostfix() failed\n", GetLastError()); - return FALSE; - } + wcscat(szUserProfilePath, szUserProfileName); wcscpy(szDefaultUserPath, szProfilesPath); wcscat(szDefaultUserPath, L"\\"); @@ -266,6 +265,24 @@ CreateUserProfileW(PSID Sid, DPRINT1("Error: %lu\n", GetLastError()); return FALSE; } + + for (i = 0; i < 1000; i++) + { + swprintf(szUserProfileName, L"%s.%03u", lpUserName, i); + + wcscpy(szUserProfilePath, szProfilesPath); + wcscat(szUserProfilePath, L"\\"); + wcscat(szUserProfilePath, szUserProfileName); + + if (CreateDirectoryW(szUserProfilePath, NULL)) + break; + + if (GetLastError() != ERROR_ALREADY_EXISTS) + { + DPRINT1("Error: %lu\n", GetLastError()); + return FALSE; + } + } } /* Copy default user directory */ @@ -308,14 +325,7 @@ CreateUserProfileW(PSID Sid, /* Create non-expanded user profile path */ wcscpy(szBuffer, szRawProfilesPath); wcscat(szBuffer, L"\\"); - wcscat(szBuffer, lpUserName); - if (!AppendSystemPostfix(szBuffer, MAX_PATH)) - { - DPRINT1("AppendSystemPostfix() failed\n", GetLastError()); - LocalFree((HLOCAL)SidString); - RegCloseKey (hKey); - return FALSE; - } + wcscat(szBuffer, szUserProfileName); /* Set 'ProfileImagePath' value (non-expanded) */ Error = RegSetValueExW(hKey, @@ -958,16 +968,9 @@ LoadUserProfileW(IN HANDLE hToken, } } + /* Create user hive name */ wcscat(szUserHivePath, L"\\"); wcscat(szUserHivePath, lpProfileInfo->lpUserName); - dwLength = sizeof(szUserHivePath) / sizeof(szUserHivePath[0]); - if (!AppendSystemPostfix(szUserHivePath, dwLength)) - { - DPRINT1("AppendSystemPostfix() failed\n", GetLastError()); - return FALSE; - } - - /* Create user hive name */ wcscat(szUserHivePath, L"\\ntuser.dat"); DPRINT("szUserHivePath: %S\n", szUserHivePath); @@ -1129,8 +1132,21 @@ UnloadUserProfile(HANDLE hToken, DPRINT("SidString: '%wZ'\n", &SidString); + /* Acquire restore privilege */ + if (!AcquireRemoveRestorePrivilege(TRUE)) + { + DPRINT1("AcquireRemoveRestorePrivilege() failed (Error %ld)\n", GetLastError()); + RtlFreeUnicodeString(&SidString); + return FALSE; + } + + /* Unload the hive */ Error = RegUnLoadKeyW(HKEY_USERS, SidString.Buffer); + + /* Remove restore privilege */ + AcquireRemoveRestorePrivilege(FALSE); + if (Error != ERROR_SUCCESS) { DPRINT1("RegUnLoadKeyW() failed (Error %ld)\n", Error); diff --git a/reactos/dll/win32/userenv/setup.c b/reactos/dll/win32/userenv/setup.c index ca422dd5e9f..783d35621c9 100644 --- a/reactos/dll/win32/userenv/setup.c +++ b/reactos/dll/win32/userenv/setup.c @@ -140,22 +140,6 @@ InitializeProfiles(VOID) return FALSE; } - /* Store profiles directory path */ - dwLength = (wcslen (szBuffer) + 1) * sizeof(WCHAR); - Error = RegSetValueExW(hKey, - L"ProfilesDirectory", - 0, - REG_EXPAND_SZ, - (LPBYTE)szBuffer, - dwLength); - if (Error != ERROR_SUCCESS) - { - DPRINT1("Error: %lu\n", Error); - RegCloseKey(hKey); - SetLastError((DWORD)Error); - return FALSE; - } - /* Expand it */ if (!ExpandEnvironmentStringsW(szBuffer, szProfilesPath, @@ -177,15 +161,66 @@ InitializeProfiles(VOID) } } - /* Set 'DefaultUserProfile' value */ - wcscpy(szBuffer, L"Default User"); - if (!AppendSystemPostfix(szBuffer, MAX_PATH)) + /* Store the profiles directory path in the registry */ + dwLength = (wcslen (szBuffer) + 1) * sizeof(WCHAR); + Error = RegSetValueExW(hKey, + L"ProfilesDirectory", + 0, + REG_EXPAND_SZ, + (LPBYTE)szBuffer, + dwLength); + if (Error != ERROR_SUCCESS) { - DPRINT1("AppendSystemPostfix() failed\n", GetLastError()); + DPRINT1("Error: %lu\n", Error); RegCloseKey(hKey); + SetLastError((DWORD)Error); return FALSE; } + /* Set 'DefaultUserProfile' value */ + wcscpy(szBuffer, L"Default User"); + + /* Create Default User profile directory path */ + wcscpy(szProfilePath, szProfilesPath); + wcscat(szProfilePath, L"\\"); + wcscat(szProfilePath, szBuffer); + + /* Attempt default user directory creation */ + if (!CreateDirectoryW (szProfilePath, NULL)) + { + if (GetLastError() != ERROR_ALREADY_EXISTS) + { + DPRINT1("Error: %lu\n", GetLastError()); + RegCloseKey(hKey); + return FALSE; + } + + /* Directory existed, let's try to append the postfix */ + if (!AppendSystemPostfix(szBuffer, MAX_PATH)) + { + DPRINT1("AppendSystemPostfix() failed\n", GetLastError()); + RegCloseKey(hKey); + return FALSE; + } + + /* Create Default User profile directory path again */ + wcscpy(szProfilePath, szProfilesPath); + wcscat(szProfilePath, L"\\"); + wcscat(szProfilePath, szBuffer); + + /* Attempt creation again with appended postfix */ + if (!CreateDirectoryW(szProfilePath, NULL)) + { + if (GetLastError() != ERROR_ALREADY_EXISTS) + { + DPRINT1("Error: %lu\n", GetLastError()); + RegCloseKey(hKey); + return FALSE; + } + } + } + + /* Store the default user profile path in the registry */ dwLength = (wcslen (szBuffer) + 1) * sizeof(WCHAR); Error = RegSetValueExW(hKey, L"DefaultUserProfile", @@ -203,19 +238,6 @@ InitializeProfiles(VOID) RegCloseKey(hKey); - /* Create 'Default User' profile directory */ - wcscpy(szProfilePath, szProfilesPath); - wcscat(szProfilePath, L"\\"); - wcscat(szProfilePath, szBuffer); - if (!CreateDirectoryW (szProfilePath, NULL)) - { - if (GetLastError() != ERROR_ALREADY_EXISTS) - { - DPRINT1("Error: %lu\n", GetLastError()); - return FALSE; - } - } - /* Set current user profile */ SetEnvironmentVariableW(L"USERPROFILE", szProfilePath); @@ -382,10 +404,41 @@ InitializeProfiles(VOID) /* Set 'AllUsersProfile' value */ wcscpy(szBuffer, L"All Users"); - if (!AppendSystemPostfix(szBuffer, MAX_PATH)) + + /* Create 'All Users' profile directory path */ + wcscpy(szProfilePath, szProfilesPath); + wcscat(szProfilePath, L"\\"); + wcscat(szProfilePath, szBuffer); + + /* Attempt 'All Users' directory creation */ + if (!CreateDirectoryW (szProfilePath, NULL)) { - DPRINT1("AppendSystemPostfix() failed\n", GetLastError()); - return FALSE; + if (GetLastError() != ERROR_ALREADY_EXISTS) + { + DPRINT1("Error: %lu\n", GetLastError()); + return FALSE; + } + + /* Directory existed, let's try to append the postfix */ + if (!AppendSystemPostfix(szBuffer, MAX_PATH)) + { + DPRINT1("AppendSystemPostfix() failed\n", GetLastError()); + return FALSE; + } + + /* Attempt again creation with appended postfix */ + wcscpy(szProfilePath, szProfilesPath); + wcscat(szProfilePath, L"\\"); + wcscat(szProfilePath, szBuffer); + + if (!CreateDirectoryW(szProfilePath, NULL)) + { + if (GetLastError() != ERROR_ALREADY_EXISTS) + { + DPRINT1("Error: %lu\n", GetLastError()); + return FALSE; + } + } } Error = RegOpenKeyExW(HKEY_LOCAL_MACHINE, @@ -407,27 +460,14 @@ InitializeProfiles(VOID) REG_SZ, (LPBYTE)szBuffer, dwLength); - if (Error != ERROR_SUCCESS) - { - DPRINT1("Error: %lu\n", Error); - RegCloseKey(hKey); - SetLastError((DWORD)Error); - return FALSE; - } RegCloseKey(hKey); - /* Create 'All Users' profile directory */ - wcscpy(szProfilePath, szProfilesPath); - wcscat(szProfilePath, L"\\"); - wcscat(szProfilePath, szBuffer); - if (!CreateDirectoryW(szProfilePath, NULL)) + if (Error != ERROR_SUCCESS) { - if (GetLastError() != ERROR_ALREADY_EXISTS) - { - DPRINT1("Error: %lu\n", GetLastError()); - return FALSE; - } + DPRINT1("Error: %lu\n", Error); + SetLastError((DWORD)Error); + return FALSE; } /* Set 'All Users' profile */ From ac293dd5d64a85c5365631b442a7088728a77a97 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Wed, 5 May 2010 22:53:01 +0000 Subject: [PATCH 125/131] [FORMATTING] No code changes. svn path=/trunk/; revision=47107 --- reactos/dll/win32/userenv/environment.c | 634 ++++++++++++------------ 1 file changed, 318 insertions(+), 316 deletions(-) diff --git a/reactos/dll/win32/userenv/environment.c b/reactos/dll/win32/userenv/environment.c index 16f1acb4053..16754d46408 100644 --- a/reactos/dll/win32/userenv/environment.c +++ b/reactos/dll/win32/userenv/environment.c @@ -32,394 +32,396 @@ static BOOL -SetUserEnvironmentVariable (LPVOID *Environment, - LPWSTR lpName, - LPWSTR lpValue, - BOOL bExpand) +SetUserEnvironmentVariable(LPVOID *Environment, + LPWSTR lpName, + LPWSTR lpValue, + BOOL bExpand) { - WCHAR ShortName[MAX_PATH]; - UNICODE_STRING Name; - UNICODE_STRING SrcValue; - UNICODE_STRING DstValue; - ULONG Length; - NTSTATUS Status; - PVOID Buffer=NULL; + WCHAR ShortName[MAX_PATH]; + UNICODE_STRING Name; + UNICODE_STRING SrcValue; + UNICODE_STRING DstValue; + ULONG Length; + NTSTATUS Status; + PVOID Buffer = NULL; - if (bExpand) - { - RtlInitUnicodeString(&SrcValue, - lpValue); - - Length = 2 * MAX_PATH * sizeof(WCHAR); - - DstValue.Length = 0; - DstValue.MaximumLength = Length; - DstValue.Buffer = Buffer = LocalAlloc(LPTR, - Length); - - if (DstValue.Buffer == NULL) - { - DPRINT1("LocalAlloc() failed\n"); - return FALSE; - } - - Status = RtlExpandEnvironmentStrings_U((PWSTR)*Environment, - &SrcValue, - &DstValue, - &Length); - if (!NT_SUCCESS(Status)) - { - DPRINT1("RtlExpandEnvironmentStrings_U() failed (Status %lx)\n", Status); - DPRINT1("Length %lu\n", Length); - if (Buffer) LocalFree(Buffer); - return FALSE; - } - } - else - { - RtlInitUnicodeString(&DstValue, - lpValue); - } - - if (!_wcsicmp (lpName, L"temp") || !_wcsicmp (lpName, L"tmp")) - { - if (!GetShortPathNameW(DstValue.Buffer, ShortName, MAX_PATH)) - { - DPRINT1("GetShortPathNameW() failed for %S (Error %lu)\n", DstValue.Buffer, GetLastError()); - if (Buffer) LocalFree(Buffer); - return FALSE; - } - - DPRINT("Buffer: %S\n", ShortName); - RtlInitUnicodeString(&DstValue, - ShortName); - } - - RtlInitUnicodeString(&Name, - lpName); - - DPRINT("Value: %wZ\n", &DstValue); - - Status = RtlSetEnvironmentVariable((PWSTR*)Environment, - &Name, - &DstValue); - - if (Buffer) LocalFree(Buffer); - - if (!NT_SUCCESS(Status)) + if (bExpand) { - DPRINT1("RtlSetEnvironmentVariable() failed (Status %lx)\n", Status); - return FALSE; + RtlInitUnicodeString(&SrcValue, + lpValue); + + Length = 2 * MAX_PATH * sizeof(WCHAR); + + DstValue.Length = 0; + DstValue.MaximumLength = Length; + DstValue.Buffer = Buffer = LocalAlloc(LPTR, + Length); + if (DstValue.Buffer == NULL) + { + DPRINT1("LocalAlloc() failed\n"); + return FALSE; + } + + Status = RtlExpandEnvironmentStrings_U((PWSTR)*Environment, + &SrcValue, + &DstValue, + &Length); + if (!NT_SUCCESS(Status)) + { + DPRINT1("RtlExpandEnvironmentStrings_U() failed (Status %lx)\n", Status); + DPRINT1("Length %lu\n", Length); + if (Buffer) + LocalFree(Buffer); + return FALSE; + } + } + else + { + RtlInitUnicodeString(&DstValue, + lpValue); } - return TRUE; + if (!_wcsicmp(lpName, L"temp") || !_wcsicmp(lpName, L"tmp")) + { + if (!GetShortPathNameW(DstValue.Buffer, ShortName, MAX_PATH)) + { + DPRINT1("GetShortPathNameW() failed for %S (Error %lu)\n", DstValue.Buffer, GetLastError()); + if (Buffer) + LocalFree(Buffer); + return FALSE; + } + + DPRINT("Buffer: %S\n", ShortName); + RtlInitUnicodeString(&DstValue, + ShortName); + } + + RtlInitUnicodeString(&Name, + lpName); + + DPRINT("Value: %wZ\n", &DstValue); + + Status = RtlSetEnvironmentVariable((PWSTR*)Environment, + &Name, + &DstValue); + + if (Buffer) + LocalFree(Buffer); + + if (!NT_SUCCESS(Status)) + { + DPRINT1("RtlSetEnvironmentVariable() failed (Status %lx)\n", Status); + return FALSE; + } + + return TRUE; } static BOOL -AppendUserEnvironmentVariable (LPVOID *Environment, - LPWSTR lpName, - LPWSTR lpValue) +AppendUserEnvironmentVariable(LPVOID *Environment, + LPWSTR lpName, + LPWSTR lpValue) { - UNICODE_STRING Name; - UNICODE_STRING Value; - NTSTATUS Status; + UNICODE_STRING Name; + UNICODE_STRING Value; + NTSTATUS Status; - RtlInitUnicodeString (&Name, - lpName); + RtlInitUnicodeString(&Name, + lpName); - Value.Length = 0; - Value.MaximumLength = 1024 * sizeof(WCHAR); - Value.Buffer = LocalAlloc (LPTR, - 1024 * sizeof(WCHAR)); - if (Value.Buffer == NULL) + Value.Length = 0; + Value.MaximumLength = 1024 * sizeof(WCHAR); + Value.Buffer = LocalAlloc(LPTR, + 1024 * sizeof(WCHAR)); + if (Value.Buffer == NULL) { - return FALSE; + return FALSE; } - Value.Buffer[0] = UNICODE_NULL; + Value.Buffer[0] = UNICODE_NULL; - Status = RtlQueryEnvironmentVariable_U ((PWSTR)*Environment, - &Name, - &Value); - if (NT_SUCCESS(Status)) + Status = RtlQueryEnvironmentVariable_U((PWSTR)*Environment, + &Name, + &Value); + if (NT_SUCCESS(Status)) { - RtlAppendUnicodeToString (&Value, - L";"); + RtlAppendUnicodeToString(&Value, + L";"); } - RtlAppendUnicodeToString (&Value, - lpValue); + RtlAppendUnicodeToString(&Value, + lpValue); - Status = RtlSetEnvironmentVariable ((PWSTR*)Environment, - &Name, - &Value); - LocalFree (Value.Buffer); - if (!NT_SUCCESS(Status)) + Status = RtlSetEnvironmentVariable((PWSTR*)Environment, + &Name, + &Value); + LocalFree(Value.Buffer); + if (!NT_SUCCESS(Status)) { - DPRINT1 ("RtlSetEnvironmentVariable() failed (Status %lx)\n", Status); - return FALSE; + DPRINT1("RtlSetEnvironmentVariable() failed (Status %lx)\n", Status); + return FALSE; } - return TRUE; + return TRUE; } static HKEY -GetCurrentUserKey (HANDLE hToken) +GetCurrentUserKey(HANDLE hToken) { - UNICODE_STRING SidString; - HKEY hKey; - LONG Error; + UNICODE_STRING SidString; + HKEY hKey; + LONG Error; - if (!GetUserSidFromToken (hToken, - &SidString)) + if (!GetUserSidFromToken(hToken, + &SidString)) { - DPRINT1 ("GetUserSidFromToken() failed\n"); - return NULL; + DPRINT1("GetUserSidFromToken() failed\n"); + return NULL; } - Error = RegOpenKeyExW (HKEY_USERS, - SidString.Buffer, - 0, - MAXIMUM_ALLOWED, - &hKey); - if (Error != ERROR_SUCCESS) + Error = RegOpenKeyExW(HKEY_USERS, + SidString.Buffer, + 0, + MAXIMUM_ALLOWED, + &hKey); + if (Error != ERROR_SUCCESS) { - DPRINT1 ("RegOpenKeyExW() failed (Error %ld)\n", Error); - RtlFreeUnicodeString (&SidString); - SetLastError((DWORD)Error); - return NULL; + DPRINT1("RegOpenKeyExW() failed (Error %ld)\n", Error); + RtlFreeUnicodeString(&SidString); + SetLastError((DWORD)Error); + return NULL; } - RtlFreeUnicodeString (&SidString); + RtlFreeUnicodeString(&SidString); - return hKey; + return hKey; } static BOOL -SetUserEnvironment (LPVOID *lpEnvironment, - HKEY hKey, - LPWSTR lpSubKeyName) +SetUserEnvironment(LPVOID *lpEnvironment, + HKEY hKey, + LPWSTR lpSubKeyName) { - HKEY hEnvKey; - DWORD dwValues; - DWORD dwMaxValueNameLength; - DWORD dwMaxValueDataLength; - DWORD dwValueNameLength; - DWORD dwValueDataLength; - DWORD dwType; - DWORD i; - LPWSTR lpValueName; - LPWSTR lpValueData; - LONG Error; + HKEY hEnvKey; + DWORD dwValues; + DWORD dwMaxValueNameLength; + DWORD dwMaxValueDataLength; + DWORD dwValueNameLength; + DWORD dwValueDataLength; + DWORD dwType; + DWORD i; + LPWSTR lpValueName; + LPWSTR lpValueData; + LONG Error; - Error = RegOpenKeyExW (hKey, - lpSubKeyName, - 0, - KEY_QUERY_VALUE, - &hEnvKey); - if (Error != ERROR_SUCCESS) + Error = RegOpenKeyExW(hKey, + lpSubKeyName, + 0, + KEY_QUERY_VALUE, + &hEnvKey); + if (Error != ERROR_SUCCESS) { - DPRINT1 ("RegOpenKeyExW() failed (Error %ld)\n", Error); - SetLastError((DWORD)Error); - return FALSE; + DPRINT1("RegOpenKeyExW() failed (Error %ld)\n", Error); + SetLastError((DWORD)Error); + return FALSE; } - Error = RegQueryInfoKey (hEnvKey, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - &dwValues, - &dwMaxValueNameLength, - &dwMaxValueDataLength, - NULL, - NULL); - if (Error != ERROR_SUCCESS) + Error = RegQueryInfoKey(hEnvKey, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + &dwValues, + &dwMaxValueNameLength, + &dwMaxValueDataLength, + NULL, + NULL); + if (Error != ERROR_SUCCESS) { - DPRINT1 ("RegQueryInforKey() failed (Error %ld)\n", Error); - RegCloseKey (hEnvKey); - SetLastError((DWORD)Error); - return FALSE; + DPRINT1("RegQueryInforKey() failed (Error %ld)\n", Error); + RegCloseKey(hEnvKey); + SetLastError((DWORD)Error); + return FALSE; } - if (dwValues == 0) + if (dwValues == 0) { - RegCloseKey (hEnvKey); - return TRUE; + RegCloseKey(hEnvKey); + return TRUE; } - /* Allocate buffers */ - lpValueName = LocalAlloc (LPTR, - dwMaxValueNameLength * sizeof(WCHAR)); - if (lpValueName == NULL) + /* Allocate buffers */ + lpValueName = LocalAlloc(LPTR, + dwMaxValueNameLength * sizeof(WCHAR)); + if (lpValueName == NULL) { - RegCloseKey (hEnvKey); - return FALSE; + RegCloseKey(hEnvKey); + return FALSE; } - lpValueData = LocalAlloc (LPTR, - dwMaxValueDataLength); - if (lpValueData == NULL) + lpValueData = LocalAlloc(LPTR, + dwMaxValueDataLength); + if (lpValueData == NULL) { - LocalFree (lpValueName); - RegCloseKey (hEnvKey); - return FALSE; + LocalFree(lpValueName); + RegCloseKey(hEnvKey); + return FALSE; } - /* Enumerate values */ - for (i = 0; i < dwValues; i++) + /* Enumerate values */ + for (i = 0; i < dwValues; i++) { - dwValueNameLength = dwMaxValueNameLength; - dwValueDataLength = dwMaxValueDataLength; - RegEnumValueW (hEnvKey, - i, - lpValueName, - &dwValueNameLength, - NULL, - &dwType, - (LPBYTE)lpValueData, - &dwValueDataLength); + dwValueNameLength = dwMaxValueNameLength; + dwValueDataLength = dwMaxValueDataLength; + RegEnumValueW(hEnvKey, + i, + lpValueName, + &dwValueNameLength, + NULL, + &dwType, + (LPBYTE)lpValueData, + &dwValueDataLength); - if (!_wcsicmp (lpValueName, L"path")) - { - /* Append 'Path' environment variable */ - AppendUserEnvironmentVariable (lpEnvironment, - lpValueName, - lpValueData); - } - else - { - /* Set environment variable */ - SetUserEnvironmentVariable (lpEnvironment, - lpValueName, - lpValueData, - (dwType == REG_EXPAND_SZ)); - } + if (!_wcsicmp (lpValueName, L"path")) + { + /* Append 'Path' environment variable */ + AppendUserEnvironmentVariable(lpEnvironment, + lpValueName, + lpValueData); + } + else + { + /* Set environment variable */ + SetUserEnvironmentVariable(lpEnvironment, + lpValueName, + lpValueData, + (dwType == REG_EXPAND_SZ)); + } } - LocalFree (lpValueData); - LocalFree (lpValueName); - RegCloseKey (hEnvKey); + LocalFree(lpValueData); + LocalFree(lpValueName); + RegCloseKey(hEnvKey); - return TRUE; -} - - -BOOL WINAPI -CreateEnvironmentBlock (LPVOID *lpEnvironment, - HANDLE hToken, - BOOL bInherit) -{ - WCHAR Buffer[MAX_PATH]; - DWORD Length; - HKEY hKeyUser; - NTSTATUS Status; - - DPRINT("CreateEnvironmentBlock() called\n"); - - if (lpEnvironment == NULL) - { - SetLastError(ERROR_INVALID_PARAMETER); - return FALSE; - } - - Status = RtlCreateEnvironment ((BOOLEAN)bInherit, - (PWSTR*)lpEnvironment); - if (!NT_SUCCESS (Status)) - { - DPRINT1 ("RtlCreateEnvironment() failed (Status %lx)\n", Status); - SetLastError (RtlNtStatusToDosError (Status)); - return FALSE; - } - - /* Set 'COMPUTERNAME' variable */ - Length = MAX_PATH; - if (GetComputerNameW (Buffer, - &Length)) - { - SetUserEnvironmentVariable(lpEnvironment, - L"COMPUTERNAME", - Buffer, - FALSE); - } - - if (hToken == NULL) return TRUE; - - hKeyUser = GetCurrentUserKey (hToken); - if (hKeyUser == NULL) - { - DPRINT1 ("GetCurrentUserKey() failed\n"); - RtlDestroyEnvironment (*lpEnvironment); - return FALSE; - } - - /* Set 'ALLUSERSPROFILE' variable */ - Length = MAX_PATH; - if (GetAllUsersProfileDirectoryW (Buffer, - &Length)) - { - SetUserEnvironmentVariable(lpEnvironment, - L"ALLUSERSPROFILE", - Buffer, - FALSE); - } - - /* Set 'USERPROFILE' variable */ - Length = MAX_PATH; - if (GetUserProfileDirectoryW (hToken, - Buffer, - &Length)) - { - SetUserEnvironmentVariable(lpEnvironment, - L"USERPROFILE", - Buffer, - FALSE); - } - - /* FIXME: Set 'USERDOMAIN' variable */ - - Length = MAX_PATH; - if (GetUserNameW(Buffer, - &Length)) - { - SetUserEnvironmentVariable(lpEnvironment, - L"USERNAME", - Buffer, - FALSE); - } - - - - /* Set user environment variables */ - SetUserEnvironment (lpEnvironment, - hKeyUser, - L"Environment"); - - RegCloseKey (hKeyUser); - - return TRUE; } BOOL WINAPI -DestroyEnvironmentBlock (LPVOID lpEnvironment) +CreateEnvironmentBlock(LPVOID *lpEnvironment, + HANDLE hToken, + BOOL bInherit) { - DPRINT ("DestroyEnvironmentBlock() called\n"); + WCHAR Buffer[MAX_PATH]; + DWORD Length; + HKEY hKeyUser; + NTSTATUS Status; - if (lpEnvironment == NULL) + DPRINT("CreateEnvironmentBlock() called\n"); + + if (lpEnvironment == NULL) { - SetLastError(ERROR_INVALID_PARAMETER); - return FALSE; + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; } - RtlDestroyEnvironment (lpEnvironment); + Status = RtlCreateEnvironment((BOOLEAN)bInherit, + (PWSTR*)lpEnvironment); + if (!NT_SUCCESS (Status)) + { + DPRINT1("RtlCreateEnvironment() failed (Status %lx)\n", Status); + SetLastError(RtlNtStatusToDosError(Status)); + return FALSE; + } - return TRUE; + /* Set 'COMPUTERNAME' variable */ + Length = MAX_PATH; + if (GetComputerNameW(Buffer, + &Length)) + { + SetUserEnvironmentVariable(lpEnvironment, + L"COMPUTERNAME", + Buffer, + FALSE); + } + + if (hToken == NULL) + return TRUE; + + hKeyUser = GetCurrentUserKey(hToken); + if (hKeyUser == NULL) + { + DPRINT1("GetCurrentUserKey() failed\n"); + RtlDestroyEnvironment(*lpEnvironment); + return FALSE; + } + + /* Set 'ALLUSERSPROFILE' variable */ + Length = MAX_PATH; + if (GetAllUsersProfileDirectoryW(Buffer, + &Length)) + { + SetUserEnvironmentVariable(lpEnvironment, + L"ALLUSERSPROFILE", + Buffer, + FALSE); + } + + /* Set 'USERPROFILE' variable */ + Length = MAX_PATH; + if (GetUserProfileDirectoryW(hToken, + Buffer, + &Length)) + { + SetUserEnvironmentVariable(lpEnvironment, + L"USERPROFILE", + Buffer, + FALSE); + } + + /* FIXME: Set 'USERDOMAIN' variable */ + + Length = MAX_PATH; + if (GetUserNameW(Buffer, + &Length)) + { + SetUserEnvironmentVariable(lpEnvironment, + L"USERNAME", + Buffer, + FALSE); + } + + + + /* Set user environment variables */ + SetUserEnvironment(lpEnvironment, + hKeyUser, + L"Environment"); + + RegCloseKey(hKeyUser); + + return TRUE; +} + + +BOOL WINAPI +DestroyEnvironmentBlock(LPVOID lpEnvironment) +{ + DPRINT("DestroyEnvironmentBlock() called\n"); + + if (lpEnvironment == NULL) + { + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } + + RtlDestroyEnvironment(lpEnvironment); + + return TRUE; } From 8481a4f1b9f093323eca15e748112e5ba42910f9 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Wed, 5 May 2010 23:06:32 +0000 Subject: [PATCH 126/131] [NTOSKRNL] - Implement Ke386IoSetAccessProcess, Ke386SetIoAccessMap, and Ke386QueryIoAccessMap [NDK] - Add definition of KIO_ACCESS_MAP - Patch by Samuel Serapion - Fixes bug 2641 svn path=/trunk/; revision=47108 --- reactos/include/ndk/i386/ketypes.h | 4 ++ reactos/ntoskrnl/ke/i386/v86vdm.c | 78 ++++++++++++++++++++++++------ 2 files changed, 68 insertions(+), 14 deletions(-) diff --git a/reactos/include/ndk/i386/ketypes.h b/reactos/include/ndk/i386/ketypes.h index f90a39e0a12..0f5557ee1f6 100644 --- a/reactos/include/ndk/i386/ketypes.h +++ b/reactos/include/ndk/i386/ketypes.h @@ -151,6 +151,10 @@ Author: (USHORT)(sizeof(KTSS)) : \ (USHORT)(FIELD_OFFSET(KTSS, IoMaps[MapNumber-1].IoMap)) +typedef UCHAR KIO_ACCESS_MAP[IOPM_SIZE]; + +typedef KIO_ACCESS_MAP *PKIO_ACCESS_MAP; + // // Size of the XMM register save area in the FXSAVE format // diff --git a/reactos/ntoskrnl/ke/i386/v86vdm.c b/reactos/ntoskrnl/ke/i386/v86vdm.c index 2d1ff017f14..4903d3ea5f8 100644 --- a/reactos/ntoskrnl/ke/i386/v86vdm.c +++ b/reactos/ntoskrnl/ke/i386/v86vdm.c @@ -659,37 +659,87 @@ Ke386CallBios(IN ULONG Int, } /* - * @unimplemented + * @implemented */ BOOLEAN NTAPI Ke386IoSetAccessProcess(IN PKPROCESS Process, - IN ULONG Flag) + IN ULONG MapNumber) { - UNIMPLEMENTED; - return FALSE; + USHORT MapOffset; + PKPRCB Prcb; + KAFFINITY TargetProcessors; + + if(MapNumber > IOPM_COUNT) + return FALSE; + + MapOffset = KiComputeIopmOffset(MapNumber); + + Process->IopmOffset = MapOffset; + + TargetProcessors = Process->ActiveProcessors; + Prcb = KeGetCurrentPrcb(); + if (TargetProcessors & Prcb->SetMember) + KeGetPcr()->TSS->IoMapBase = MapOffset; + + return TRUE; } /* - * @unimplemented + * @implemented */ BOOLEAN NTAPI -Ke386SetIoAccessMap(IN ULONG Flag, - IN PVOID IopmBuffer) +Ke386SetIoAccessMap(IN ULONG MapNumber, + IN PKIO_ACCESS_MAP IopmBuffer) { - UNIMPLEMENTED; - return FALSE; + PKPROCESS CurrentProcess; + PKPRCB Prcb; + PVOID pt; + + if ((MapNumber > IOPM_COUNT) || (MapNumber == IO_ACCESS_MAP_NONE)) + return FALSE; + + Prcb = KeGetCurrentPrcb(); + + // Copy the IOP map and load the map for the current process. + pt = &(KeGetPcr()->TSS->IoMaps[MapNumber-1].IoMap); + RtlMoveMemory(pt, (PVOID)IopmBuffer, IOPM_SIZE); + CurrentProcess = Prcb->CurrentThread->ApcState.Process; + KeGetPcr()->TSS->IoMapBase = CurrentProcess->IopmOffset; + + return TRUE; } /* - * @unimplemented + * @implemented */ BOOLEAN NTAPI -Ke386QueryIoAccessMap(IN ULONG Flag, - IN PVOID IopmBuffer) +Ke386QueryIoAccessMap(IN ULONG MapNumber, + IN PKIO_ACCESS_MAP IopmBuffer) { - UNIMPLEMENTED; - return FALSE; + ULONG i; + PVOID Map; + PUCHAR p; + + if (MapNumber > IOPM_COUNT) + return FALSE; + + if (MapNumber == IO_ACCESS_MAP_NONE) + { + // no access, simply return a map of all 1s + p = (PUCHAR)IopmBuffer; + for (i = 0; i < IOPM_SIZE; i++) { + p[i] = (UCHAR)-1; + } + } + else + { + // copy the bits + Map = (PVOID)&(KeGetPcr()->TSS->IoMaps[MapNumber-1].IoMap); + RtlMoveMemory((PVOID)IopmBuffer, Map, IOPM_SIZE); + } + + return TRUE; } From a9e356ef1d8cd1fcbaa86ac5b125d59add73c128 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Wed, 5 May 2010 23:16:17 +0000 Subject: [PATCH 127/131] [VIDEOPRT] - Also check for the BASEVIDEO option set and return true in that case also - Fixes a bug with boot time (F8) options on my WC svn path=/trunk/; revision=47109 --- reactos/drivers/video/videoprt/videoprt.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/reactos/drivers/video/videoprt/videoprt.c b/reactos/drivers/video/videoprt/videoprt.c index 33c6fedc7f8..ad22d6a36fb 100644 --- a/reactos/drivers/video/videoprt/videoprt.c +++ b/reactos/drivers/video/videoprt/videoprt.c @@ -1523,8 +1523,9 @@ VideoPortIsNoVesa(VOID) return FALSE; } - /* Check if NOVESA is present in the start options */ - if (wcsstr((PWCHAR)KeyInfo->Data, L"NOVESA")) + /* Check if NOVESA or BASEVIDEO is present in the start options */ + if (wcsstr((PWCHAR)KeyInfo->Data, L"NOVESA") || + wcsstr((PWCHAR)KeyInfo->Data, L"BASEVIDEO")) { VideoPortDebugPrint(Info, "VESA mode disabled\n"); ExFreePool(KeyInfo); From 6b6c1373416e739b09df0248aeb636c5b8ca3185 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Thu, 6 May 2010 01:45:10 +0000 Subject: [PATCH 128/131] [NTOSKRNL] - Don't enable the kernel debugger if the DEBUG option was not set - Fixes displaying the BSOD when not booting in debug mode (broken in r41534) svn path=/trunk/; revision=47110 --- reactos/ntoskrnl/kd/kdinit.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/reactos/ntoskrnl/kd/kdinit.c b/reactos/ntoskrnl/kd/kdinit.c index aae380e922a..6c5f240761b 100644 --- a/reactos/ntoskrnl/kd/kdinit.c +++ b/reactos/ntoskrnl/kd/kdinit.c @@ -171,15 +171,14 @@ KdInitSystem(ULONG BootPhase, { /* Enable on the serial port */ KdDebuggerEnabled = TRUE; + KdDebuggerNotPresent = FALSE; KdpDebugMode.Serial = TRUE; - } #ifdef KDBG - /* Get the KDBG Settings and enable it */ - KdDebuggerEnabled = TRUE; - KdDebuggerNotPresent = FALSE; - KdbpGetCommandLineSettings(LoaderBlock->LoadOptions); + /* Get the KDBG Settings */ + KdbpGetCommandLineSettings(LoaderBlock->LoadOptions); #endif + } /* Get the port and baud rate */ Port = strstr(CommandLine, "DEBUGPORT"); From 50367b3daca6e78bdbd77b331fb8c4faebde66d3 Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Thu, 6 May 2010 09:44:59 +0000 Subject: [PATCH 129/131] [ADVAPI32] - Katayama Hirofumi: Create GUID instead of hardcoding to 0 every time. See issue #5364 for more details. svn path=/trunk/; revision=47111 --- reactos/dll/win32/advapi32/misc/hwprofiles.c | 24 +++++++++++++------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/reactos/dll/win32/advapi32/misc/hwprofiles.c b/reactos/dll/win32/advapi32/misc/hwprofiles.c index f3ac824710d..6bfc08b0df0 100644 --- a/reactos/dll/win32/advapi32/misc/hwprofiles.c +++ b/reactos/dll/win32/advapi32/misc/hwprofiles.c @@ -1,15 +1,14 @@ -/* $Id$ - * +/* * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries - * FILE: lib/advapi32/misc/hwprofiles.c + * FILE: dll/win32/advapi32/misc/hwprofiles.c * PURPOSE: advapi32.dll Hardware Functions * PROGRAMMER: Steven Edwards - * UPDATE HISTORY: - * 20042502 + * Eric Kohl */ #include +#include #include WINE_DEFAULT_DEBUG_CHANNEL(advapi); @@ -91,6 +90,7 @@ GetCurrentHwProfileW(LPHW_PROFILE_INFOW lpHwProfileInfo) HKEY hProfileKey; DWORD dwLength; DWORD dwConfigId; + UUID uuid; TRACE("GetCurrentHwProfileW() called\n"); @@ -158,9 +158,17 @@ GetCurrentHwProfileW(LPHW_PROFILE_INFOW lpHwProfileInfo) (LPBYTE)&lpHwProfileInfo->szHwProfileGuid, &dwLength)) { - /* FIXME: Create a new GUID */ - wcscpy(lpHwProfileInfo->szHwProfileGuid, - L"{00000000-0000-0000-0000-000000000000}"); + /* Create a new GUID */ + UuidCreate(&uuid); + swprintf( + lpHwProfileInfo->szHwProfileGuid, + L"{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}", + uuid.Data1, + uuid.Data2, + uuid.Data3, + uuid.Data4[0], uuid.Data4[1], + uuid.Data4[2], uuid.Data4[3], uuid.Data4[4], uuid.Data4[5], + uuid.Data4[6], uuid.Data4[7]); dwLength = (wcslen(lpHwProfileInfo->szHwProfileGuid) + 1) * sizeof(WCHAR); RegSetValueExW(hProfileKey, From c47421927ed5a696b87dcaa513b4cea2de7063ca Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Thu, 6 May 2010 10:09:33 +0000 Subject: [PATCH 130/131] [ADVAPI32] - Katayama Hirofumi: Use a real computer name instead of an empty string when reporting events in ReportEventA and W. See issue #5358 for more details. svn path=/trunk/; revision=47112 --- reactos/dll/win32/advapi32/service/eventlog.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/reactos/dll/win32/advapi32/service/eventlog.c b/reactos/dll/win32/advapi32/service/eventlog.c index 8cb4b22664e..b8a35a639b3 100644 --- a/reactos/dll/win32/advapi32/service/eventlog.c +++ b/reactos/dll/win32/advapi32/service/eventlog.c @@ -945,6 +945,8 @@ ReportEventA(IN HANDLE hEventLog, ANSI_STRING *Strings; ANSI_STRING ComputerName; WORD i; + CHAR szComputerName[MAX_COMPUTERNAME_LENGTH + 1]; + DWORD dwSize; TRACE("%p, %u, %u, %lu, %p, %u, %lu, %p, %p\n", hEventLog, wType, wCategory, dwEventID, lpUserSid, @@ -962,8 +964,9 @@ ReportEventA(IN HANDLE hEventLog, for (i = 0; i < wNumStrings; i++) RtlInitAnsiString(&Strings[i], lpStrings[i]); - /*FIXME: ComputerName */ - RtlInitAnsiString(&ComputerName, ""); + dwSize = MAX_COMPUTERNAME_LENGTH + 1; + GetComputerNameA(szComputerName, &dwSize); + RtlInitAnsiString(&ComputerName, szComputerName); RpcTryExcept { @@ -1029,6 +1032,8 @@ ReportEventW(IN HANDLE hEventLog, UNICODE_STRING *Strings; UNICODE_STRING ComputerName; WORD i; + WCHAR szComputerName[MAX_COMPUTERNAME_LENGTH + 1]; + DWORD dwSize; TRACE("%p, %u, %u, %lu, %p, %u, %lu, %p, %p\n", hEventLog, wType, wCategory, dwEventID, lpUserSid, @@ -1046,8 +1051,9 @@ ReportEventW(IN HANDLE hEventLog, for (i = 0; i < wNumStrings; i++) RtlInitUnicodeString(&Strings[i], lpStrings[i]); - /*FIXME: ComputerName */ - RtlInitUnicodeString(&ComputerName, L""); + dwSize = MAX_COMPUTERNAME_LENGTH + 1; + GetComputerNameW(szComputerName, &dwSize); + RtlInitUnicodeString(&ComputerName, szComputerName); RpcTryExcept { From a2464ecca726930038fbe59f8788960aabea283e Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Thu, 6 May 2010 10:50:26 +0000 Subject: [PATCH 131/131] [KERNEL32] - Code committed in revision 846 was lazily initializing command line options with a first call to GetCommandLine. However, this is not really thread-safe. Move initialization to DLL_PROCESS_ATTACH, where it should actually happen. See issue #5347 for more details. svn path=/trunk/; revision=47113 --- reactos/dll/win32/kernel32/include/kernel32.h | 4 ++++ reactos/dll/win32/kernel32/misc/dllmain.c | 3 +++ reactos/dll/win32/kernel32/process/cmdline.c | 20 +++---------------- 3 files changed, 10 insertions(+), 17 deletions(-) diff --git a/reactos/dll/win32/kernel32/include/kernel32.h b/reactos/dll/win32/kernel32/include/kernel32.h index 60056f111f7..19731210435 100755 --- a/reactos/dll/win32/kernel32/include/kernel32.h +++ b/reactos/dll/win32/kernel32/include/kernel32.h @@ -190,3 +190,7 @@ IntGetCodePageEntry(UINT CodePage); LPWSTR GetDllLoadPath(LPCWSTR lpModule); + +VOID +WINAPI +InitCommandLines(VOID); diff --git a/reactos/dll/win32/kernel32/misc/dllmain.c b/reactos/dll/win32/kernel32/misc/dllmain.c index 02199f9349d..ef47c4d538f 100644 --- a/reactos/dll/win32/kernel32/misc/dllmain.c +++ b/reactos/dll/win32/kernel32/misc/dllmain.c @@ -330,6 +330,9 @@ DllMain(HANDLE hDll, wcscpy(SystemDirectory.Buffer, WindowsDirectory.Buffer); wcscat(SystemDirectory.Buffer, L"\\System32"); + /* Initialize command line */ + InitCommandLines(); + /* Open object base directory */ Status = OpenBaseDirectory(&hBaseDir); if (!NT_SUCCESS(Status)) diff --git a/reactos/dll/win32/kernel32/process/cmdline.c b/reactos/dll/win32/kernel32/process/cmdline.c index 9b84ab92a74..2c2b2421966 100644 --- a/reactos/dll/win32/kernel32/process/cmdline.c +++ b/reactos/dll/win32/kernel32/process/cmdline.c @@ -27,19 +27,17 @@ static BOOL bCommandLineInitialized = FALSE; /* FUNCTIONS ****************************************************************/ -static VOID +WINAPI InitCommandLines(VOID) { PRTL_USER_PROCESS_PARAMETERS Params; - /* FIXME - not thread-safe! */ - - // get command line + /* get command line */ Params = NtCurrentPeb()->ProcessParameters; RtlNormalizeProcessParams (Params); - // initialize command line buffers + /* initialize command line buffers */ CommandLineStringW.Length = Params->CommandLine.Length; CommandLineStringW.MaximumLength = CommandLineStringW.Length + sizeof(WCHAR); CommandLineStringW.Buffer = RtlAllocateHeap(GetProcessHeap(), @@ -80,13 +78,7 @@ LPSTR WINAPI GetCommandLineA(VOID) { - if (bCommandLineInitialized == FALSE) - { - InitCommandLines(); - } - DPRINT("CommandLine \'%s\'\n", CommandLineStringA.Buffer); - return CommandLineStringA.Buffer; } @@ -98,13 +90,7 @@ LPWSTR WINAPI GetCommandLineW(VOID) { - if (bCommandLineInitialized == FALSE) - { - InitCommandLines(); - } - DPRINT("CommandLine \'%S\'\n", CommandLineStringW.Buffer); - return CommandLineStringW.Buffer; }